日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

爬虫学习笔记(二十四)—— pyspider框架

發布時間:2025/3/21 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 爬虫学习笔记(二十四)—— pyspider框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、框架介紹
    • 1.1、簡介
    • 1.2、安裝(windows)
    • 1.3、Phantomjs 無界面瀏覽器
  • 二、框架入門
    • 2.1、啟動pyspider
    • 2.2、創建一個項目
    • 2.3、腳本
    • 2.4、運行項目
  • 三、小案例:豆瓣250信息
  • 四、架構
    • 4.1、概述
    • 4.2、組件
    • 4.3、關于任務
    • 4.4、關于項目
  • 五、API參考(self.crawl)

一、框架介紹

1.1、簡介

pyspider 是個強大的由python實現的爬蟲系統。

  • 純python的
  • 強大的webui,支持腳本編輯,任務監控,項目管理和結果查看
  • 數據后臺支持,MySQL,MongoDB,Reids,SQLite,Elasticsearch,PostgreSQL和SQLAlchemy
  • 消息隊列支持,RabbitMQ,Beanstalk,Redis以及Kombu
  • 支持任務優先級,定時,失敗重試等調度方案
  • 分布式架構,抓取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'

解決方案:

  • 卸載
  • pip uninstall werkzeug
  • 安裝指定版本
  • pip install werkzeug==0.16.0
    3、再次運行 `pyspider` 運行成功

    如果出現:

    ImportError: cannot import name 'ContextVar'

    你可以看下你在 成功執行下面語句時 有沒有出現下面情況

    pip install werkzeug==0.16.0

    這個是你flask版本的問題,你只要降低下flask版本就行了

    pip uninstall flask #卸載 pip install flask==1.0 #我這里改成1.0就行了,改成其他低版本應該也沒問題,有興趣自己試下

    1.3、Phantomjs 無界面瀏覽器

    (windows環境)
    (用途:就是可以執行js代碼。。。)

    1、下載

    http://phantomjs.org/download.html

    2、解壓(phantomjs-2.1.1-windows.zip)
    3、配置環境變量
    將解壓的bin目錄的路徑配置到環境變量中去


    二、框架入門

    2.1、啟動pyspider

    安裝好pyspider后,創建一個項目文件夾用來存放相關文件,進入文件夾后運行pyspider命令,默認情況下會運行一個web服務端監聽5000端口,通過127.0.0.1:5000即可訪問pyspider的web管理界面,它看起來是這樣的:


    2.2、創建一個項目

    點擊右邊的Create按鈕,在彈出框里,填寫項目名稱,和起始url 。

    創建完成后,窗口右邊部分為代碼編輯器,在這里你可以編寫你的爬蟲腳本。


    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來指定,直接在方法參數中指定具有最高的優先級。
    • age=10*24*60*60告訴調度器拋棄10天內爬取過的請求。默認情況下,相同URL不會被爬取兩次,甚至你修改了代碼。對于初學者來說,第一次運行項目然后修改它,在第二次運行項目的情況非常常見,但是它不會再次爬行(閱讀itag了解解決方案)
    • @config(priority=2)標志著,detail page將會被優先爬取。

    你可以通過點擊綠色的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體系結構及其組件的概述,以及系統內部發生的數據流的概要。

    組件之間通過消息隊列進行連接。每一個組件都包含消息隊列,都在它們自己的進程/線程中運行,并且是可以替換的。這意味者,當處理速度緩慢時,可以通過啟動多個processor實例來充分利用多核cpu,或者進行分布式部署。


    4.2、組件

    1、Scheduler

    調度器從processor返回的新任務隊列中接收任務。判斷是新任務還是需要重新爬取。通過優先級對任務進行分類,并且利用令牌桶算法將任務發送給fetcher. 處理周期任務,丟失的任務和失敗的任務,并且稍后重試。

    以上都可以通過self.crawl進行設置。

    注意,在當前的調度器實現中,只允許一個調度器。


    2、Fetcher

    Fetcher的職責是獲取web頁面然后把結果發送給processor。請求method, headers, cookies, proxy, etag 等,都可以設置。


    3、Processor

    處理器的職責是運行用戶編寫的腳本,去解析和提取信息。您的腳本在無限制的環境中運行。盡管我們有各種各樣的工具(如風PyQuery)供您提取信息和連接,您可以使用任何您想使用的方法來處理響應。

    處理器會捕捉異常和記錄日志,發送狀態(任務跟蹤)和新的任務給調度器,發送結果給Result Worker


    4、Result Worker

    Result Worker從Porcess接收結果。Pyspider有一個內置的結果處理器將數據保存到resultdb.根據您的需要重寫它以處理結果。


    5、WebUI

    WebUI是一個面向所有內容的web前端。它包含:

    • 腳本編輯器,調試器
    • 項目管理器
    • 任務監控程序
    • 結果查看器和導出

    也許webui是pyspider最吸引人的地方。使用這個強大的UI,您可以像pyspider一樣一步一步地調試腳本。啟動停止項目。找到哪個項目出錯了,什么請求失敗了,然后使用調試器再試一次。


    6、Data flow

    pyspider中的數據流如上圖所示:

  • 當您按下WebUI上的Run按鈕時,每個腳本都有一個名為on_start的回調。作為項目的入口,on_start產生的新任務將會提交給調度器。
  • 調度程序使用一個數據URI將這個on_start任務分派為要獲取的普通任務。
  • Fetcher對它發出一個請求和一個響應(對于數據URI,它是一個假的請求和響應,但與其他正常任務沒有區別),然后送給處理器。
  • 處理器調用on_start方法并生成一些要抓取的新URL。處理器向調度程序發送一條消息,說明此任務已完成,并通過消息隊列將新任務發送給調度程序(在大多數情況下,這里沒有on_start的結果。如果有結果,處理器將它們發送到result_queue)。
  • 調度程序接收新任務,在數據庫中查找,確定任務是新的還是需要重新抓取,如果是,將它們放入任務隊列。按順序分派任務。
  • 這個過程重復(從步驟3開始),直到WWW死后才停止;-)。調度程序將檢查定期任務,以抓取最新數據。

  • 4.3、關于任務

    任務是調度的基本單元。

    基本原理

    • 任務由它的taskid(默認:md5(url), 可以通過重寫get_taskid(self, task)方法來修改)來區分。
    • 不同項目之間的任務是隔離的
    • 一個任務有4個狀態:
      • active
      • failed
      • success
      • bad-not used
    • 只有處于active狀態的任務會被調度
    • 任務按優先次序執行。

    調度

  • 新任務
  • 當一個新的任務(從未見過)出現:

    • 如果設置了exetime但沒有到達,它將被放入一個基于時間的隊列中等待。
    • 否則將被接受。

    當任務已經在隊列中:

    • 除非(force_update)強制更新,否則忽略

    當一個完成過的任務出現時:

    • 如果age設置,且last_crawl_time + age < now 它將會被接受,否則拋棄。
    • 如果itag設置,且它不等于上一次的值,它會被接受,否則拋棄。
  • 重試
  • 當請求錯誤或腳本錯誤發生時,任務將在默認情況下重試3次。

    第一次重試將在30秒、1小時、6小時、12小時后每次執行,任何更多的重試將推遲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個狀態:TODO,STOP,CHECKING,DEBUG和RUNNING
      • TODO - 剛創建,正在編寫腳本
      • 如果您希望項目停止(= =),可以將其標記為STOP。
      • CHECKING - 當正在運行的項目被修改時,為了防止未完成的修改,項目狀態將被設置為自動檢查。
      • DEBUG/RUNNING - 這兩種狀態對爬蟲沒有區別。但最好在第一次運行時將其標記為DEBUG,然后在檢查后將其更改為RUNNING。
    • 爬行速率由rate 和burst并采用令牌桶算法進行控制。
      • rate - 一秒鐘內有多少請求
      • burst - 考慮這種情況,RATE/BURST=0.1/3,這意味著蜘蛛每10秒抓取1個頁面。所有任務都已完成,Project將每分鐘檢查最后更新的項目。假設找到3個新項目,pyspider將“爆發”并爬行3個任務,而不等待3*10秒。但是,第四個任務需要等待10秒。
    • 若要刪除項目,請將“組”設置為“刪除”,將“狀態”設置為“停止”,然后等待24小時。

    回調on_finished

    您可以在項目中重寫on_finished方法,當task_queue變為0時將觸發該方法。

    第一種情況:當您啟動一個項目來抓取一個包含100個頁面的網站時,當100個頁面被成功抓取或重試失敗時,on_finished回調將被觸發。

    第二種情況:帶有auto_recrawl任務的項目永遠不會觸發on_finished回調,因為當其中有auto_recrawl任務時,時間隊列永遠不會變為0。

    第三種情況:帶有@every修飾方法的項目將在每次新提交的任務完成時觸發on_finished回調。


    五、API參考(self.crawl)

    官方文檔地址:http://docs.pyspider.org/en/latest/apis/self.crawl/

    部分參數整理

    url:統一資源定位符 callback:回調函數 method:請求方法 params:請求參數 data;form表單數據 age:過期時間 priority:權限,優先級 exetime:執行時間 retries:重試次數 itag:頁面標識 auto_recrawl:自動重爬user_agent:用戶代理 headers:請求頭 cookies:cookies connect_timeout:連接超時 timeout:響應超時 allow_redirects:允許重定向 validate_cert:證書驗證 proxy:代理 fetch_type:抓取方式 save:參數傳遞

    總結

    以上是生活随笔為你收集整理的爬虫学习笔记(二十四)—— pyspider框架的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。