爬蟲總結(四)-- 分散式爬蟲
分散式爬蟲的演習。
分散式爬蟲問題其實也就是多臺機器多個 spider 對 多個 url 的同時處理問題,怎樣 schedule 這些 url,怎樣彙總 spider 抓取的資料。最簡單粗暴的方法就是將 url 進行分片,交給不同機器,最後對不同機器抓取的資料進行彙總。然而這樣每個 spider 只能對自己處理的 url 去重,沒辦法全域性的去重,另外效能也很難控制,可能有某臺機器很早就跑完了,而別的機器還要跑很久。另一種思路就是把 url 存在某個地方,共享給所有的機器,總的排程器來分配請求,判斷 spider 有沒有閒置,閒置了就繼續給它任務,直到所有的
url 都爬完,這種方法解決了去重問題(下面會具體講到),也能提高效能,scrapy-redis 就實現了這樣一個完整框架,總的來說,這更適合廣度優先的爬取。
Scrapyd
Scrapy 並沒有提供內建的分散式抓取功能,不過有很多方法可以幫你實現。
如果你有很多個spider,最簡單的方式就是啟動多個 Scrapyd 例項,然後將spider分佈到各個機器上面。
如果你想多個機器運行同一個spider,可以將url分片後交給每個機器上面的spider。比如你把URL分成3份
http://somedomain.com/urls-to-crawl/spider1/part1.list http://somedomain.com/urls-to-crawl/spider1/part2.list http://somedomain.com/urls-to-crawl/spider1/part3.list
然後執行3個 Scrapyd 例項,分別啟動它們,並傳遞part引數
curl http://scrapy1.mycompany.com:6800/schedule.json -d project=myproject -d spider=spider1 -d part=1 curl http://scrapy2.mycompany.com:6800/schedule.json -d project=myproject -d spider=spider1 -d part=2 curl http://scrapy3.mycompany.com:6800/schedule.json -d project=myproject -d spider=spider1
Crawlera
這個,花錢就可以輕易解決~直達
Scrapy-redis
Redis 是高效能的 key-value 資料庫。我們知道 MongoDB 將資料儲存在了硬盤裡,而 Redis 的神奇之處在於它將資料儲存在了記憶體中,因此帶來了更高的效能。
分散式原理
scrapy-redis實現分散式,其實從原理上來說很簡單,這裡為描述方便,我們把自己的核心伺服器稱為 master,而把用於跑爬蟲程式的機器稱為 slave。
回顧scrapy 框架,我們首先給定一些start_urls,spider 最先訪問 start_urls 裡面的 url,再根據我們的 parse 函式,對裡面的元素、或者是其他的二級、三級頁面進行抓取。而要實現分散式,只需要在這個starts_urls裡面做文章就行了。進一步描述如下:
-
master 產生 starts_urls,url 會被封裝成 request 放到 redis 中的 spider:requests,總的 scheduler 會從這裡分配 request,當這裡的 request 分配完後,會繼續分配 start_urls 裡的 url。
-
slave 從 master 的 redis 中取出待抓取的 request,下載完網頁之後就把網頁的內容傳送回 master 的 redis,key 是 spider:items。scrapy 可以通過 settings 來讓 spider 爬取結束之後不自動關閉,而是不斷的去詢問佇列裡有沒有新的 url,如果有新的 url,那麼繼續獲取 url 並進行爬取,所以這一過程將不斷迴圈。
-
master 裡的 reids 還有一個 key 是 “spider:dupefilter” 用來儲存抓取過的 url 的 fingerprint(使用雜湊函式將url運算後的結果),防止重複抓取,只要 redis 不清空,就可以進行斷點續爬。
對於已有的 scrapy 程式,對其擴充套件成分散式程式還是比較容易的。總的來說就是以下幾步:
- 找一臺高效能伺服器,用於 redis 佇列的維護以及資料的儲存。
- 擴充套件 scrapy 程式,讓其通過伺服器的 redis 來獲取 start_urls,並改寫 pipeline 裡資料儲存部分,把儲存地址改為伺服器地址。
- 在伺服器上寫一些生成url的指令碼,並定期執行。
關於 scheduler 到底是怎麼進行排程的,需要看原始碼進行分析。
原始碼分析
可能上面的描述還是不夠清楚,乾脆看一下原始碼吧,scrapy-redis 主要要一下幾個檔案。
零件分析
-
connection.py
根據 settings 裡的配置例項化 redis 連線,被 dupefilter 和 scheduler 呼叫。 -
dupefilter.py
對 request 進行去重,使用了 redis 的 set。 -
queue.py
三種 queue, SpiderQueue(FIFO), SpiderPriorityQueue,以及 SpiderStack(LIFI)。預設使用的是第二種。 -
pipelines.py
分散式處理,將 item 儲存在 redis 中。 -
scheduler.py
取代 scrapy 自帶的 scheduler,實現分散式排程,資料結構來自 queue。 -
spider.py
定義 RedisSpider.py, 繼承了 RedisMixin 和 CrawlSpider。
由上可知,scrapy-redis 實現的爬蟲分散式和item處理分散式就是由模組 scheduler 和模組 pipelines 實現。上述其它模組作為為二者輔助的功能模組。
排程過程
初始化
spider 被初始化時,同時會初始化一個對應的 scheduler 物件,這個排程器物件通過讀取 settings,配置好自己的排程容器 queue 和判重工具dupefilter。
判重 & 進入排程池
每當一個 spider 產出一個 request 的時候,scrapy 核心會把這個 request 遞交給這個 spider 對應的 scheduler 物件進行排程,scheduler 物件通過訪問 redis 對 request 進行判重,如果不重複就把他新增進 redis 中的排程池。
排程
當排程條件滿足時,scheduler 物件就從 redis 的排程池中取出一個 request 傳送給spider,讓 spider 爬取,若爬取過程中返回更多的url,那麼繼續進行直至所有的 request 完成。在這個過程中通過 connect signals.spider_idle 訊號對 crawler 狀態的監視,scheduler 物件發現 這個 spider 爬取了所有暫時可用 url,對應的 redis 的排程池空了,於是觸發訊號 spider_idle,spider收到這個訊號之後,直接連線 redis 讀取 strart_url池,拿去新的一批 url,返回新的 make_requests_from_url(url) 給引擎,進而交給排程器排程。
熟悉了原理其實可以自己來寫 scheduler,自己定義排程優先順序和順序,
相關推薦
爬蟲總結(四)-- 分散式爬蟲
分散式爬蟲的演習。 分散式爬蟲問題其實也就是多臺機器多個 spider 對 多個 url 的同時處理問題,怎樣 schedule 這些 url,怎樣彙總 spider 抓取的資料。最簡單粗暴的方法就是將 url 進行分片,交給不同機器,最後對不同機器抓取的資料進行彙總。然而這樣每個 spider 只能對自己
爬蟲技術之分散式爬蟲架構
分散式爬蟲架構並不是一開始就出現的。而是一個逐步演化的過程。 最開始入手寫爬蟲的時候,我們一般在個人計算機上完成爬蟲的入門和開發,而在真實的生產環境,就不能用個人計算機來執行爬蟲程式了,而是將爬蟲程式部署在伺服器上。利用伺服器不關機的特性,爬蟲可以不間斷的24小時執行。單機爬蟲的結構如下圖。
分散式爬蟲原理之分散式爬蟲原理
我們在前面已經實現了Scrapy微博爬蟲,雖然爬蟲是非同步加多執行緒的,但是我們只能在一臺主機上執行,所以爬取效率還是有限的,分散式爬蟲則是將多臺主機組合起來,共同完成一個爬取任務,這將大大提高爬取的效率。一、分散式爬蟲架構在瞭解分散式爬蟲架構之前,首先回顧一下Scrapy的
Python3爬蟲之四簡單爬蟲架構【爬取百度百科python詞條網頁】
前面介紹了Python寫簡單的爬蟲程式,這裡參考慕課網Python開發簡單爬蟲總結一下爬蟲的架構。讓我們的爬蟲程式模組劃分更加明確,程式碼具有更佳的邏輯性、可讀性。因此,我們可以將整個
第一章 python分散式爬蟲打造搜尋引擎環境搭建 第四節Centos7安裝python3詳細步驟
今天來講解一下Linux系統下如何安裝python3版本!眾所周知,centos7自帶python2.7的版本,這個版本被系統很多程式所依賴,所以不建議刪除,如果使用最新的Python3那麼我們知道編譯安裝原始碼包和系統預設包之間是沒有任何影響的
python3.X 爬蟲針對拉鉤,直聘,大街等招聘網站的簡歷爬蟲遇到的ip代理的總結四( pycharm執行,程式碼篇)
這裡面主要講解的是兩個大方向的程式碼: 一個是selenium+chrome中的ip代理: from selenium import webdriver chromeOptions = webdriver.ChromeOptions() # 設定代理 chromeO
python3.6爬蟲總結-01
zed 3.6 執行 pre created highlight log style size 1. HTTP 簡介 HTTP常見狀態碼 200/OK: 請求成功 201/Created: 請求已被實現,且一個新資源已根據請求被建立,URI跟隨Location頭信息返回。
第四篇 爬蟲去重策略,以及編碼問題
english sci 不同 方法 查看 traceback 爬蟲 ascii error: unicode和utf-8編碼 PS:數據在內存裏,使用unicode編碼會方便很多,因為這樣占用的bit是統一的,而utf8對於不同的語言占用的bit不
反爬蟲總結
防盜 json 很好 事情 常見 間隔 request 兩種 固然是 從功能上來講,爬蟲一般分為數據采集,處理,儲存三個部分。這裏我們只討論數據采集部分。 一般網站從三個方面反爬蟲:用戶請求的Headers,用戶行為,網站目錄和數據加載方式。前兩種比較容易遇到,大多數網站都
Python爬蟲(十四)_BeautifulSoup4 解析器
標準 屬性 文檔轉換 可選 blog 格式 問題 但是 結構 CSS選擇器:BeautifulSoup4 和lxml一樣,Beautiful Soup也是一個HTML/XML的解析器,主要的功能也是如何解析和提取HTML/XML數據。 lxml只會局部遍歷,而Beauti
爬蟲筆記四
perror 遇到 access 停止 sed allow time out ref lec 一、Requests快速入門 1.發送請求 import requests # 常見的請求方式 get post r = requests.get(‘https
C# 爬蟲總結
res com cap next name reg quest int read static void Main(string[] args) { //WebRequest request = WebRequest.Create("h
Python學習之路 (四)爬蟲(三)HTTP和HTTPS
CP 發出 net 長度 現在 消息頭 理論 LV 模型 HTTP和HTTPS HTTP協議(HyperText Transfer Protocol,超文本傳輸協議):是一種發布和接收 HTML頁面的方法。 HTTPS(Hypertext Transfer Protoc
Python學習之路 (五)爬蟲(四)正則表示式爬去名言網
auth Python標準庫 我們 color 匯總 eight code 比較 school 爬蟲的四個主要步驟 明確目標 (要知道你準備在哪個範圍或者網站去搜索) 爬 (將所有的網站的內容全部爬下來) 取 (去掉對我們沒用處的數據) 處理數據(按照我們想要的
最全Python爬蟲總結(轉載)
其中 網頁 -i 變量 oba cati nod style 應該 [html] view plain copy 最近總是要爬取一些東西,索性就把Python爬蟲的相關內容都總結起來了,自己多動手還是好。 (1)普通的內容爬取(2)保存爬取的圖片/
Python3爬蟲(四)請求庫的使用requests
with open decode python3 url -c highlight pos pen req Infi-chu: http://www.cnblogs.com/Infi-chu/ 一、基本用法: 1. 安裝: pip install requests 2
python爬蟲總結
use 禁止訪問 不同 安裝docker 初學者 http sel 類型 破解 [TOC] 由於某些原因最近終於可以從工作的瑣事中抽出身來,有時間把之前的一些爬蟲知識進行了一個簡單的梳理,也從中體會到階段性地對過往知識進行梳理是真的很有必要。 常用第三方庫 對於爬蟲初學者
如何優雅的落地一個分散式爬蟲:實戰篇
本篇文章將從實戰角度來介紹如何構建一個穩健的分散式微博爬蟲。這裡我沒敢談高效,抓過微博資料的同學應該都知道微博的反爬蟲能力,也知道微博資料抓取的瓶頸在哪裡。我在知乎上看過一些同學的說法,把微博的資料抓取難度簡單化了,我只能說,那是你太naive,沒深入瞭解和長期抓取而已。 本文將會以PC端微博進行講解,因為
自學python爬蟲(四)Requests+正則表示式爬取貓眼電影
前言 學了requests庫和正則表示式之後我們可以做個簡單的專案來練練手咯!先附上專案GitHub地址,歡迎star和fork,也可以pull request哦~ 地址:https://github.com/zhangyanwei233/Maoyan100.git 正文開始哈哈哈
python 爬蟲總結
一,爬蟲是什麼 爬蟲:一段自動抓取網際網路資訊的程式,從網際網路上抓取對於我們有價值的資訊。 二,爬蟲的基本構架 爬蟲分為五個基本構架: 排程器:相當於一臺電腦的CPU,主要負責排程URL管理器、下載器、解析器之間的協調工作。 URL管理器:包括待爬取的URL地址和已爬