爬蟲 分布式爬蟲

2022-06-20 20:06:12 字數 1333 閱讀 4178

爬蟲的本質:

很多搞爬蟲的總愛吹噓分布式爬蟲,彷彿只有分布式才有逼格,不是分布式簡直不配叫爬蟲,這是一種很膚淺的思想。

分布式只是提高爬蟲功能和效率的乙個環節而已,它從來不是爬蟲的本質東西。爬蟲的本質是網路請求和資料處理,如何穩定地訪問網頁拿到資料,如何精準地提取出高質量的資料才是核心問題。分布式爬蟲只有當爬蟲任務量很大的時候才會凸顯優勢,一般情況下也確實不必動用這個大殺器,所以要明確你的目標是什麼。

分布式概念:  

那麼什麼是分布式?嚴謹學術的概念就不搬過來了。大致來說,就是需要計算的資料量太大,任務太多,一台機器搞不定或者效率極低,需要多台機器共同協作(而不是孤立地各做各的,所以需要通訊),最後所有機器完成的任務彙總在一起,完成大量任務。

之前提到過任務《分割方法》,但這並不是嚴格意義上的分布式爬蟲。任務分割的方法,是首先爬完了url或者id,需要爬取的任務是確定的,這個時候可以人工地將任務劃分成幾個互不重複的子任務,交給多台機器多個指令碼去跑,這樣彼此之間不通訊不交流,也不會有影響。

然而還有一種情況,輸入的待爬任務並不是固定不變的,而是實時變化的,這種情況下沒辦法人工以固定不變的邏輯去分割任務還能確保互相獨立、互不干擾,最好的辦法就是把任務集中在一處,在各台機器能互相通訊的前提下,互不干擾地完成任務。

分布式爬蟲還有乙個動機,就是以機器換速度。有的**反爬措施很嚴格,你必須得慢慢爬,否則稍微一浪就被封,這種情況下只靠一台機器乙個指令碼的速度肯定是無法容忍的。但是對於分布式爬蟲,每乙個機器的指令碼都有不同的ip或者帳號cookie,都以很慢的速度在爬,當並行任務多了之後,總體上的速度就很可觀。

非同步程式設計開發爬蟲:

很多人都認為python的執行環境大部分依賴gil,而gil限制了多執行緒的功

在這裡需要明確的一點就是gil並不是python的特性,他是在實現python直譯器(cpython)時所引入的乙個概念,由於物理上的限制,各個廠商在cpu的的核心頻率上已經被多核所取代,為了更好的利用多核的效能,這時候就出現了多執行緒的程式設計方式,隨之而來的就是執行緒間資料的一致性和狀態同步的困難

為了使用多核,python開始支援多執行緒,而解決多執行緒之間的資料的一致性和狀態的同步問題就是加鎖解決,於是就產生了gil這把鎖,當越來越多的人接受這種設定以後, 他們開始依賴這種特性(也就是預設python內部物件是thread-safe的,無須在實現考慮額外的記憶體鎖和同步的操作)

多執行緒環境中,python直譯器按照以下的方式執行:

1、設定gil  

2、切換到乙個執行緒去執行

3、執行:指定數量的位元組碼指令或者執行緒主動讓出控制(可以呼叫time.sleep())

4、把執行緒設定為睡眠狀態

5、解鎖gil,再次重複以上所有的步驟

如何構建分布式爬蟲:

參照理論部落格

分布式爬蟲

乙個基於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...

分布式爬蟲

分布式爬蟲 1 在爬蟲的settings.py中新增下面兩句話 enables scheduling storing requests queue in redis.scheduler scrapy redis.scheduler.scheduler ensure all spiders share...