天天看點

網絡爬蟲反爬技術

1.通過動态設定user agent字段設定headers屬性來模拟成浏覽器

 http請求頭中user agent包含了我們使用的浏覽器和作業系統的一些資訊,很多網站通過判斷user agent内容來确定使用者的,是以咱們要動态設定user agent,來假裝自己是很多使用者。主要有如下兩種方法:

  • 使用build_opener()修改報頭(由于urlopen()不支援一些HTTP的進階功能如驗證、cookie等),是以要修改報頭可以使用urllib.request.build_opener()進行,代碼示例如下:

       import urllib.request

       url="http:blog.csdn.net/weiwei_pig/article/details/51178226"

       headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0")

       #headers存儲對應的User-Agent資訊,格式即("User-Agent":具體資訊)

       opener=urllib.request.build_opener()#建立自定義的opener對象并賦給變量opener

       opener.addheaders=[headers]#設定對應的頭資訊,設定格式即:“opener對象名.addheaders=[頭資訊]”

           #注意是addheaders末尾有s

       data=opener.open(url).read()#打開具有頭資訊的url

  • 使用add_header()添加報頭即使用urllib.request.Request()下的add_header() 代碼執行個體如下:

      import urllib.request

      url="http:blog.csdn.net/weiwei_pig/article/details/51178226"

      req=urllib.request.Request(url) #建立一個Request對象賦給變量req

      req.add_header('User-Agent',"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0")#用add_header()方法添加標頭資訊,格式即Requestdui'xiang'm,注意末尾無s,是add_header()

      data=urllib.request.urlopen(req).read()#打開Request對象即可打開對應網址并讀取網頁内容賦給data變量

2.以下為scrapy中常用的反爬技術

  1. 禁用cookie,(禁用本地cookie讓對方網站無法識别出我們的會話消息)即,在setting.py中下句的注釋去掉即可
    COOKIES_ENABLED=False           
  2. 設定下載下傳延遲(有的網站會通過我們對網頁的通路頻率進行分析若爬去頻率過快,則判斷為爬蟲自動爬去行為),是以可以控制下爬蟲時間間隔,即在對應scrapy中的setting.py中解除下句的注釋:

    DOWNLOAD_DELAY=2  #2代表下載下傳間隔2秒

  3. 使用IP池(有的網站會對使用者ip檢測,若同一個ip對伺服器上的網頁進行大量爬取,可以被識别為網絡爬蟲的額自動爬去行為,會封禁該IP,因為ip資源有限)比如可以使用不同的代理伺服器獲得不同的ip組成一個ip池,對于scrapy而言,我們需要為爬蟲項目建立一個下載下傳中間件,在下載下傳中間件中設定好IP選擇規則,在setting.py中配置好下載下傳中間件并配置好IP池,具體執行個體如下:
  •    先在項目核心目錄下建立下載下傳中間件檔案,檔案名自定義,比如:

        D:\python3.5\myweb\part12\myfirstpjt>cd myfirstpjt\                                   #先找到所在目錄

        D:\python3.5\myweb\part12\myfirstpjt\myfirstpjt>echo  #>middlewares.py           #後面的指令即建立下載下傳中間件檔案,名為middlewares.py

因為需要大量的ip是以可以通過代理伺服器解決,可以通過http://yum.iqianyue.com/proxy 找到代理也可以自己網上搜尋,找到這些代理伺服器的ip資訊後

  •   在setting.py檔案中将這些代理伺服器的IP設定為ip池,即如下所示:

        #IP池設定

IPPOOL=[{ "ipaddr":"121.33.226.167:3128"},

                 { "ipaddr":"118.187.10.11:80"},

                { "ipaddr":"12.43.56.167:808"},

                { "ipaddr":"21.133.22.16:47800"},

                { "ipaddr":"171.39.26.17:80"}

       ]          #即外層通過清單形式存儲,内部字典形式存儲

  • 設定好ip池後,編寫下載下傳中間件檔案(在scrapy中與代理伺服器相關的下載下傳中間件是HttpProxyMiddleware,同樣在scrapy官方文檔中HttpProxyMiddleware對應的類是

class scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware是以編輯下載下傳中間件檔案時需要導入scrapy.contrib.downloadermiddleware.httpproxy下HttpProxyMiddleware)即如下所示:

