Python 分布式新浪爬蟲的實現

2021-07-09 01:36:07 字數 1286 閱讀 8238

一開始寫的時候,並沒有想到要寫成分布式的。我一開始只是寫成單執行緒的形式。然後發現微博的反爬蟲機制有點兇,如果請求速度過快的話直接就把你的ip給封了。這樣一來的話,單執行緒的爬蟲做來玩玩還可以, 如果想要大量爬取資料的話就不現實了。因此只能寫成多執行緒或者是分布式的。

這個爬蟲的結構大致如下所示:

如圖所示,藍底白字的框圖表示控制模組,白底藍字表示與資料庫有關的程式,白底綠字表示有網路有關程式

從上圖可以看到該爬蟲主要分成兩部分,即伺服器端和客戶端。左邊是伺服器端,右邊是客戶端。

伺服器端各模組功能如下:

● server( tornado )

為了提高抓取效率,防止被封ip,使用**來抓取頁面是非常必要的。因此就需要伺服器端維持乙個**池。具體方法是:首先從****批量獲取未經驗證的**(get raw proxy), 然後依次用這些**去嘗試連線外網(check proxy)。如果能夠連線成功,則表示該**有效,放入執行緒池,待客戶端取用;如果無法連線,則表示該**無效。由於單執行緒驗證**效率太低,所以有必要使用多個執行緒來驗證**。我現在是使用100個子執行緒來驗證這些**是否有效

● db manager

負責處理資料庫的事物。tornado在接收到客戶端返回的資料之後,將該資料存入快取表(cache table). 而db manager是乙個單獨的執行緒,負責處理分析在cache table 中的資料,並將其存入到正式表中。值得注意的是,在處理關注列表的時候,需要進行查重,即判斷那些使用者已經爬過且存在表中了,而哪些還沒有,需要重新爬取。我一開始的時候是對關注列表中的每個人都會查詢一次,結果發現這樣做幾乎占用了磁碟的所有讀取效能,以至於使得伺服器程式無法正常工作。因此,還引入了redis作為mysql的快取,用於查重。關於用redis實現bloomfilter,在之前的文章中已經提過了用redis實現bloomfilter

客戶端各模組功能如下:

● client manager

考慮到該爬蟲目的比較單一,預期主要有兩個功能:爬取使用者關注列表,以及獲取使用者發布的微博資訊。 目前只實現了第乙個功能, 但是預留了可擴充套件的藉口。該模組負責與伺服器端進行通訊,獲取任務形式以及目標使用者。如果是爬取關注的任務,則轉到task manager 模組。

● task manager未完待續

爬蟲 分布式爬蟲

爬蟲的本質 很多搞爬蟲的總愛吹噓分布式爬蟲,彷彿只有分布式才有逼格,不是分布式簡直不配叫爬蟲,這是一種很膚淺的思想。分布式只是提高爬蟲功能和效率的乙個環節而已,它從來不是爬蟲的本質東西。爬蟲的本質是網路請求和資料處理,如何穩定地訪問網頁拿到資料,如何精準地提取出高質量的資料才是核心問題。分布式爬蟲只...

分布式爬蟲

乙個基於scrapy redis的分布式爬蟲模板,在scrapy redis自帶的example的基礎上進行修改,新增在實際爬取過程中大部分爬蟲可能用到的功能,使的構建分布式爬蟲更加的簡單。scrapy redis windows ubuntu sudo apt get install redis ...

分布式爬蟲

修改普通爬蟲專案為分布式爬蟲 1.主爬蟲檔案myspider.py 做如下修改,其他不做修改 import scrapy from items import myitem 匯入資料模型 from scrapy redis.spiders import redisspider 匯入scrapy red...