Python Scrapy反爬蟲常見解決方案(包含5種方法)
爬蟲的本質就是“抓取”第二方網站中有價值的數據,因此,每個網站都會或多或少地采用一些反爬蟲技術來防範爬蟲。比如前面介紹的通過 User-Agent 請求頭驗證是否為瀏覽器、使用 JavaScript 動態加載資源等,這些都是常規的反爬蟲手段。
下面針對更強的反爬蟲技術提供一些解決方案。
IP 地址驗證
有些網站會使用 IP 地址驗證進行反爬蟲處理,程序會檢查客戶端的 IP 地址,如果發現同一個 IP 地址的客戶端頻繁地請求數據, 該網站就會判斷該客戶端是爬蟲程序。
針對這種情況,我們可以讓 Scrapy 不斷地隨機更換代理服務器的 IP 地址,這樣就可以欺騙目標網站了。
為了讓 Scrapy 能隨機更換代理服務器,可以自定義一個下載中間件,讓該下載中間件隨機更換代理服務器即可。
Scrapy 隨機更換代理服務器只要兩步:
- 打開 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 地址和端口,這就需要開發者事先準備好一系列代理服務器,該函數能隨機從這些代理服務器中選擇一個。
- 通過 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 : /
View Code該規則文件指定該站點只接受 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地址的訪問次數,只要達到一定的訪問次數(不管你是正常用戶,還是機器程序),目標網站就會彈出一個圖形驗證碼讓你輸入,只有成功輸入了圖形驗證碼才能繼續訪問。
為了讓機器識別這些圖形驗證碼,通常有兩種解決方式:- 使用 PIL、Libsvrn 等庫自己開發程序來識別圖形驗證碼。這種方式具有最大的靈活性,只是需要開發人員自己編碼實現。
- 通過第三方打碼平臺識別。有不少圖形驗證碼的在線識別網站,它們的識別率基本可以做到 90% 以上。但是識別率高的在線識別網站通常都要收費,而免費的往往識別率不高,還不如自己寫程序來識別。
Python Scrapy反爬蟲常見解決方案(包含5種方法)