1. 程式人生 > >Python Scrapy反爬蟲常見解決方案(包含5種方法)

Python Scrapy反爬蟲常見解決方案(包含5種方法)

ins 都是 可能 自定義 輸入 src stx 用戶 play

爬蟲的本質就是“抓取”第二方網站中有價值的數據,因此,每個網站都會或多或少地采用一些反爬蟲技術來防範爬蟲。比如前面介紹的通過 User-Agent 請求頭驗證是否為瀏覽器、使用 JavaScript 動態加載資源等,這些都是常規的反爬蟲手段。

下面針對更強的反爬蟲技術提供一些解決方案。

IP 地址驗證

有些網站會使用 IP 地址驗證進行反爬蟲處理,程序會檢查客戶端的 IP 地址,如果發現同一個 IP 地址的客戶端頻繁地請求數據, 該網站就會判斷該客戶端是爬蟲程序。

針對這種情況,我們可以讓 Scrapy 不斷地隨機更換代理服務器的 IP 地址,這樣就可以欺騙目標網站了。


為了讓 Scrapy 能隨機更換代理服務器,可以自定義一個下載中間件,讓該下載中間件隨機更換代理服務器即可。

Scrapy 隨機更換代理服務器只要兩步:

    1. 打開 Scrapy 項目下的 middlewares.py 文件,在該文件中增加定義如下類
    2. class RandomProxyMiddleware (object) :
      #動態設置代理服務器的IP 地址
          def process request (self, request, spider):
              # get_random_proxy() 函數隨機返回代理服務器的IP 地址和端口
              request.meta["proxy"] = get_random_proxy()
      
    3. 上面程序通過自定義的下載中間件為 Scrapy 設置了代理服務器。程序中的 get_random_proxy() 函數需要能隨機返回代理服務器的 IP 地址和端口,這就需要開發者事先準備好一系列代理服務器,該函數能隨機從這些代理服務器中選擇一個。
    4. 通過 settings.py 文件設置啟用自定義的下載中間件。在 settings.py 文件中增加如下配置代碼:
    5. #配置自定義的下載中間件
      DOWNLOADER MIDDLEWARES = {
          ‘ZhipinSpider.middlewares.RandomProxyMiddleware‘: 543,
      }
      

        

      禁用Cookie

      有些網站可以通過跟蹤 Cookie 來識別是否是同一個客戶端。Scrapy 默認開啟了 Cookie,這樣目標網站就可以根據 Cookie 來識別爬蟲程序是同一個客戶端。

      目標網站可以判斷,如果同一個客戶端在單位時間內的請求過於頻繁,則基本可以斷定這個客戶端不是正常用戶,很有可能是程序操作(比如爬蟲),此時目標網站就可以禁用該客戶端的訪問。

      針對這種情況,可以讓 Scrapy 禁用 Cookie(Scrapy 不需要登錄時才可禁用 Cookie)。在 settings.py 文件中取消如下代碼的註釋即可禁用 Cookie:

    6. COOKIES_ENABLED = False
      

        

      違反爬蟲規則文件

      在很多 Web 站點目錄下都會提供一個 robots.txt 文件,在該文件中制定了一系列爬蟲規則。例如,Weibo.com 網站下的 robots.txt 文件的內容如下:

    7. 技術分享圖片
      Sitemap: http://weibo.com/sitemap.xml User-Agent: Baiduspider Disallow : User-agent : 360Spider Disallow : User-agent : Googlebot Disallow : User-agent : Sogou web spider Disallow : User-agent:bingbot Disallow : User-agent : smspider Disallow : User-ageηt : HaosouSpider Disallow : User-agent : YisouSpider Disallow : User-agent : * Disallow : /
      View Code

      該規則文件指定該站點只接受 Baidu 的網絡爬蟲,不接受其他爬蟲程序。

      為了讓爬蟲程序違反爬蟲規則文件的限制,強行爬取站點信息,可以在 settings 文件中取消如下代碼的註釋來違反站點制定的爬蟲規則:

    8. #指定不遵守爬蟲規則
      ROBOTSTXT OBEY = False
      

        

      限制訪問頻率

      正如前面所提到的,當同一個 IP 地址、同一個客戶端訪問目標網站過於頻繁時(正常用戶的訪問速度沒那麽快),其很可能會被當成機器程序(比如爬蟲)禁止訪問。

      為了更好地模擬正常用戶的訪問速度,可以限制 Scrapy 的訪問頻率。在 settings 文件中取消如下代碼的註釋即可限制 Scrapy 的訪問頻率:

    9. #開啟訪問頻率限制
      AUTOTHROTTLE ENABLED = True
      #設置訪問開始的延遲
      AUTOTHROTTLE START DELAY = 5
      #設置訪問之間的最大延遲
      AUTOTHROTTLE MAX DELAY = 60
      #設置Scrapy 並行發給每臺遠程服務器的請求數量
      AUTOTHROTTLE TARGET CONCURRENCY= 1.0
      #設置下裁之後的自動延遲
      DOWNLOAD DELAY = 3
      

        

      圖形驗證碼

      有些網站為了防止機器程序訪問,會做一些很“變態”的設計,它會記錄同一個客戶端、同一個IP地址的訪問次數,只要達到一定的訪問次數(不管你是正常用戶,還是機器程序),目標網站就會彈出一個圖形驗證碼讓你輸入,只有成功輸入了圖形驗證碼才能繼續訪問。

      為了讓機器識別這些圖形驗證碼,通常有兩種解決方式:

        1. 使用 PIL、Libsvrn 等庫自己開發程序來識別圖形驗證碼。這種方式具有最大的靈活性,只是需要開發人員自己編碼實現。
        2. 通過第三方打碼平臺識別。有不少圖形驗證碼的在線識別網站,它們的識別率基本可以做到 90% 以上。但是識別率高的在線識別網站通常都要收費,而免費的往往識別率不高,還不如自己寫程序來識別。

Python Scrapy反爬蟲常見解決方案(包含5種方法)