1 前言
近來這兩三個(gè)月,我陸續(xù)將自己學(xué)到的爬蟲技術(shù)分享出來。以標(biāo)準(zhǔn)網(wǎng)絡(luò)庫(kù) urllib 的用法起筆,接著介紹各種內(nèi)容提供工具,再到后續(xù)的 scrapy 爬蟲框架系列。我的爬蟲分享之旅已經(jīng)接近尾聲了。本文就來聊聊如何防止爬蟲被 ban 以及如何限制爬蟲。
2 介紹
我們編寫的爬蟲在爬取網(wǎng)站的時(shí)候,要遵守 robots 協(xié)議,爬取數(shù)據(jù)做到“盜亦有道”。在爬取數(shù)據(jù)的過程中,不要對(duì)網(wǎng)站的服務(wù)器造成壓力。盡管我們做到這么人性化。對(duì)于網(wǎng)絡(luò)維護(hù)者來說,他們還是很反感爬蟲的。因?yàn)榕老x的肆意橫行意味著自己的網(wǎng)站資料泄露,甚至是自己刻意隱藏在網(wǎng)站的隱私的內(nèi)容也會(huì)泄露。所以,網(wǎng)站維護(hù)者會(huì)運(yùn)用各種方法來攔截爬蟲。
3 攻防戰(zhàn)
- 場(chǎng)景一
防
:檢測(cè)請(qǐng)求頭中的字段,比如:User-Agent、referer等字段。
攻
:只要在 http 請(qǐng)求的 headers 中帶上對(duì)于的字段即可。下圖中的七個(gè)字段被大多數(shù)瀏覽器用來初始化所有網(wǎng)絡(luò)請(qǐng)求。建議將以下所有字段都帶上。
- 場(chǎng)景二
防
:后臺(tái)對(duì)訪問的 IP 進(jìn)行統(tǒng)計(jì),如果單個(gè) IP 訪問超過設(shè)定的閾值,給予封鎖。雖然這種方法效果還不錯(cuò), 但是其實(shí)有兩個(gè)缺陷。 一個(gè)是非常容易誤傷普通用戶, 另一個(gè)就是 IP 其實(shí)不值錢, 各種代理網(wǎng)站都有出售大量的 IP 代理地址。 所以建議加大頻率周期,每小時(shí)或每天超過一定次數(shù)屏蔽 IP 一段時(shí)間(不提示時(shí)間)。
攻
:針對(duì)這種情況,可通過使用代理服務(wù)器解決。同時(shí),爬蟲設(shè)置下載延遲,每隔幾次請(qǐng)求,切換一下所用代理的IP地址。
- 場(chǎng)景三
防
:后臺(tái)對(duì)訪問進(jìn)行統(tǒng)計(jì), 如果單個(gè) userAgent 訪問超過閾值, 予以封鎖。這種方法攔截爬蟲效果非常明顯,但是殺傷力過大,誤傷普通用戶概率非常高。所以要慎重使用。
攻
:收集大量瀏覽器的 userAgent 即可。
- 場(chǎng)景四
防
:網(wǎng)站對(duì)訪問有頻率限制,還設(shè)置驗(yàn)證碼。增加驗(yàn)證碼是一個(gè)既古老又相當(dāng)有效果的方法。能夠讓很多爬蟲望風(fēng)而逃。而且現(xiàn)在的驗(yàn)證碼的干擾線, 噪點(diǎn)都比較多,甚至還出現(xiàn)了人類肉眼都難以辨別的驗(yàn)證碼(12306 購(gòu)票網(wǎng)站)。
攻
:python+tesseract 驗(yàn)證碼識(shí)別庫(kù)模擬訓(xùn)練,或使用類似 tor 匿名中間件(廣度遍歷IP)
- 場(chǎng)景五
防
:網(wǎng)站頁(yè)面是動(dòng)態(tài)頁(yè)面,采用 Ajax 異步加載數(shù)據(jù)方式來呈現(xiàn)數(shù)據(jù)。這種方法其實(shí)能夠?qū)ε老x造成了絕大的麻煩。
攻
:首先用 Firebug 或者 HttpFox 對(duì)網(wǎng)絡(luò)請(qǐng)求進(jìn)行分析。如果能夠找到 ajax 請(qǐng)求,也能分析出具體的參數(shù)和響應(yīng)的具體含義。則直接模擬相應(yīng)的http請(qǐng)求,即可從響應(yīng)中得到對(duì)應(yīng)的數(shù)據(jù)。這種情況,跟普通的請(qǐng)求沒有什么區(qū)別。
能夠直接模擬ajax請(qǐng)求獲取數(shù)據(jù)固然是極好的,但是有些網(wǎng)站把 ajax 請(qǐng)求的所有參數(shù)全部加密了。我們根本沒辦法構(gòu)造自己所需要的數(shù)據(jù)的請(qǐng)求,請(qǐng)看場(chǎng)景六。
- 場(chǎng)景六
防
:基于 JavaScript 的反爬蟲手段,主要是在響應(yīng)數(shù)據(jù)頁(yè)面之前,先返回一段帶有JavaScript 代碼的頁(yè)面,用于驗(yàn)證訪問者有無 JavaScript 的執(zhí)行環(huán)境,以確定使用的是不是瀏覽器。例如淘寶、快代理這樣的網(wǎng)站。
這種反爬蟲方法。通常情況下,這段JS代碼執(zhí)行后,會(huì)發(fā)送一個(gè)帶參數(shù)key的請(qǐng)求,后臺(tái)通過判斷key的值來決定是響應(yīng)真實(shí)的頁(yè)面,還是響應(yīng)偽造或錯(cuò)誤的頁(yè)面。因?yàn)閗ey參數(shù)是動(dòng)態(tài)生成的,每次都不一樣,難以分析出其生成方法,使得無法構(gòu)造對(duì)應(yīng)的http請(qǐng)求。
攻
:采用 selenium+phantomJS 框架的方式進(jìn)行爬取。調(diào)用瀏覽器內(nèi)核,并利用phantomJS 執(zhí)行 js 來模擬人為操作以及觸發(fā)頁(yè)面中的js腳本。從填寫表單到點(diǎn)擊按鈕再到滾動(dòng)頁(yè)面,全部都可以模擬,不考慮具體的請(qǐng)求和響應(yīng)過程,只是完完整整的把人瀏覽頁(yè)面獲取數(shù)據(jù)的過程模擬一遍。
系列文章:
學(xué)會(huì)運(yùn)用爬蟲框架 Scrapy (一)
學(xué)會(huì)運(yùn)用爬蟲框架 Scrapy (二)
學(xué)會(huì)運(yùn)用爬蟲框架 Scrapy (三)
學(xué)會(huì)運(yùn)用爬蟲框架 Scrapy (四) —— 高效下載圖片
學(xué)會(huì)運(yùn)用爬蟲框架 Scrapy (五) —— 部署爬蟲
推薦閱讀:
爬蟲實(shí)戰(zhàn)二:爬取電影天堂的最新電影
爬蟲系列的總結(jié)