Python爬蟲之Pyspider使用

25minutes發表於2021-09-11

Python爬蟲之Pyspider使用

1 簡介

pyspider 是一個支援任務監控、專案管理、多種資料庫,具有 WebUI 的爬蟲框架,它採用 Python 語言編寫,分散式架構。詳細特性如下:

·擁有 Web 指令碼編輯介面,任務監控器,專案管理器和結構檢視器;

·資料庫支援 MySQL、MongoDB、Redis、SQLite、Elasticsearch、PostgreSQL、SQLAlchemy;

·佇列服務支援 RabbitMQ、Beanstalk、Redis、Kombu;

·支援抓取 JavaScript 的頁面;

·元件可替換,支援單機、分散式部署,支援 Docker 部署;

·強大的排程控制,支援超時重爬及優先順序設定;

·支援 Python2&3。

pyspider 主要分為 Scheduler(排程器)、 Fetcher(抓取器)、 Processer(處理器)三個部分,整個爬取過程受到 Monitor(監控器)的監控,抓取的結果被 Result Worker(結果處理器)處理。基本流程為:Scheduler 發起任務排程,Fetcher 抓取網頁內容,Processer 解析網頁內容,再將新生成的 Request 發給 Scheduler 進行排程,將生成的提取結果輸出儲存。

2 pyspider vs scrapy

·pyspider 擁有 WebUI,爬蟲的編寫、除錯可在 WebUI 中進行;Scrapy 採用採用程式碼、命令列操作,實現視覺化需對接 Portia。

·pyspider 支援使用 PhantomJS 對 JavaScript 渲染頁面的採集 ;Scrapy 需對接 Scrapy-Splash 元件。

·pyspider 內建了 PyQuery(Python 爬蟲(五):PyQuery 框架) 作為選擇器;Scrapy 對接了 XPath、CSS 選擇器、正則匹配。

·pyspider 擴充套件性弱;Scrapy 模組之間耦合度低,擴充套件性強,如:對接 Middleware、 Pipeline 等元件實現更強功能。

總的來說,pyspider 更加便捷,Scrapy 擴充套件性更強,如果要快速實現爬取優選 pyspider,如果爬取規模較大、反爬機制較強,優選 scrapy。

3 安裝

3.1 方式一

pip install pyspider

這種方式比較簡單,不過在 Windows 系統上可能會出現錯誤:Command "python setup.py egg_info" failed with error ...,我在自己的 Windows 系統上安裝時就遇到了該問題,因此,選擇了下面第二種方式進行了安裝。

3.2 方式二

使用 wheel 方式安裝。步驟如下:

·pip install wheel 安裝 wheel;

·開啟網址 ~gohlke/pythonlibs/,使用 Ctrl + F 搜尋 pycurl,根據自己安裝的 Python 版本,選擇合適的版本下載,比如:我用的 Python3.6,就選擇帶有 cp36 標識的版本。如下圖紅框所示:

Python爬蟲之Pyspider使用

·使用 pip 安裝下載檔案,如:pip install E:pycurl-7.43.0.3-cp36-cp36m-win_amd64.whl;

·最後還是使用 pip install pyspider 安裝。

執行以上安裝步驟後,我們在控制檯輸入 pyspider,如圖所示:

Python爬蟲之Pyspider使用

出現上述結果說明啟動成功,如果啟動時一直卡在 result_worker starting...,我們可以再開啟一個控制檯視窗,同樣輸入 pyspider 進行啟動,啟動成功後關掉之前的視窗即可。

啟動成功後,我們再驗證一下,開啟瀏覽器,輸入 訪問,如圖所示:

5bcc89ed27d62318a07700520a72240.png

我們發現確實啟動成功了。

4 快速上手

4.1 建立專案

首先,我們點選圖形介面中的 Create 按鈕開始建立專案,如圖中紅框所示:

883ee324b720595da0767c065a3e0ba.png

然後會跳出資訊填寫視窗,如圖所示:

0d4da9ca30fb878543425a6e7f4c75a.png

·Project Name:專案名

·Start URL(s):爬取連結地址

我們需要填寫 Project Name 和 Start URL(s),這裡以鏈家網二手房資訊為例:,填寫完成後點選 Create 按鈕。結果如圖所示:

059822f1edf5ebef6780547cc1fb440.png

4.2 爬蟲實現

pyspider 訪問 https 協議的網站時會提示證照問題(通常為 HTTP 599),因此我們需要在 crawl 方法中新增引數 validate_cert=False 來遮蔽證照驗證。如圖所示:

0263a04093a9b2d3b1eaa08e814ca85.png

