1. 程式人生 > >Pyspider爬蟲簡單框架

Pyspider爬蟲簡單框架

pyspide

目錄

pyspider簡單介紹

pyspider的使用

實戰

 


 

 

pyspider簡單介紹

  一個國人編寫的強大的網路爬蟲系統並帶有強大的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

 

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),因為字典儲存,所以無序