Scrapy框架的使用之Scrapyrt的使用

崔慶才丨靜覓發表於2018-05-21

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/複製程式碼

結果如下圖所示。

Scrapy框架的使用之Scrapyrt的使用

返回的是一個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… (二維碼自動識別)


相關文章