C語言中文網 目錄

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

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

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

IP 地址驗證

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

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

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

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

    #配置自定義的下載中間件
    DOWNLOADER MIDDLEWARES = {
        'ZhipinSpider.middlewares.RandomProxyMiddleware': 543,
    }

禁用Cookie

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

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

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

COOKIES_ENABLED = False

違反爬蟲規則文件

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

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 : /

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

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

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

限制訪問頻率

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

為了更好地模擬正常用戶的訪問速度,可以限制 Scrapy 的訪問頻率。在 settings 文件中取消如下代碼的注釋即可限制 Scrapy 的訪問頻率:
#開啟訪問頻率限制
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% 以上。但是識別率高的在線識別網站通常都要收費,而免費的往往識別率不高,還不如自己寫程序來識別。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo