爬蟲:Scrapy7 - Scrapy終端(Scrapy shell)

Scrapy 終端是一個交互終端,能夠在未啓動 spider 的狀況下嘗試及調試你的爬取代碼。其本意是用來測試提取數據的代碼,不過能夠將其做爲正常的 Python 終端,在上面測試任何 Python 代碼。css

該終端是用來測試 XPath 或 CSS 表達式,查看他們的工做方式及從爬取的網頁中提取的數據。 在編寫您的 spider 時,該終端提供了交互性測試您的表達式代碼的功能,免去了每次修改後運行 spider 的麻煩。html

啓動終端

scrapy shell <url>

<url> 是你要爬取的網頁的地址。shell

可用的快捷命令(shortcut)

  • shelp() - 打印可用對象及快捷命令的幫助列表
  • fetch(request_or_url) - 根據給定的請求(request)或 URL 獲取一個新的 response,並更新相關的對象
  • view(response) - 在本機的瀏覽器打開給定的 response。 其會在 response 的 body 中添加一個 tag ,使得外部連接(例如圖片及 css)能正確顯示。 注意,該操做會在本地建立一個臨時文件,且該文件不會被自動刪除。

可用的 Scarpy 對象

Scrapy 終端根據下載的頁面會建立一些方便使用的對象,例如 Response 對象及 Selector 對象(對 HTML 和 XML 內容)。瀏覽器

這些對象有:session

  • crawler - 當前 Crawler 對象。
  • spider - 處理 URL 的 spider。對當前 URL 沒有處理的 Spider 時則爲一個 Spider 對象。
  • request - 最近獲取到的頁面的 Request 對象。您可使用 replace() 修改該 request。或者 使用 fetch 快捷方式來獲取新的 request。
  • response - 包含最近獲取到的頁面的 Response 對象。
  • sel - 根據最近獲取到的 response 構建的 Selector 對象。
  • settings - 當前的 Scrapy settings

終端會話(shell session)樣例

下面給出一個典型的終端會話的例子。 在該例子中,咱們首先爬取了 http://scarpy.org 的頁面,然後接着爬取 http://slashdot.org 的頁面。 最後,咱們修改了(Slashdot)的請求,將請求設置爲 POST 並從新獲取, 獲得 HTTP 405(不容許的方法)錯誤。 以後經過 Ctrl-D(Unix)或 Ctrl-Z(Windows)關閉會話。scrapy

須要注意的是,因爲爬取的頁面不是靜態頁,內容會隨着時間而修改, 所以例子中提取到的數據可能與您嘗試的結果不一樣。ide

scrapy shell 'http://scrapy.org' --nolog

接着該終端(使用 Scrapy 下載器(downloader))獲取 URL 內容並打印可用的對象及快捷命令(注意到以[s]開頭的行):函數

[s] Available Scrapy objects:
[s]   crawler    <scrapy.crawler.Crawler object at 0x1e16b50>
[s]   item       {}
[s]   request    <GET http://scrapy.org>
[s]   response   <200 http://scrapy.org>
[s]   sel        <Selector xpath=None data=u'<html>\n  <head>\n    <meta charset="utf-8'>
[s]   settings   <scrapy.settings.Settings object at 0x2bfd650>
[s]   spider     <Spider 'default' at 0x20c6f50>
[s] Useful shortcuts:
[s]   shelp()           Shell help (print this help)
[s]   fetch(req_or_url) Fetch request (or URL) and update local objects
[s]   view(response)    View response in a browser

>>>

以後,就能夠操做這些對象了:測試

>>> sel.xpath("//h2/text()").extract()[0]
u'Welcome to Scrapy'

>>> fetch("http://slashdot.org")
[s] Available Scrapy objects:
[s]   crawler    <scrapy.crawler.Crawler object at 0x1a13b50>
[s]   item       {}
[s]   request    <GET http://slashdot.org>
[s]   response   <200 http://slashdot.org>
[s]   sel        <Selector xpath=None data=u'<html lang="en">\n<head>\n\n\n\n\n<script id="'>
[s]   settings   <scrapy.settings.Settings object at 0x2bfd650>
[s]   spider     <Spider 'default' at 0x20c6f50>
[s] Useful shortcuts:
[s]   shelp()           Shell help (print this help)
[s]   fetch(req_or_url) Fetch request (or URL) and update local objects
[s]   view(response)    View response in a browser

>>> sel.xpath('//title/text()').extract()
[u'Slashdot: News for nerds, stuff that matters']

>>> request = request.replace(method="POST")

>>> fetch(request)
[s] Available Scrapy objects:
[s]   crawler    <scrapy.crawler.Crawler object at 0x1e16b50>
...

>>>

在 spider 中啓動 shell 來查看 response

有時您想在 spider 的某個位置中查看被處理的 response, 以確認您指望的 response 到達特定位置。fetch

這能夠經過 scrapy.shell.inspect_response 函數來實現。

如下是如何在 spider 中調用該函數的例子:

import scrapy

class MySpider(scrapy.Spider):
    name = "myspider"
    start_urls = [
        "http://example.com",
        "http://example.org",
        "http://example.net",
    ]

    def parse(self, response):
        # We want to inspect one specific response.
        if ".org" in response.url:
            from scrapy.shell import inspect_response
            inspect_response(response, self)

        # Rest of parsing code.

當運行 spider 時,您將獲得相似下列的輸出:

2014-01-23 17:48:31-0400 [myspider] DEBUG: Crawled (200) <GET http://example.com> (referer: None)
2014-01-23 17:48:31-0400 [myspider] DEBUG: Crawled (200) <GET http://example.org> (referer: None)
[s] Available Scrapy objects:
[s]   crawler    <scrapy.crawler.Crawler object at 0x1e16b50>
...

>>> response.url
'http://example.org'

接着測試提取代碼:

>>> sel.xpath('//h1[@class="fn"]')
[]

看來是沒有。您能夠在瀏覽器裏查看 response 的結果,判斷是不是您指望的結果:

>>> view(response)
True

最後您能夠點擊 Ctrl-D(Windows 下 Ctrl-Z)來退出終端,恢復爬取:

>>> ^D
2014-01-23 17:50:03-0400 [myspider] DEBUG: Crawled (200) <GET http://example.net> (referer: None)
...

注意: 因爲該終端屏蔽了 Scrapy 引擎,您在這個終端中不能使用 fetch 快捷命令(shortcut)。 當您離開終端時,spider 會從其停下的地方恢復爬取,正如上面顯示的那樣。

相關文章
相關標籤/搜索