[TOC]
# 緣起
pyspider 來源于以前做的一個垂直搜索引擎使用的爬蟲后端。我們需要從200個站點(由于站點失效,不是都同時啦,同時有100+在跑吧)采集數據,并要求在5分鐘內將對方網站的更新更新到庫中。
所以,靈活的抓取控制是必須的。同時,由于100個站點,每天都可能會有站點失效或者改版,所以需要能夠監控模板失效,以及查看抓取狀態。
為了達到5分鐘更新,我們使用抓取最近更新頁上面的最后更新時間,以此來判斷頁面是否需要再次抓取。
可見,這個項目對于爬蟲的監控和調度要求是非常高的。
# pyspider 的主要特性
* python 腳本控制,可以用任何你喜歡的html解析包(內置 pyquery)
* WEB 界面編寫調試腳本,起停腳本,監控執行狀態,查看活動歷史,獲取結果產出
* 支持 MySQL, MongoDB, SQLite
* 支持抓取 JavaScript 的頁面
* 組件可替換,支持單機/分布式部署,支持 Docker 部署
* 強大的調度控制
由于功能太多,更多請參考腳本編寫指南
感謝+PhoenixNemo 提供的VPS,提供了一個 demo: [demo.pyspider.org](http://demo.pyspider.org)。無需安裝即可體驗。

腳本樣例
~~~
from libs.base_handler import *
class Handler(BaseHandler):
'''
this is a sample handler
'''
@every(minutes=24*60, seconds=0)
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)
def detail_page(self, response):
return {
"url": response.url,
"title": response.doc('title').text(),
}
~~~
例如這就是創建任務后默認生成的一個腳本示例。
通過 on_start 回調函數,作為爬取的入口點,當點擊主面板上的 run 的時候,就是調用這個函數,啟動抓取。
self.crawl 告訴調度器,我們需要抓取 'http://scrapy.org/' 這個頁面,然后使用 callback=self.index_page 這個回調函數進行解析。
所有 return 的內容默認會被捕獲到 resultdb 中,可以直接在 WEBUI 上看到。
本文引用作者的對pyspider介紹,同時感謝[binux](http://blog.binux.me/)開發并分享如此強大的爬蟲框架。
目前本軟件最新版本為 0.3.7
下載地址為:https://github.com/binux/pyspider