爬蟲(chóng)(Spider),反爬蟲(chóng)(Anti-Spider)降狠,反反爬蟲(chóng)(Anti-Anti-Spider) 之間恢宏壯闊的斗爭(zhēng)...
Day 1
- 小莫想要某站上所有的電影对竣,寫(xiě)了標(biāo)準(zhǔn)的爬蟲(chóng)(基于HttpClient庫(kù))庇楞,不斷地遍歷某站的電影列表頁(yè)面,根據(jù) Html 分析電影名字存進(jìn)自己的數(shù)據(jù)庫(kù)否纬。
- 這個(gè)站點(diǎn)的運(yùn)維小黎發(fā)現(xiàn)某個(gè)時(shí)間段請(qǐng)求量陡增吕晌,分析日志發(fā)現(xiàn)都是 IP(xxx.xxx.xxx.xxx)這個(gè)用戶,并且 user-agent 還是 Python-urllib/2.7 临燃,基于這兩點(diǎn)判斷非人類后直接在服務(wù)器上封殺睛驳。
Day 2
- 小莫電影只爬了一半,于是也針對(duì)性的變換了下策略:1. user-agent 模仿百度("Baiduspider...")膜廊,2. IP每爬半個(gè)小時(shí)就換一個(gè)IP代理乏沸。
- 小黎也發(fā)現(xiàn)了對(duì)應(yīng)的變化,于是在服務(wù)器上設(shè)置了一個(gè)頻率限制爪瓜,每分鐘超過(guò)120次請(qǐng)求的再屏蔽IP蹬跃。 同時(shí)考慮到百度家的爬蟲(chóng)有可能會(huì)被誤傷,想想市場(chǎng)部門(mén)每月幾十萬(wàn)的投放铆铆,于是寫(xiě)了個(gè)腳本蝶缀,通過(guò) hostname 檢查下這個(gè) ip 是不是真的百度家的,對(duì)這些 ip 設(shè)置一個(gè)白名單薄货。
Day 3
- 小莫發(fā)現(xiàn)了新的限制后翁都,想著我也不急著要這些數(shù)據(jù),留給服務(wù)器慢慢爬吧谅猾,于是修改了代碼柄慰,隨機(jī)1-3秒爬一次,爬10次休息10秒税娜,每天只在8-12坐搔,18-20點(diǎn)爬,隔幾天還休息一下敬矩。
- 小黎看著新的日志頭都大了薯蝎,再設(shè)定規(guī)則不小心會(huì)誤傷真實(shí)用戶,于是準(zhǔn)備換了一個(gè)思路谤绳,當(dāng)3個(gè)小時(shí)的總請(qǐng)求超過(guò)50次的時(shí)候彈出一個(gè)驗(yàn)證碼彈框,沒(méi)有準(zhǔn)確正確輸入的話就把 IP 記錄進(jìn)黑名單袒哥。
Day 4
- 小莫看到驗(yàn)證碼有些傻臉了缩筛,不過(guò)也不是沒(méi)有辦法,先去學(xué)習(xí)了圖像識(shí)別(關(guān)鍵詞 PIL堡称,tesseract)瞎抛,再對(duì)驗(yàn)證碼進(jìn)行了二值化,分詞却紧,模式訓(xùn)練之后桐臊,總之最后識(shí)別了小黎的驗(yàn)證碼(關(guān)于驗(yàn)證碼胎撤,驗(yàn)證碼的識(shí)別,驗(yàn)證碼的反識(shí)別也是一個(gè)恢弘壯麗的斗爭(zhēng)史...)断凶,之后爬蟲(chóng)又跑了起來(lái)伤提。
- 小黎是個(gè)不折不撓的好同學(xué),看到驗(yàn)證碼被攻破后认烁,和開(kāi)發(fā)同學(xué)商量了變化下開(kāi)發(fā)模式肿男,數(shù)據(jù)并不再直接渲染,而是由前端同學(xué)異步獲取却嗡,并且通過(guò) JavaScript 的加密庫(kù)生成動(dòng)態(tài)的 token舶沛,同時(shí)加密庫(kù)再進(jìn)行混淆(比較重要的步驟的確有網(wǎng)站這樣做,參見(jiàn)淘寶和微博的登陸流程)窗价。
Day 5
- 混淆過(guò)的加密庫(kù)就沒(méi)有辦法了么如庭?當(dāng)然不是,可以慢慢調(diào)試撼港,找到加密原理坪它,不過(guò)小莫不準(zhǔn)備用這么耗時(shí)耗力的方法,他放棄了基于 HttpClient的爬蟲(chóng)餐胀,選擇了內(nèi)置瀏覽器引擎的爬蟲(chóng)(關(guān)鍵詞:PhantomJS哟楷,Selenium),在瀏覽器引擎運(yùn)行頁(yè)面否灾,直接獲取了正確的結(jié)果卖擅,又一次拿到了對(duì)方的數(shù)據(jù)。
- 小黎:.....
爬蟲(chóng)與發(fā)爬蟲(chóng)的斗爭(zhēng)還在繼續(xù)...
通常情況下墨技,在爬蟲(chóng)與反爬蟲(chóng)的對(duì)弈中惩阶,爬蟲(chóng)一定會(huì)勝利。
換言之扣汪,只要人類能夠正常訪問(wèn)的網(wǎng)頁(yè)断楷,爬蟲(chóng)在具備同等資源
的情況下就一定可以抓取到。
關(guān)于爬蟲(chóng)部分一些建議:
盡量減少請(qǐng)求次數(shù)崭别,能抓列表頁(yè)就不抓詳情頁(yè)冬筒,減輕服務(wù)器壓力,程序員都是混口飯吃不容易茅主。
不要只看 Web 網(wǎng)站舞痰,還有手機(jī) App 和 H5,這樣的反爬蟲(chóng)措施一般比較少诀姚。
實(shí)際應(yīng)用時(shí)候响牛,一般防守方做到根據(jù) IP 限制頻次就結(jié)束了,除非很核心的數(shù)據(jù),不會(huì)再進(jìn)行更多的驗(yàn)證呀打,畢竟成本的問(wèn)題會(huì)考慮到矢赁。
如果真的對(duì)性能要求很高,可以考慮多線程(一些成熟的框架如 Scrapy都已支持)贬丛,甚至分布式...