#middlewares下載下傳中間件

#導入随機數子產品,目的是随機挑選一個IP池中的IP

import random

#從settings檔案中導入設定好的IPPOOL

from myfirstpjt.settings import IPPOOL

#導入官方文檔中HttpProxyMiddleware對應的子產品

from scrapy.contrib.downloadermiddleware.httpproxy import HttpProxyMiddleware

 class IPPOOLS(HttpProxyMiddleware):

               #初始化方法

                def __init__(self,ip=''):

                        self.ip=ip

               #process_request()方法,主要進行請求處理

               def process_request(self,request,spider):

                         #先随機選擇一個ip

                         thisip=random.choice(IPPOOL)

                         #輸出目前選擇的ip

                         print ("目前使用的ip是:"+thisip["ipaddr"])

                         #将對應的ip實際添加為具體的代理,用該ip進行爬取

                         request.meta["proxy"]="http://"+thisip["ipaddr"]

 此時即為編輯好了中間件檔案

  • 為了使中間件生效,需要激活下載下傳中間件,,将其加入到

    DOWNLOADER_MIDDLEWARES

    設定中。該設定是一個字典(dict),鍵為中間件類的路徑,值為其中間件的順序(order)。即在setting.py檔案中中間件的配置修改為如下資訊:

DOWNLOADER_MIDDLEWARES={

#'myfirstpjt.middlewares.MyCustomDownloadermiddleware':543

'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware':123

'myfirstpjt.middlewares.IPPOOLS':125

}        #數字越小的中間件越靠近引擎,數字越大的中間件越靠近下載下傳器,格式即"下載下傳中間件所在目錄.下載下傳中間件檔案名.下載下傳中間件内部要使用的類":orders

 由此即可運作爬蟲檔案如:

D:\Python3.5\myweb\part12\myfirstpjt\myfirstpjt> scrapy crawl weisuen --nolog

               4. 使用使用者代理池(網站伺服器識别爬行的使用者代理資訊由此可以判斷出我們是什麼浏覽器以及用戶端)

與ip代理池類似需要收集多種浏覽器的資訊由此建立一個使用者代理池再建立一個下載下傳中間件)即如下:

  • 在setting.py檔案中設定好使用者代理池,如下:

#使用者代理池設定

UAPOOL

=["Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0",

"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"

]

  • 建立一個下載下傳中間件的檔案(注意:ip代理池使用的下載下傳中間件類型為HttpProxyMiddleware,對應的類為class scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware,使用者代理池中間件類型為UserAgentMiddleware,對應的類為class scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware)即如下所示:

  D:\python3.5\myweb\part12\myfirstpjt\myfirstpjt>echo  #>uamid.py  

  •  編輯該中間件檔案,如下所示:

#uamid 下載下傳中間件

import random

from myfirstpjt.settings import UAPOOL

from scrapy.contrib.downloadermiddleware.useragent import UserAgentMiddleware

class Uamid(UserAgentMiddleware):

    def__init__(self,ua=''):

         self.ua=ua

    def process_request(self,request,spider):

        thisua=random.choice(UAPOOL)

        print("目前使用的user-agent是:"+thisua)

        request.headers.setfefault('User-Agent',thisua)

  • 激活代理的下載下傳中間件即在setting.py中設定如下:

      #  Enable or disable downloader middleware

DOWNLOADER_MIDDLEWARES={

#'myfirstpjt.middlewares.MyCustomDownloadermiddleware':543

'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware':2,

'myfirstpjt.uamid.Uamid':1

}

  • 設定好之後就可以運作了

3.除此之外還可以使用谷歌Cache、使用分布式爬行等方式(分布式爬行中常用的是通過scrapinghub旗下的架構進行)

ps:對别人的網站進行爬取的時候需要遵守道德,遵守robots協定

繼續閱讀