根據(jù)知名網(wǎng)站 stackoverflow 調(diào)查飞蹂,被調(diào)查者 69% 都是非科班出生。
很多人學(xué)習(xí)一門語言的第一件事情不是做一個(gè)大的項(xiàng)目,而且用它來寫一個(gè)爬蟲现斋,那么如何寫好一條爬蟲呢?這也是一個(gè)值得探討的問題俐末,爬蟲與反爬蟲就是實(shí)力的較量料按。
比如我們想爬豆瓣的熱門書籍,熱門電影卓箫,或者想把豆瓣的圖書數(shù)據(jù)都爬下來载矿,那我們應(yīng)該怎么做呢?中間會(huì)遇到什么問題呢烹卒?
反爬蟲措施一般有哪些呢闷盔?
驗(yàn)證碼的方式,驗(yàn)證方式多種多樣旅急,圖片驗(yàn)證碼逢勾、拖動(dòng)驗(yàn)證碼、更加復(fù)雜變態(tài)的驗(yàn)證碼等等藐吮。對(duì)于圖片驗(yàn)證碼溺拱,有一些簡單的庫來識(shí)別這些驗(yàn)證碼圖片,但是效果并不是很好谣辞。
頻率迫摔、IP 限制,比如豆瓣網(wǎng)頁潦闲,他是允許你少量爬一些資源的攒菠,但是如果同一個(gè)IP、同一個(gè)賬號(hào)在比較短的時(shí)間內(nèi)爬取大量的內(nèi)容歉闰,他也會(huì)通過技術(shù)手段阻止你辖众,往往是圖片驗(yàn)證碼
全局動(dòng)態(tài)加載,要想爬別人的資源和敬,那么首先需要得到網(wǎng)頁的內(nèi)容凹炸,但有些網(wǎng)站就是這么牛,網(wǎng)頁最開始只加載一個(gè) JS 文件昼弟,然后通過 JS 再去加載其他的內(nèi)容信息啤它,這樣對(duì)爬蟲是非常不友好的。因?yàn)榕老x不能像瀏覽器一樣渲染頁面啊舱痘,臣妾真的做不到变骡。微博就是這樣滴,要想爬取微博內(nèi)容芭逝,做好心理準(zhǔn)備塌碌。
那我們應(yīng)該怎樣取和這些反爬蟲措施做斗爭呢?
如果對(duì)方是圖片驗(yàn)證碼的方式旬盯、圖片滑塊的方式台妆,完全可以使用人工打碼的方式翎猛,就是把圖片驗(yàn)證碼或者滑塊位置信息傳輸?shù)降谌较到y(tǒng)里面,讓那些工人人工識(shí)別這些驗(yàn)證碼接剩,這還是一個(gè)產(chǎn)業(yè)鏈哦切厘。
如果對(duì)方限制頻率,那則可以采取分布式爬蟲來工作懊缺,在云主機(jī)廠商多購買一些廉價(jià)的VPS疫稿,把任務(wù)分散開來,滿足爬取頻率上的需求桐汤。如果對(duì)方采取IP限制的方式而克,那就可以使用代理的方式工作,國內(nèi)的一些代理網(wǎng)站出售的代理服務(wù)器地址非常糟糕怔毛,上次以學(xué)習(xí)為目的購買的代理员萍,質(zhì)量非常差,幾百個(gè)IP里面也許只有幾個(gè)可以正常 work拣度,所以不建議購買碎绎,建議使用國外網(wǎng)站提供的,例如這家網(wǎng)站的免費(fèi)代理質(zhì)量非常高 freeproxylists
如果對(duì)方采取全局動(dòng)態(tài)加載的方式來難為爬蟲抗果,那也不怕筋帖,selenium,將助你一臂之力冤馏,selenium 是一個(gè)中間的橋梁日麸,他提供一個(gè)瀏覽器驅(qū)動(dòng)程序,驅(qū)動(dòng)程序能夠驅(qū)動(dòng)不同的瀏覽器達(dá)到相同的效果逮光,他把細(xì)節(jié)封裝在內(nèi)部代箭,對(duì)外提供統(tǒng)一的API,是不是很酷涕刚?當(dāng)然搭配上 PhamtomJS 效果會(huì)更好嗡综,PhamtomJS 是一款無界面瀏覽器,他能夠像 chrome杜漠、firefox 那樣執(zhí)行桌面瀏覽器的功能极景,適合在服務(wù)器端渲染頁面,他的作者開發(fā)他的目的是用來進(jìn)行 web 自動(dòng)化測試的驾茴,但是用來做爬蟲是灰常不錯(cuò)的哦盼樟。
智斗,一定要先分析被爬網(wǎng)站的特點(diǎn)锈至,再不斷修正自己的爬蟲方案晨缴,這樣才能讓爬蟲更加完美。
實(shí)戰(zhàn)篇
看來大家對(duì)爬蟲的興趣還是挺高的裹赴,決定今天把實(shí)戰(zhàn)內(nèi)容加上喜庞。
實(shí)戰(zhàn)目標(biāo)是:爬取 freeproxylists 上的內(nèi)容,并且嘗試自動(dòng)發(fā)布到簡書上來棋返。目標(biāo)雖然看起來簡單延都,但是他使用了 Google 驗(yàn)證的,本文主要是講解如何有條理地制作一條爬蟲睛竣,以及如何繞過它的驗(yàn)證晰房。