鍍金池/ 教程/ Python/ Scrapy 終端(Scrapy shell)
Benchmarking
命令行工具(Command line tools)
下載器中間件(Downloader Middleware)
信號(Signals)
Telnet 終端(Telnet Console)
初窺 Scrapy
數(shù)據(jù)收集(Stats Collection)
Scrapyd
通用爬蟲(Broad Crawls)
Item Loaders
試驗(yàn)階段特性
Scrapy 入門教程
自動限速(AutoThrottle)擴(kuò)展
Settings
Scrapy 終端(Scrapy shell)
下載項(xiàng)目圖片
DjangoItem
調(diào)試(Debugging)Spiders
選擇器(Selectors)
Feed exports
Spiders Contracts
借助 Firefox 來爬取
Logging
Spiders
Ubuntu 軟件包
實(shí)踐經(jīng)驗(yàn)(Common Practices)
安裝指南
Item Exporters
擴(kuò)展(Extensions)
Items
Spider 中間件(Middleware)
異常(Exceptions)
例子
發(fā)送 email
架構(gòu)概覽
常見問題(FAQ)
Jobs:暫停,恢復(fù)爬蟲
核心 API
使用 Firebug 進(jìn)行爬取
Item Pipeline
Link Extractors
Web Service
調(diào)試內(nèi)存溢出

Scrapy 終端(Scrapy shell)

Scrapy 終端是一個(gè)交互終端,供您在未啟動 spider 的情況下嘗試及調(diào)試您的爬取代碼。 其本意是用來測試提取數(shù)據(jù)的代碼,不過您可以將其作為正常的 Python 終端,在上面測試任何的 Python 代碼。

該終端是用來測試 XPath 或 CSS 表達(dá)式,查看他們的工作方式及從爬取的網(wǎng)頁中提取的數(shù)據(jù)。 在編寫您的 spider 時(shí),該終端提供了交互性測試您的表達(dá)式代碼的功能,免去了每次修改后運(yùn)行 spider 的麻煩。

一旦熟悉了 Scrapy 終端后,您會發(fā)現(xiàn)其在開發(fā)和調(diào)試 spider 時(shí)發(fā)揮的巨大作用。

如果您安裝了 IPython,Scrapy 終端將使用 IPython (替代標(biāo)準(zhǔn) Python 終端)。 IPython 終端與其他相比更為強(qiáng)大,提供智能的自動補(bǔ)全,高亮輸出,及其他特性。

我們強(qiáng)烈推薦您安裝 IPython,特別是如果您使用 Unix 系統(tǒng)(IPython 在 Unix 下工作的很好)。 詳情請參考 IPython installation guide 。

啟動終端

您可以使用 shell 來啟動 Scrapy 終端:

scrapy shell <url>

<url> 是您要爬取的網(wǎng)頁的地址。

使用終端

Scrapy 終端僅僅是一個(gè)普通的 Python 終端(或 IPython)。其提供了一些額外的快捷方式。

可用的快捷命令(shortcut)

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

可用的 Scrapy 對象

Scrapy 終端根據(jù)下載的頁面會自動創(chuàng)建一些方便使用的對象,例如 Response 對象及 Selector 對象(對 HTML 及 XML 內(nèi)容)。

這些對象有:

  • crawler - 當(dāng)前 Crawler 對象。
  • spider - 處理 URL 的 spider。對當(dāng)前 URL 沒有處理的 Spider 時(shí)則為一個(gè) Spider 對象。
  • request - 最近獲取到的頁面的 Request 對象。您可以使用 replace() 修改該 request?;蛘?使用 fetch 快捷方式來獲取新的 request。
  • response - 包含最近獲取到的頁面的 Response 對象。
  • sel - 根據(jù)最近獲取到的 response 構(gòu)建的 Selector 對象。
  • settings - 當(dāng)前的 Scrapy settings

終端會話(shell session)樣例

下面給出一個(gè)典型的終端會話的例子。 在該例子中,我們首先爬取了 http://scarpy.org 的頁面,而后接著爬取 http://slashdot.org 的頁面。 最后,我們修改了(Slashdot)的請求,將請求設(shè)置為 POST 并重新獲取, 得到 HTTP 405(不允許的方法)錯誤。 之后通過 Ctrl-D(Unix)或 Ctrl-Z(Windows)關(guān)閉會話。

需要注意的是,由于爬取的頁面不是靜態(tài)頁,內(nèi)容會隨著時(shí)間而修改, 因此例子中提取到的數(shù)據(jù)可能與您嘗試的結(jié)果不同。 該例子的唯一目的是讓您熟悉 Scrapy 終端。

首先,我們啟動終端:

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

接著該終端(使用 Scrapy 下載器(downloader))獲取 URL 內(nèi)容并打印可用的對象及快捷命令(注意到以[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("http://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

有時(shí)您想在 spider 的某個(gè)位置中查看被處理的 response, 以確認(rèn)您期望的 response 到達(dá)特定位置。

這可以通過 scrapy.shell.inspect_response 函數(shù)來實(shí)現(xiàn)。

以下是如何在 spider 中調(diào)用該函數(shù)的例子:

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.

當(dāng)運(yùn)行 spider 時(shí),您將得到類似下列的輸出:

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 的結(jié)果,判斷是否是您期望的結(jié)果:

>>> view(response)
True

最后您可以點(diǎn)擊 Ctrl-D(Windows 下 Ctrl-Z)來退出終端,恢復(fù)爬取:

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

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