Pyspider爬蟲簡單框架
阿新 • • 發佈:2018-11-10
pyspide
目錄
一個國人編寫的強大的網路爬蟲系統並帶有強大的WebUI。採用Python語言編寫,分散式架構,支援多種資料庫後端,
強大的WebUI支援指令碼編輯器,任務監視器,專案管理器以及結果檢視器
官方文件: http://docs.pyspider.org/en/latest/
開源地址: http://github.com/binux/pyspider
中文文件: http://www.pyspider.cn/
pyspider框架的特性
- python指令碼控制,可以使用用任何你喜歡的html解析包(內建pyquery)
- WEB介面編寫除錯指令碼,啟停指令碼,監控執行狀態,檢視活動內容,獲取結果產出
- 資料庫儲存支援MySQl,MongoDB,Redis,SQLite,Elasticsearch,PostgreSQL及SQLAlchemy
- 佇列服務支援RabbitMQ,Beanstalk,Redis和Kombu
- 支援抓取JavaScript的頁面
- 元件可替換,支援單機/分散式部署,支援Docker的部署
- 強大的排程控制,支援超時重爬及優先順序設定
- 支援python2&3
pyspider的安裝
pip install pyspider
- 安裝完成後執行,在cmd視窗輸入pyspider
- 在瀏覽器中輸入最後一行的IP和埠號。
- 在web控制檯點create按鈕新建專案。
- 儲存後開啟程式碼編輯器(程式碼編輯器預設有簡單的示例程式碼)
- 右側就是程式碼編輯器,,以後可以直接在這裡新增和修改程式碼。程式碼如下:
程式碼分析:
- def on_start(self)方法是入口程式碼。當在web控制檯點選run按鈕時會執行此方法。
- self.crawl(url, callback=self.index_page)這個方法是呼叫API生成一個新的爬蟲任務,這個任務被新增到待爬取佇列
- def index_page(self.response)這個方法獲取一個response物件。response.doc是pyquery物件的一個擴充套件方法。pyquery是一個類似於jquery的物件選擇器。
- def detail_page(self, response)返回一個結果即物件。這個結果預設會被新增到resultdb資料庫(如果啟動時沒有指定資料庫預設呼叫sqlite資料庫)。也可以重寫on_result(self, result) 方法來指定儲存位置。
- 當完成指令碼編寫,除錯無誤後,請先儲存指令碼,然後返回控制檯首頁
- 直接點選專案狀態status那欄,把狀態由TTODO改成debug或running
- 最後點選專案最右邊那個RUN按鈕啟動專案
- 當progress那欄有資料顯示說明啟動成功。就可以點選右側的result檢視結果了
技巧:
- 當需要刪除專案時,將status狀態改成STOP,再將group寫上delete,pyspider預設在STOP的delete狀態下儲存24小時後刪除
enable css selector helper可以在點選了web 的網頁預覽下,獲取網頁的css選擇器
點選圖片箭頭的按鍵,就會生成對應css選擇器在游標所在的位置處
- follows是根據程式碼請求所跟進的url連結,點選實現網頁跳轉
- 當代碼調試出錯的時候,要回到最初的首頁開始重新除錯
爬取鏈家網的資訊:
#!/usr/bin/env python # -*- encoding: utf-8 -*- # Created on 2018-11-02 10:54:11 # Project: ddd from pyspider.libs.base_handler import * class Handler(BaseHandler): crawl_config = { } @every(minutes=24 * 60) def on_start(self): self.crawl('https://cs.lianjia.com/ershoufang/', callback=self.index_page, validate_cert = False) @config(age=10 * 24 * 60 * 60) def index_page(self, response): for each in response.doc('.title > a').items(): self.crawl(each.attr.href, callback=self.detail_page, validate_cert = False) @config(priority=2) def detail_page(self, response): yield { 'title': response.doc('.main').text(), 'special': response.doc('.tags > .content').text(), 'price': response.doc('.price > .total').text(), 'sell point': response.doc('.baseattribute > .content').text() }
結果:分別爬取了賣房的標題(title),特點(special),賣點(sell point)和價格(price),因為字典儲存,所以無序