Scrapyrt為Scrapy提供了一個排程的HTTP介面。有了它我們不需要再執行Scrapy命令,而是通過請求一個HTTP介面即可排程Scrapy任務,我們就不需要藉助於命令列來啟動專案了。如果專案是在遠端伺服器執行,利用它來啟動專案是個不錯的選擇。
一、本節目標
我們以本章Scrapy入門專案為例來說明Scrapyrt的使用方法,專案原始碼地址為:https://github.com/Python3WebSpider/ScrapyTutorial。
二、準備工作
請確保Scrapyrt已經正確安裝並正常執行
三、啟動服務
首先將專案下載下來,在專案目錄下執行Scrapyrt,假設當前服務執行在9080埠上。下面將簡單介紹Scrapyrt的使用方法。
四、GET請求
目前,GET請求方式支援如下的引數。
spider_name
:Spider名稱,字串型別,必傳引數。如果傳遞的Spider名稱不存在,則返回404錯誤。url
:爬取連結,字串型別,如果起始連結沒有定義就必須要傳遞這個引數。如果傳遞了該引數,Scrapy會直接用該URL生成Request,而直接忽略start_requests()
方法和start_urls
屬性的定義。callback
:回撥函式名稱,字串型別,可選引數。如果傳遞了就會使用此回撥函式處理,否則會預設使用Spider內定義的回撥函式。max_requests
:最大請求數量,數值型別,可選引數。它定義了Scrapy執行請求的Request的最大限制,如定義為5,則表示最多隻執行5次Request請求,其餘的則會被忽略。start_requests
:代表是否要執行start_requests
方法,布林型別,可選引數。Scrapy專案中如果定義了start_requests()
方法,那麼專案啟動時會預設呼叫該方法。但是在Scrapyrt中就不一樣了,Scrapyrt預設不執行start_requests()
方法,如果要執行,需要將start_requests
引數設定為true。
我們執行如下命令:
curl http://localhost:9080/crawl.json?spider_name=quotes&url=http://quotes.toscrape.com/複製程式碼
結果如下圖所示。
返回的是一個JSON格式的字串,我們解析它的結構,如下所示:
{
"status": "ok",
"items": [
{
"text": "“The world as we have created it is a process of o...",
"author": "Albert Einstein",
"tags": [
"change",
"deep-thoughts",
"thinking",
"world"
]
},
...
{
"text": "“... a mind needs books as a sword needs a whetsto...",
"author": "George R.R. Martin",
"tags": [
"books",
"mind"
]
}
],
"items_dropped": [],
"stats": {
"downloader/request_bytes": 2892,
"downloader/request_count": 11,
"downloader/request_method_count/GET": 11,
"downloader/response_bytes": 24812,
"downloader/response_count": 11,
"downloader/response_status_count/200": 10,
"downloader/response_status_count/404": 1,
"dupefilter/filtered": 1,
"finish_reason": "finished",
"finish_time": "2017-07-12 15:09:02",
"item_scraped_count": 100,
"log_count/DEBUG": 112,
"log_count/INFO": 8,
"memusage/max": 52510720,
"memusage/startup": 52510720,
"request_depth_max": 10,
"response_received_count": 11,
"scheduler/dequeued": 10,
"scheduler/dequeued/memory": 10,
"scheduler/enqueued": 10,
"scheduler/enqueued/memory": 10,
"start_time": "2017-07-12 15:08:56"
},
"spider_name": "quotes"
}複製程式碼
這裡省略了items
絕大部分。status
顯示了爬取的狀態,items
部分是Scrapy專案的爬取結果,items_dropped
是被忽略的Item列表,stats
是爬取結果的統計情況。此結果和直接執行Scrapy專案得到的統計是相同的。
這樣一來,我們就通過HTTP介面排程Scrapy專案並獲取爬取結果,如果Scrapy專案部署在伺服器上,我們可以通過開啟一個Scrapyrt服務實現任務的排程並直接取到爬取結果,這很方便。
五、POST請求
除了GET請求,我們還可以通過POST請求來請求Scrapyrt。但是此處Request Body必須是一個合法的JSON配置,在JSON裡面可以配置相應的引數,支援的配置引數更多。
目前,JSON配置支援如下引數。
spider_name
:Spider名稱,字串型別,必傳引數。如果傳遞的Spider名稱不存在,則返回404錯誤。max_requests
:最大請求數量,數值型別,可選引數。它定義了Scrapy執行請求的Request的最大限制,如定義為5,則表示最多隻執行5次Request請求,其餘的則會被忽略。request
:Request配置,JSON物件,必傳引數。通過該引數可以定義Request的各個引數,必須指定url
欄位來指定爬取連結,其他欄位可選。
我們看一個JSON配置例項,如下所示:
{
"request": {
"url": "http://quotes.toscrape.com/",
"callback": "parse",
"dont_filter": "True",
"cookies": {
"foo": "bar"
}
},
"max_requests": 2,
"spider_name": "quotes"
}複製程式碼
我們執行如下命令,傳遞該JSON配置併發起POST請求:
curl http://localhost:9080/crawl.json -d '{"request": {"url": "http://quotes.toscrape.com/", "dont_filter": "True", "callback": "parse", "cookies": {"foo": "bar"}}, "max_requests": 2, "spider_name": "quotes"}'複製程式碼
執行結果和上文類似,同樣是輸出了爬取狀態、結果、統計資訊等內容。
六、結語
以上內容便是Scrapyrt的相關用法介紹。通過它,我們方便地排程Scrapy專案的執行並獲取爬取結果。更多的使用方法可以參考官方文件:http://scrapyrt.readthedocs.io。
本資源首發於崔慶才的個人部落格靜覓: Python3網路爬蟲開發實戰教程 | 靜覓
如想了解更多爬蟲資訊,請關注我的個人微信公眾號:進擊的Coder
weixin.qq.com/r/5zsjOyvEZ… (二維碼自動識別)