爬虫学习笔记(二十四)—— pyspider框架
文章目錄
- 一、框架介紹
- 1.1、簡介
- 1.2、安裝(windows)
- 1.3、Phantomjs 無界面瀏覽器
- 二、框架入門
- 2.1、啟動pyspider
- 2.2、創(chuàng)建一個項目
- 2.3、腳本
- 2.4、運行項目
- 三、小案例:豆瓣250信息
- 四、架構
- 4.1、概述
- 4.2、組件
- 4.3、關于任務
- 4.4、關于項目
- 五、API參考(self.crawl)
一、框架介紹
1.1、簡介
pyspider 是個強大的由python實現的爬蟲系統。
- 純python的
- 強大的webui,支持腳本編輯,任務監(jiān)控,項目管理和結果查看
- 數據后臺支持,MySQL,MongoDB,Reids,SQLite,Elasticsearch,PostgreSQL和SQLAlchemy
- 消息隊列支持,RabbitMQ,Beanstalk,Redis以及Kombu
- 支持任務優(yōu)先級,定時,失敗重試等調度方案
- 分布式架構,抓取js頁面
- 支持Python2和3
1.2、安裝(windows)
下載 pyspider
方式一:pip install pyspider
方式二(建議):pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyspider
下載出錯
1、運行 pyspider 運行報錯誤:
ValueError: Invalid configuration: - Deprecated option 'domaincontroller': use 'http_authenticator.domain_controller' instead.解決方案:刪除wsgidav 然后重新安裝2.4.1版本
(1)where wsgidav找到wsgidav的位置,刪除wsgidav.exe
(2)pip install wsgidav==2.4.1 安裝2.4.1版本
2、再次運行 pyspider 報錯
ImportError: cannot import name 'DispatcherMiddleware'解決方案:
3、再次運行 `pyspider` 運行成功
如果出現:
ImportError: cannot import name 'ContextVar'你可以看下你在 成功執(zhí)行下面語句時 有沒有出現下面情況
pip install werkzeug==0.16.0這個是你flask版本的問題,你只要降低下flask版本就行了
pip uninstall flask #卸載 pip install flask==1.0 #我這里改成1.0就行了,改成其他低版本應該也沒問題,有興趣自己試下1.3、Phantomjs 無界面瀏覽器
(windows環(huán)境)
(用途:就是可以執(zhí)行js代碼。。。)
1、下載
http://phantomjs.org/download.html
2、解壓(phantomjs-2.1.1-windows.zip)
3、配置環(huán)境變量
將解壓的bin目錄的路徑配置到環(huán)境變量中去
二、框架入門
2.1、啟動pyspider
安裝好pyspider后,創(chuàng)建一個項目文件夾用來存放相關文件,進入文件夾后運行pyspider命令,默認情況下會運行一個web服務端監(jiān)聽5000端口,通過127.0.0.1:5000即可訪問pyspider的web管理界面,它看起來是這樣的:
2.2、創(chuàng)建一個項目
點擊右邊的Create按鈕,在彈出框里,填寫項目名稱,和起始url 。
創(chuàng)建完成后,窗口右邊部分為代碼編輯器,在這里你可以編寫你的爬蟲腳本。
2.3、腳本
from pyspider.libs.base_handler import *class Handler(BaseHandler):crawl_config = {}@every(minutes=24 * 60)def on_start(self):self.crawl('http://scrapy.org/', callback=self.index_page)@config(age=10 * 24 * 60 * 60)def index_page(self, response):for each in response.doc('a[href^="http"]').items():self.crawl(each.attr.href, callback=self.detail_page)@config(priority=2)def detail_page(self, response):return {"url": response.url,"title": response.doc('title').text(),}- def on_start(selef)是腳本的入口。當你點擊run按鈕時,它會被調用。
- self.crawl(url, callback=self.index_page)是最重要的接口。它會添加一個新的待爬取任務。大部分的設置可以通過self.crawl的參數去指定。
- def index_page(self, response)接收一個response對象。response.doc是一個pyquery對象,它有一個類似jQuery選擇器一樣的接口,去解析頁面元素。
- def detail_page(self, response)返回一個字典結果。這個結果默認會被寫入resultdb(結果數據庫)。你可以通過復寫on_result(self, result)方法來按照你自己的需求處理結果。
- @every(minutes=24 * 60)這個裝飾器會告訴調度器,on_start方法將會每天被調用。
- @config(age=10 * 24 * 60 * 60)指定當self.crawl爬取的頁面類型為index_page(當callback=self.index_page)時的age參數的默認值。參數age可以通過self.crawl(url, age=10*24*60*60)和crawl_config來指定,直接在方法參數中指定具有最高的優(yōu)先級。
- age=10*24*60*60告訴調度器拋棄10天內爬取過的請求。默認情況下,相同URL不會被爬取兩次,甚至你修改了代碼。對于初學者來說,第一次運行項目然后修改它,在第二次運行項目的情況非常常見,但是它不會再次爬行(閱讀itag了解解決方案)
- @config(priority=2)標志著,detail page將會被優(yōu)先爬取。
你可以通過點擊綠色的run按鈕,一步一步的調試你的腳本。切換到follows面板,點擊play按鈕前進。
2.4、運行項目
保存腳本
返回后臺首頁,找到你的項目
改變status為DEBUG或RUNNING
點擊按鈕run
補充:
刪除項目:將status改為stop,將group改為delete,然后24小時后才會被刪除(注意pyspider沒法直接刪除項目,只能這樣等24小時就會自動刪除)
三、小案例:豆瓣250信息
from pyspider.libs.base_handler import * import jsonclass Handler(BaseHandler):crawl_config = {}@every(minutes=24 * 60)def on_start(self):print('開始啦')self.crawl('https://movie.douban.com/top250', callback=self.index_page,validate_cert=False)@config(age=10 * 24 * 60 * 60)def index_page(self, response):all_mes = response.etree.xpath('//div[@class="info"]')with open('film_mes.txt','w',encoding='utf-8') as f:for mes in all_mes:film_name = mes.xpath('./div/a/span[1]/text()')[0]score = mes.xpath('./div/div/span[2]/text()')[0]director = mes.xpath('./div/p/text()')[0].strip()item=dict()item['film_name'] = film_nameitem['score'] = scoreitem['director'] = directordata=json.dumps(item,ensure_ascii=False)+'\n'f.write(data)@config(priority=2)def detail_page(self, response):return {"url": response.url,"title": response.doc('title').text(),}四、架構
4.1、概述
下圖顯示了pyspider體系結構及其組件的概述,以及系統內部發(fā)生的數據流的概要。
組件之間通過消息隊列進行連接。每一個組件都包含消息隊列,都在它們自己的進程/線程中運行,并且是可以替換的。這意味者,當處理速度緩慢時,可以通過啟動多個processor實例來充分利用多核cpu,或者進行分布式部署。
4.2、組件
1、Scheduler
調度器從processor返回的新任務隊列中接收任務。判斷是新任務還是需要重新爬取。通過優(yōu)先級對任務進行分類,并且利用令牌桶算法將任務發(fā)送給fetcher. 處理周期任務,丟失的任務和失敗的任務,并且稍后重試。
以上都可以通過self.crawl進行設置。
注意,在當前的調度器實現中,只允許一個調度器。
2、Fetcher
Fetcher的職責是獲取web頁面然后把結果發(fā)送給processor。請求method, headers, cookies, proxy, etag 等,都可以設置。
3、Processor
處理器的職責是運行用戶編寫的腳本,去解析和提取信息。您的腳本在無限制的環(huán)境中運行。盡管我們有各種各樣的工具(如風PyQuery)供您提取信息和連接,您可以使用任何您想使用的方法來處理響應。
處理器會捕捉異常和記錄日志,發(fā)送狀態(tài)(任務跟蹤)和新的任務給調度器,發(fā)送結果給Result Worker
4、Result Worker
Result Worker從Porcess接收結果。Pyspider有一個內置的結果處理器將數據保存到resultdb.根據您的需要重寫它以處理結果。
5、WebUI
WebUI是一個面向所有內容的web前端。它包含:
- 腳本編輯器,調試器
- 項目管理器
- 任務監(jiān)控程序
- 結果查看器和導出
也許webui是pyspider最吸引人的地方。使用這個強大的UI,您可以像pyspider一樣一步一步地調試腳本。啟動停止項目。找到哪個項目出錯了,什么請求失敗了,然后使用調試器再試一次。
6、Data flow
pyspider中的數據流如上圖所示:
4.3、關于任務
任務是調度的基本單元。
基本原理
- 任務由它的taskid(默認:md5(url), 可以通過重寫get_taskid(self, task)方法來修改)來區(qū)分。
- 不同項目之間的任務是隔離的
- 一個任務有4個狀態(tài):
- active
- failed
- success
- bad-not used
- 只有處于active狀態(tài)的任務會被調度
- 任務按優(yōu)先次序執(zhí)行。
調度
當一個新的任務(從未見過)出現:
- 如果設置了exetime但沒有到達,它將被放入一個基于時間的隊列中等待。
- 否則將被接受。
當任務已經在隊列中:
- 除非(force_update)強制更新,否則忽略
當一個完成過的任務出現時:
- 如果age設置,且last_crawl_time + age < now 它將會被接受,否則拋棄。
- 如果itag設置,且它不等于上一次的值,它會被接受,否則拋棄。
當請求錯誤或腳本錯誤發(fā)生時,任務將在默認情況下重試3次。
第一次重試將在30秒、1小時、6小時、12小時后每次執(zhí)行,任何更多的重試將推遲24小時。retry_delay是一個指定重試間隔的字典。這個字典中的元素是{retried:seconds}, 如果未指定,則使用特殊鍵:''空字符串指定的默認推遲時間。
例如默認的retry_delay聲明如下:
class MyHandler(BaseHandler): retry_delay = {0: 30,1: 1*60*60,2: 6*60*60,3: 12*60*60,'': 24*60*60 }4.4、關于項目
在大多數情況下,項目是為一個網站編寫的一個腳本。
- 項目是獨立的,但是可以用from Projects import other_project將另一個項目作為模塊導入
- 一個項目有5個狀態(tài):TODO,STOP,CHECKING,DEBUG和RUNNING
- TODO - 剛創(chuàng)建,正在編寫腳本
- 如果您希望項目停止(= =),可以將其標記為STOP。
- CHECKING - 當正在運行的項目被修改時,為了防止未完成的修改,項目狀態(tài)將被設置為自動檢查。
- DEBUG/RUNNING - 這兩種狀態(tài)對爬蟲沒有區(qū)別。但最好在第一次運行時將其標記為DEBUG,然后在檢查后將其更改為RUNNING。
- 爬行速率由rate 和burst并采用令牌桶算法進行控制。
- rate - 一秒鐘內有多少請求
- burst - 考慮這種情況,RATE/BURST=0.1/3,這意味著蜘蛛每10秒抓取1個頁面。所有任務都已完成,Project將每分鐘檢查最后更新的項目。假設找到3個新項目,pyspider將“爆發(fā)”并爬行3個任務,而不等待3*10秒。但是,第四個任務需要等待10秒。
- 若要刪除項目,請將“組”設置為“刪除”,將“狀態(tài)”設置為“停止”,然后等待24小時。
回調on_finished
您可以在項目中重寫on_finished方法,當task_queue變?yōu)?時將觸發(fā)該方法。
第一種情況:當您啟動一個項目來抓取一個包含100個頁面的網站時,當100個頁面被成功抓取或重試失敗時,on_finished回調將被觸發(fā)。
第二種情況:帶有auto_recrawl任務的項目永遠不會觸發(fā)on_finished回調,因為當其中有auto_recrawl任務時,時間隊列永遠不會變?yōu)?。
第三種情況:帶有@every修飾方法的項目將在每次新提交的任務完成時觸發(fā)on_finished回調。
五、API參考(self.crawl)
官方文檔地址:http://docs.pyspider.org/en/latest/apis/self.crawl/
部分參數整理
url:統一資源定位符 callback:回調函數 method:請求方法 params:請求參數 data;form表單數據 age:過期時間 priority:權限,優(yōu)先級 exetime:執(zhí)行時間 retries:重試次數 itag:頁面標識 auto_recrawl:自動重爬user_agent:用戶代理 headers:請求頭 cookies:cookies connect_timeout:連接超時 timeout:響應超時 allow_redirects:允許重定向 validate_cert:證書驗證 proxy:代理 fetch_type:抓取方式 save:參數傳遞總結
以上是生活随笔為你收集整理的爬虫学习笔记(二十四)—— pyspider框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爬虫学习笔记(二十三)—— Appium
- 下一篇: 学习笔记(二十)—— 网络编程