那些年咱們寫過的爬蟲

從寫nodejs的第一個爬蟲開始陸陸續續寫了好幾個爬蟲,從爬拉勾網上的職位信息到爬豆瓣上的租房帖子,再到去爬知乎上的妹子照片什麼的,爬蟲爲我打開了一扇又一扇新世界的大門。除了漲了不少姿式以外,與網管鬥智鬥勇也是一個比較有意思的事情。雖然不少東西都是淺嘗輒止,但萬事都有個由淺入深的過程嘛(天真臉~~)css

一隻爬蟲的模樣

爬蟲?應該是長這樣的吧:html

其實,沒有那麼萌啦。前端

所謂爬蟲,就是把目標網站的信息收集起來的一種工具。基本流程跟人訪問網站是同樣的,打開連接>>獲取信息>>打開連接……這個循環用編程實現,就是爬蟲了。專業一點的說法就是,發起請求>>解析響應數據。普通網站訪問的時候,返回值是一個html文本,這時候須要解析html文本獲取所需信息,好比能夠用cheerio這種類jQuery的操做dom的方式去解析html文本;而使用ajax動態生成內容的網站,能夠直接去請求相應的接口,從而直接得到數據。爬蟲爬的,就是這些url或者接口,慢慢地爬呀爬,直到世界盡頭~~~node

爬蟲與網管

獲取信息是爬蟲的核心,可是最有技術含量的卻不在於此。爬蟲路上的第一個大敵,就是網管了。因爲太多人利用爬蟲去剽竊別人的成果,因此爬蟲在生產內容的網站都不受待見。就想農民伯伯辛辛苦苦種大的大白菜,天然是不但願被豬拱了。網管叔叔們一般會根據爬蟲的特徵來辨別爬蟲,大致上有這麼幾個方面:git

1) 檢查請求頭。一些很初級的爬蟲只是單純得發請求,連最基本的user agent之類的請求頭都沒有,看見這種請求,不用說也知道是爬蟲了。除了user agent,Referer也是一個一般被用來檢查爬蟲的字段。github

2) 判斷用戶行爲。不少網站在未登陸狀態的時候會常常返回登陸頁面讓用戶登陸,用戶登陸以後經過統計用戶訪問行爲就能夠判斷出用戶是否是人,好比在短期內進行了大量的訪問,這顯然不是人力所能作到的了。ajax

3) 判斷IP的訪問量。若是一個ip在短期內進行了大量的訪問,顯然,這也不是人乾的事。尤爲是同一IP出現高併發的狀況,這種會加劇服務器負荷甚至搞垮服務器的爬蟲,絕對是網管的眼中釘肉中刺。算法

4) 根據瀏覽器行爲判斷。瀏覽器在打開網頁的時候會自動將網頁中的圖片、css、js等資源加載下來,可是爬蟲卻只是獲取了網頁的文本,並不會自動加載相關的資源,經過這一特徵也能很好區分爬蟲。好比說在網頁中加入一個會自動發請求的js文件,服務器端若是接收不到這個請求就能夠認爲是爬蟲在訪問了。可是這招對利用瀏覽器內核寫成的爬蟲或者是高級爬蟲來講就無論用了。數據庫

一般網管們比較經常使用的是就是前3種方式的組合,第4點須要開發改動先後端代碼,這對身爲運維的網管叔叔們來講,給開發提需求可不容易啊。但若是在開發階段就已經考慮到防火防盜防爬蟲的話,那就會對接口進行加密或是校驗了。雖說前端代碼都是裸奔的,可是假若有意去混淆js的話,想要破解出加密算法也不是那麼簡單的。校驗就跟普通的應付csrf攻擊的作法也相差無幾,在頁面中嵌入服務器端返回的隨機數,接口調用時校驗這個隨機數便可。編程

智鬥網管

可是俗話說,你有張良計,我有過牆梯。即便網管叔叔好像作了不少反爬蟲的工做,可是人民羣衆的智商是無限的。

什麼,你要檢查請求頭?你要什麼樣的header,我這裏都有!根據IP判斷?花幾十塊買了一堆高匿代理服務器呢。判斷用戶行爲?呵呵,我有一堆小號呀~

