網路爬蟲的一些總結

一、引言

最早接觸爬蟲,是發現了一個叫做『豆瓣妹子』的網站,寫了一個簡單的程序可以批量下載圖片。後來陸陸續續抓取過豆瓣電影,Google+,facejoking等網站。畢設的選題也是抓取新浪微博,然後分析博文的傳播情況。最近一直對知乎的數據感興趣,於是開發了Node模塊zhihu-api,用於簡化數據的抓取。

通常來說,所謂的爬蟲,無非是通過程序來發送HTTP請求。因此理論上來說,所有瀏覽器能訪問到的內容,都是可以通過爬蟲來進行抓取的。

一般而言,我們所感興趣的信息,只是頁面中的某一部分數據,例如:某個標籤的文本、鏈接地址、圖片地址等。有些網站會提供開放的API(往往也會有很多限制),這時只需要直接請求該API,就可以拿到比較乾淨的數據了,比如Google+。對於那些沒有開放API的網站,就需要先發送HTTP請求拿到頁面數據,然後通過解析頁面來得到所需要的數據。然而有些網站的頁面內容是通過腳本來動態生成的,這種情況下就需要做更多的事情,這個後面再提。

二、發送請求

回想一下HTTP請求的基本組成:request line,headers,request body。發送請求與這三部分密切相關,主要需要關注的是:url,method,headers和body。在這裡,DevTools將發揮非常重要的作用,用於查看每個請求的詳細信息。

對於headers,需要關注的主要有這幾個:

  • User-Agent:針對反爬蟲機制,設置該欄位可以簡單地偽裝成瀏覽器

  • Referer:針對反爬蟲機制,有些網站會檢測該欄位

  • Cookie:模擬登陸的最簡單粗暴的方法

  • Content-Type:當請求方法為 POST 時,設置請求體的類型,最常用的為 application/x-www-form-urlencoded 和 application/json

三、模擬登陸

許多網站都需要登錄後才能獲取到內容。最簡單的的登陸方式就是用戶名和密碼。在這種情況下,可以通過程序維護一個Session,使用用戶名和密碼進行登陸,然後之後使用該Session來發送請求。

然而現在許多網站的登陸都會比較複雜,有的需要輸入複雜的驗證碼,有的還需要手機驗證等。這些情況往往都比較繁瑣,如果依然使用Session的方式,通常實現起來比較麻煩,考慮到Session也不過是維護了Cookie等一些狀態,在這種情況下,直接使用Cookie模擬登陸不失為一個簡單粗暴的方法。

使用Cookie來模擬登陸,就是用戶在瀏覽器先登錄網站,然後將Cookie信息拷貝出來,用來設置請求的Cookie header。

四、頁面解析

很多情況下,通過爬蟲抓取到的內容是一個HTML頁面或者HTML片段。為了從中提取出我們所需要的數據,需要對其進行解析。常見的解析方式有:

  • 正則匹配

  • DOM

對於一些比較簡單的數據提取,例如提取頁面中所有的圖片地址,使用正則就可以做到。但是對於一些複雜的解析,常用的還是通過DOM的方式。

五、多線程抓取

一次發送一個請求未免效率太低。為了實現數據的快速抓取,往往會使用多線程來進行抓取。

對於Node.js,雖然本身是單線程執行,但是由於是非同步IO,實際上是類似於多線程的效果。

六、反爬蟲

許多網站針對爬蟲都設置了反爬蟲機制。常見的有:

  • 登陸限制:通過模擬登陸可以解決

  • 用戶代理檢測:通過設置User-Agent header

  • Referer檢測:通過設置Referer header

  • 訪問頻率限制:如果是針對同一賬號的頻率限制,則可以使用多個賬號輪流發請求;如果針對IP,可通過IP代理;還可以為相鄰的兩個請求設置合適的時間間隔來,減小請求頻率,從而避免被服務端認定為爬蟲。

七、其它

  1. 動態內容:對於許多網頁的動態內容,通過DevTools進行查看就可以解決。對於更為複雜的動態內容,可以考慮使用Selenium和Phantomjs。

  2. 數據存儲:對於多媒體文件,直接存文件。對於JSON格式的數據,使用MongoDB會很方便。

  3. 容錯機制:請求失敗可能會有多種情況。如果是訪問頻率過快,可以考慮暫停一段時間,或者換賬號,換IP等手段。如果是404,可以直接跳過該次抓取。然而有些站點返回的HTTP狀態碼並不一定符合其本意,因此也可以考慮統一的容錯處理,例如重試n次,如果不行就丟棄。

  4. 大規模分散式抓取:暫時沒有過多研究,之後可能會新開一篇文章來介紹。

  5. 常用工具:Python的話requests和BeautifulSoup,Node的話request和cheerio。

推薦閱讀:

zhihu-oauth 能否快速判斷兩個用戶(非登錄用戶)之間的關注關係?
App中的數據可以用網路爬蟲抓取么?
新浪微博數據抓取方法有哪些?
前嗅的這款數據採集軟體和像八爪魚這類的軟體有什麼區別,優勢在哪?
你讓你的 Excel 學口譯了么?

TAG:爬虫计算机网络 | 数据抓取 | 数据分析 |