當前位置:
首頁 > 知識 > Python 編寫知乎爬蟲實踐

Python 編寫知乎爬蟲實踐

本文經作者授權發布。

文 | 程柳鋒@Tencent

爬蟲的基本流程

網路爬蟲的基本工作流程如下:

首先選取一部分精心挑選的種子 URL

將種子 URL 加入任務隊列

從待抓取 URL 隊列中取出待抓取的 URL,解析 DNS,並且得到主機的 ip,並將 URL 對應的網頁下載下來,存儲進已下載網頁庫中。此外,將這些 URL 放進已抓取 URL 隊列。

分析已抓取 URL 隊列中的 URL,分析其中的其他 URL,並且將 URL 放入待抓取 URL 隊列,從而進入下一個循環。

解析下載下來的網頁,將需要的數據解析出來。

數據持久話,保存至資料庫中。

爬蟲的抓取策略

在爬蟲系統中,待抓取 URL 隊列是很重要的一部分。待抓取 URL 隊列中的 URL 以什麼樣的順序排列也是一個很重要的問題,因為這涉及到先抓取那個頁面,後抓取哪個頁面。而決定這些 URL 排列順序的方法,叫做抓取策略。下面重點介紹幾種常見的抓取策略:

深度優先策略(DFS)

深度優先策略是指爬蟲從某個 URL 開始,一個鏈接一個鏈接的爬取下去,直到處理完了某個鏈接所在的所有線路,才切換到其它的線路。

此時抓取順序為:A -> B -> C -> D -> E -> F -> G -> H -> I -> J

廣度優先策略(BFS)

寬度優先遍歷策略的基本思路是,將新下載網頁中發現的鏈接直接插入待抓取 URL 隊列的末尾。也就是指網路爬蟲會先抓取起始網頁中鏈接的所有網頁,然後再選擇其中的一個鏈接網頁,繼續抓取在此網頁中鏈接的所有網頁。

此時抓取順序為:A -> B -> E -> G -> H -> I -> C -> F -> J -> D

了解了爬蟲的工作流程和爬取策略後,就可以動手實現一個爬蟲了!那麼在 python 里怎麼實現呢?

技術棧

requests 人性化的請求發送

Bloom Filter 布隆過濾器,用於判重

XPath 解析 HTML 內容

murmurhash

Anti crawler strategy 反爬蟲策略

MySQL 用戶數據存儲

基本實現

下面是一個偽代碼

如果你直接加工一下上面的代碼直接運行的話,你需要很長的時間才能爬下整個知乎用戶的信息,畢竟知乎有 6000 萬月活躍用戶。更別說 Google 這樣的搜索引擎需要爬下全網的內容了。那麼問題出現在哪裡?

布隆過濾器

需要爬的網頁實在太多太多了,而上面的代碼太慢太慢了。設想全網有 N 個網站,那麼分析一下判重的複雜度就是 N*log(N),因為所有網頁要遍歷一次,而每次判重用 set 的話需要 log(N) 的複雜度。OK,我知道 python 的 set 實現是 hash——不過這樣還是太慢了,至少內存使用效率不高。

通常的判重做法是怎樣呢?Bloom Filter. 簡單講它仍然是一種 hash 的方法,但是它的特點是,它可以使用固定的內存(不隨 url 的數量而增長)以 O(1) 的效率判定 url 是否已經在 set 中。可惜天下沒有白吃的午餐,它的唯一問題在於,如果這個 url 不在 set 中,BF 可以 100%確定這個 url 沒有看過。但是如果這個 url 在 set 中,它會告訴你:這個 url 應該已經出現過,不過我有 2%的不確定性。注意這裡的不確定性在你分配的內存足夠大的時候,可以變得很小很少。

BF 詳細的原理參考我之前寫的文章: 布隆過濾器(Bloom Filter) 的原理和實現

建表

用戶有價值的信息包括用戶名、簡介、行業、院校、專業及在平台上活動的數據比如回答數、文章數、提問數、粉絲數等等。

用戶信息存儲的表結構如下:

網頁下載後通過 XPath 進行解析,提取用戶各個維度的數據,最後保存到資料庫中。

反爬蟲策略應對-Headers

一般網站會從幾個維度來反爬蟲:用戶請求的 Headers,用戶行為,網站和數據載入的方式。從用戶請求的 Headers 反爬蟲是最常見的策略,很多網站都會對 Headers 的 User-Agent 進行檢測,還有一部分網站會對 Referer 進行檢測(一些資源網站的防盜鏈就是檢測 Referer)。

如果遇到了這類反爬蟲機制,可以直接在爬蟲中添加 Headers,將瀏覽器的 User-Agent 複製到爬蟲的 Headers 中;或者將 Referer 值修改為目標網站域名。對於檢測 Headers 的反爬蟲,在爬蟲中修改或者添加 Headers 就能很好的繞過。

反爬蟲策略應對-代理 IP 池

還有一部分網站是通過檢測用戶行為,例如同一 IP 短時間內多次訪問同一頁面,或者同一賬戶短時間內多次進行相同操作。

後續

使用日誌模塊記錄爬取日誌和錯誤日誌

分布式任務隊列和分布式爬蟲

爬蟲源代碼:zhihu-crawler 下載之後通過 pip 安裝相關三方包後,運行$ python crawler.py 即可(喜歡的幫忙點個 star 哈,同時也方便看到後續功能的更新)

運行截圖:

題圖:pexels,CC0 授權。

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

Python 的 LEGB 規則
你該了解的10個Python模塊
Python開發者如何系統地學習深度學習與TensorFlow
字典對象的 Pythonic 用法(上篇)
Python編寫知乎爬蟲實踐

TAG:Python |

您可能感興趣

用 Python 編寫的 Python 解釋器
使用 Cython 為 Python 編寫更快的 C 擴展
用Click編寫Python命令行工具
不要在Python中編寫 lambda 表達式了
如何在CUDA中為Transformer編寫一個PyTorch自定義層
iPhone X 的新解鎖技術:用 Python 編寫 Face ID!
5 個用 Python 編寫非阻塞 web 爬蟲的方法
用python編寫程序自動發表csdn博客
如何編寫 bash completion script
Servlet 編寫過濾器
Marvel 計畫重新編寫《Fantastic Four》故事線
shellcode快捷編寫工具,可針對多種常見系統指令編寫;POT:Twitter釣魚,全自動模仿給好友發釣魚鏈接
Effective Python之編寫高質量Python代碼的59個有效方法
如何用Python編寫你最喜歡的R函數?
基於Metasploit編寫終端檢測程序
.gitignore詳解及編寫
如何開啟Gmail的Smart Compose並讓Google AI編寫您的郵件
Python學習——自己編寫的一段小代碼
利用pyqt來編寫屬於自己的python Gui界面
看HPE Nimble如何編寫這部「存儲的遊戲」