閱讀文字大概需要 5 分鐘。
為什麼要使用爬蟲框架
在我們平常的爬蟲使用過程中,只是簡單的利用 requsets, xpath 等爬蟲庫,遠遠無法達到一個爬蟲框架的要求。一個爬蟲框架的雛形,應該包含排程器、佇列、請求物件等。我們平時寫的爬蟲程式,連最基本的框架都不具備。
但是這樣的架構和模組還是太簡單,遠遠達不到一個框架的要求。如果我們將各個元件獨立出來,定義成不同的模組,也就慢慢形成了一個框架。
有了框架之後,我們就不必關心爬蟲的全部流程,異常處理、任務排程等都會整合在框架中。我們只需要關心爬蟲的核心邏輯部分即可,如頁面資訊的提取,下一步請求的生成等。這樣,不僅開發效率會提高很多,而且爬蟲的健壯性也更強。
在專案實戰過程中,我們往往會採用爬蟲框架來實現抓取,這樣可提升開發效率、節省開發時間。而 pyspider 就是一個非常優秀的爬從框架,它的操作便捷、功能強大、利用它我們可以快速方便地完成爬蟲的開發。
pyspider 框架介紹
pyspider 是由國人 binux 編寫的強大的網路爬從系統,它帶有強大的 WebUI、指令碼編輯器、任務監控器、專案管理以及結果處理器,它支援多種資料庫後端、多種訊息佇列、JavaScript 渲染頁面的爬取。使用起來非常方便。
其 GiHub 地址為:
https://github.com/binux/pyspider
官方文件地址:
http://docs.pyspider.org/
pyspider 基本功能
pyspider 的功能有如下幾點:
1 提供方便易用的 WebUI 系統,視覺化地編寫和調式爬蟲
2 提供爬取進度監控、爬取結果檢視、爬蟲專案管理等功能。
3 支援多種後端資料庫,如 MySQL、MongoDB、Reids、SQLite、Elasticsearch、PostgreSQL。
4 支援多種訊息佇列、如 RabbitMQ、Beanstalk、Redis、Kombu。
5 提供優先順序控制、失敗重試、定時抓取等功能。
6 對接了 PhantomJS、可以抓取 JavaScript 渲染的頁面。
7 支援單機和分散式部署、支援 Docker 部署。
如果想要快速方便地實現一個頁面的抓取,使用 pyspider 不失為一個好的選擇。如快速抓取某個普通新聞網站的新聞內容。但如果應對反爬程度很強、超大規模的抓取、推薦使用 Scrapy、如抓取封 IP、封賬號、高頻驗證的網站的大規模資料採集。
pyspider 的架構
pyspider 的架構主要分為 Scheduler(排程器)、Fetcher(抓取器)、Processer(處理器)三個部分。整個爬取過程受到 Monitor(監控器)的監控,抓取的結果被 Result Worker(結果處理器)處理。
Scheduler 發起任務排程,Fetcher 負責抓取網頁內容,Processer 負責解析網頁內容,然後將新生成的 Request 發給 Scheduler 進行排程,將生成的提取結果輸出儲存。
pyspider 的任務執行流程的邏輯很清晰,具體過程如下所示:
1 每個 pysipder 的專案對應一個 Python 指令碼,該指令碼定義了一個 Handler 類,它有一個 on_start() 方法。爬取首先呼叫 on_start() 方法生成最初的抓取任務,然後傳送給 Scheduler。
2 Scheduler 將抓取任務分發給 Fetcher 進行抓取,Fetcher 執行並得到響應、隨後將響應傳送給 Processer。
3 Processer 處理響應並提取出新的 URL 生成新的抓取任務,然後通過訊息佇列的方式通知 Scheduler 當前抓取任務執行情況,並將新生成的抓取任務傳送給 Scheduler。如果生成了新的提取結果,則將其傳送到結果佇列等待 Result Worker 處理。
4 Scheduler 接收到新的抓取任務,然後查詢資料庫,判斷其如果是新的抓取任務或者是需要重試的任務就繼續進行排程,然後將其傳送回 Fetcher 進行抓取。
5 不斷重複以上工作、直到所有的任務都執行完畢,抓取結束。
6 抓取結束後、程式會回撥 on_finished() 方法,這裡可以定義後處理過程。
今天帶大家瞭解下 pyspider 的基本功能和架構,對 pysider 有個整體的認知。接下來會在出篇 pysipder 實戰專案,帶你更進一步瞭解 pysipder 的使用。
本文首發於公眾號「痴海」,每天分享 python 乾貨,回覆「1024」,你懂的。