爬蟲與反爬蟲的博弈

圖片來自 unsplash

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)求。建議將以下所有字段都帶上。

點(diǎn)擊查看大圖

  • 場(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é)


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,687評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,682評(píng)論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,011評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評(píng)論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,183評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,714評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,435評(píng)論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,665評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,838評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評(píng)論 1 295
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,379評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,627評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容

  • 爬蟲文章 in 簡(jiǎn)書程序員專題: like:128-Python 爬取落網(wǎng)音樂 like:127-【圖文詳解】py...
    喜歡吃栗子閱讀 21,911評(píng)論 4 411
  • 1 前言 作為一名合格的數(shù)據(jù)分析師,其完整的技術(shù)知識(shí)體系必須貫穿數(shù)據(jù)獲取、數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)提取、數(shù)據(jù)分析、數(shù)據(jù)挖掘、...
    whenif閱讀 18,101評(píng)論 45 523
  • scrapy學(xué)習(xí)筆記(有示例版) 我的博客 scrapy學(xué)習(xí)筆記1.使用scrapy1.1創(chuàng)建工程1.2創(chuàng)建爬蟲模...
    陳思煜閱讀 12,758評(píng)論 4 46
  • 我知道我的累來自于哪里,大概就是自身對(duì)于自己整日無所事事,找不到在這個(gè)世界上存在的價(jià)值的無力感,其實(shí)身體比思想更加...
    凹凸曼奧閱讀 206評(píng)論 0 0
  • ??????
    梁杏儀閱讀 146評(píng)論 0 0