具體來講:

1)僞造header。這實在太簡單了,隨便打開一個瀏覽器F12,把請求的header都複製一遍,不要太完整哦。

2)多用戶爬蟲。提早註冊好一堆小號,登陸以後F12分析cookie,找出帳號相關的cookie,將cookie按帳號存到數組中不斷輪換便可。在有csrf防護策略的網站上,還須要分析token的來源,在請求的時候帶上預埋的token便可。例如知乎就在網頁中預埋了一個_xsrf,在請求的時候要帶上這個自定義頭才能夠得到請求的權限。

3)多IP爬蟲。這個就稍微複雜一些,主要是高匿代理IP比較難搞到手。網上的免費代理很多,能用的很少。要麼掏錢,要麼就作一個爬蟲來爬取可用的代理服務器吧。

4)接口參數解密。這種狀況下,參數被加密成一個密碼字符串,服務器端經過解密算法來還原參數,也就是說每次請求的參數都是不一樣的。這裏的關鍵在於找到加密算法和鑰匙,而前端的js一般也會被混淆加密,因此這種狀況是最複雜的。目前我還沒遇到這種狀況,因此就很少說了。

一隻爬蟲的修養

若是一隻爬蟲動不動就幾百個併發,這吃相就難看了。因此咱們一般會控制一下併發和爬取間隔,儘可能不干擾服務器的正常運轉。這就是一隻爬蟲的修養了。

流程控制方面你可使用集成的async庫,也能夠手動管理流程,時刻考慮異常狀況就能夠寫出最貼合你要求的控制流程了。如今es7從語言上加入了async、await語法糖,手動編碼的代碼也很是優雅了。

附錄

1)知乎圖片爬蟲:這個是受不了一個曾經很火的帖子誘惑而寫的(長得好看,但沒有男友是怎樣的體驗? ),這個爬蟲能夠爬取任一話題下全部回答中的圖片並下載到本地目錄下,大家感覺下:

知乎爬蟲效果

如你所見,大部分妹子長得並無很好看。。。。(咦,我好像發現了些什麼(*/ω╲*))

可是!質量不行,我還有數量呀:  

其實並非頗有動力寫這種爬蟲,不過看到答案中一個傢伙寫了一個爬蟲,可是卻只能爬第一頁。。。這是什麼感受?就好像是拉鍊還沒拉下來,片子卻播完了!忍不住,就寫了一個能夠下載全部答案的爬蟲,而後還用數據庫和json兩種方式儲存了一下數據。剛看的數據庫,學以至用!源碼和相應說明均在文後有給出。

 

2)豆瓣小組爬蟲:這個是我在豆瓣上找房子的時候寫的簡單爬蟲,這個爬蟲的吃相比較難看!。!由於沒有控制併發。。。由於租房帖子的更新很是快,因此就爬取了最新的10頁(250條)帖子,主要邏輯就是對標題進行關鍵詞的篩選,將符合條件的帖子輸出到網頁中(這裏用json文件來示範了)。結果大概長這個樣子:

 

3)拉勾網爬蟲:這個是在換工做的時候寫的一個很簡單的爬蟲,主要是想統計一下不一樣崗位的需求狀況、公司分佈,原本還想要結合地圖作分佈圖、熱力圖什麼的,最後也是不了了之。只是簡單地用echart作了一個圖表就完事了,太簡陋!拉鉤是ajax接口返回數據的,並且沒有加密,實在是太好爬了!反爬蟲的策略是基於IP的,單個ip訪問頻繁就會被封哦,要注意!

 

PS:上面提到的爬蟲都在個人 github 上了,求star!(喂,只fork不star是什麼意思呀?)

 

很久沒寫文字了,最近一直在看後端相關的東西、還看了下比較火的Vue,感受收穫仍是蠻大的,後續會分享相關的學習感悟,敬請期待!

最後,仍是慣例放圖吧。(幸虧假期出去了一趟,否則都沒圖可放了,囧囧囧)

 原創文章,轉載請註明出處!本文連接:http://www.cnblogs.com/qieguo/p/5859927.html  

相關文章
相關標籤/搜索