我們計劃獲取房子的單價(unit_price)、描述標題(title)、賣點資訊(sell_point),編寫具體實現如下所示:

from pyspider.libs.base_handler import *
class Handler(BaseHandler):
    crawl_config = {
    }
    @every(minutes=24 * 60)
    def on_start(self):
        self.crawl('', callback=self.index_page,validate_cert=False)
    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        for each in response.doc('.title').items():
            self.crawl(each.attr.href, callback=self.detail_page,validate_cert=False)
            
    @config(priority=2)
    def detail_page(self, response):
        yield {
            'unit_price':response.doc('.unitPrice').text(),
            'title': response.doc('.main').text(),
            'sell_point': response.doc('.baseattribute > .content').text()
        }

·@every(minutes=24 * 60):通知 Scheduler 每天執行一次。

·@config(age=10 * 24 * 60 * 60):設定任務的有效期限。

·@config(priority=2):設定任務優先順序

·on_start(self):程式的入口。

·self.crawl(url, callback):主方法,用於建立一個爬取任務。

·index_page(self, response):用來抓取返回的 html 文件中對應標籤的資料。

·detail_page(self, response):返回一個 dict 物件作為結果。

我們點選執行按鈕,點選之後,我們發現 follows 按鈕處出現了提示資訊,如圖所示:

a343da652ede10a5804563d4ccf3a30.png

點選 follows 按鈕,結果如圖所示:

814590180d867fe637186ba5716d55a.png

點選上圖中紅框圈起來的三角號按鈕,結果如圖所示:

c524679d6732672f20e90dffb6caf98.png

我們隨意選一條 detail_page,點選其右側三角號按鈕,結果如圖所示:

46dda228ee6fee3c419c937a56a1c9f.png

從結果來看,已經可以爬取到我們需要的資訊了。

4.3 資料儲存

獲取到資訊之後,需要將資訊儲存起來,我們計劃將資料儲存到 MySQL 資料庫。

首先,安裝 pymysql,命令如下:

pip install pymysql

接著新增儲存程式碼,完整程式碼如下:

from pyspider.libs.base_handler import *
import pymysql
class Handler(BaseHandler):
    crawl_config = {
    }
    def __init__(self):
        # 下面引數修改成自己對應的 MySQL 資訊 
        self.db = MySQLdb.connect(ip, username, password, db, charset='utf8')
             
    def add_Mysql(self, title, unit_price, sell_point):
        try:
            cursor = self.db.cursor()
            sql = 'insert into house(title, unit_price, sell_point) values ("%s","%s","%s")' % (title[0],
            unit_price[0],sell_point);  
            print(sql)
            cursor.execute(sql)
            self.db.commit()
        except Exception as e:
            print(e)
            self.db.rollback()
    
    @every(minutes=24 * 60)
    def on_start(self):
        self.crawl('', callback=self.index_page,validate_cert=False)
    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        for each in response.doc('.title').items():
            self.crawl(each.attr.href, callback=self.detail_page,validate_cert=False)
    @config(priority=2)
    def detail_page(self, response):
        title = response.doc('.main').text(),
        unit_price = response.doc('.unitPrice').text(),
        sell_point = response.doc('.baseattribute > .content').text()
        self.add_Mysql(title, unit_price, sell_point)
        yield {
            'title': response.doc('.main').text(),
            'unit_price':response.doc('.unitPrice').text(),
            'sell_point': response.doc('.baseattribute > .content').text()
        }

先測試一下是否能將資料儲存到 MySQL 中,還是選一條 detail_page,如圖所示:

b67002125039091c249a195113b371c.png

點選其右側三角號按鈕,結果如圖所示:

630df7b1496110c16ccd1e12cd5b238.png

從輸出結果來看是執行了儲存操作,我們再到 MySQL 中看一下,如圖所示:

28d62e54f461753882f7888be9cb2d9.png

資料已經存到了 MySQL 中了。

上面我們是手動操作儲存的資料,接下來看一下如何透過設定任務儲存。

點選當前頁左上角的 pyspider 按鈕,如圖所示:

68dc468ddd83747f18c4f5214cd6aa7.png

返回 dashboard 介面,如圖所示:

333962f79d4e90bd362a6c3dc61aca6.png

我們點選 status 下方紅框圈住的位置,將狀態修改為 RUNNING 或 DEBUG,然後點選 actions 下方的 run 按鈕即可。

python學習網,大量的免費,歡迎線上學習!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4328/viewspace-2835816/,如需轉載,請註明出處,否則將追究法律責任。

相關文章