Scrapy 終端是一個(gè)交互終端,供您在未啟動(dòng) spider 的情況下嘗試及調(diào)試您的爬取代碼。 其本意是用來測(cè)試提取數(shù)據(jù)的代碼,不過您可以將其作為正常的 Python 終端,在上面測(cè)試任何的 Python 代碼。
該終端是用來測(cè)試 XPath 或 CSS 表達(dá)式,查看他們的工作方式及從爬取的網(wǎng)頁(yè)中提取的數(shù)據(jù)。 在編寫您的 spider 時(shí),該終端提供了交互性測(cè)試您的表達(dá)式代碼的功能,免去了每次修改后運(yùn)行 spider 的麻煩。
一旦熟悉了 Scrapy 終端后,您會(huì)發(fā)現(xiàn)其在開發(fā)和調(diào)試 spider 時(shí)發(fā)揮的巨大作用。
如果您安裝了 IPython,Scrapy 終端將使用 IPython (替代標(biāo)準(zhǔn) Python 終端)。 IPython 終端與其他相比更為強(qiáng)大,提供智能的自動(dòng)補(bǔ)全,高亮輸出,及其他特性。
我們強(qiáng)烈推薦您安裝 IPython,特別是如果您使用 Unix 系統(tǒng)(IPython 在 Unix 下工作的很好)。 詳情請(qǐng)參考 IPython installation guide 。
您可以使用 shell 來啟動(dòng) Scrapy 終端:
scrapy shell <url>
<url> 是您要爬取的網(wǎng)頁(yè)的地址。
Scrapy 終端僅僅是一個(gè)普通的 Python 終端(或 IPython)。其提供了一些額外的快捷方式。
shelp() - 打印可用對(duì)象及快捷命令的幫助列表fetch(request_or_url) - 根據(jù)給定的請(qǐng)求(request)或 URL 獲取一個(gè)新的 response,并更新相關(guān)的對(duì)象view(response) - 在本機(jī)的瀏覽器打開給定的 response。 其會(huì)在 response 的 body 中添加一個(gè) Scrapy 終端根據(jù)下載的頁(yè)面會(huì)自動(dòng)創(chuàng)建一些方便使用的對(duì)象,例如 Response 對(duì)象及 Selector 對(duì)象(對(duì) HTML 及 XML 內(nèi)容)。
這些對(duì)象有:
下面給出一個(gè)典型的終端會(huì)話的例子。 在該例子中,我們首先爬取了 http://scarpy.org 的頁(yè)面,而后接著爬取 http://slashdot.org 的頁(yè)面。 最后,我們修改了(Slashdot)的請(qǐng)求,將請(qǐng)求設(shè)置為 POST 并重新獲取, 得到 HTTP 405(不允許的方法)錯(cuò)誤。 之后通過 Ctrl-D(Unix)或 Ctrl-Z(Windows)關(guān)閉會(huì)話。
需要注意的是,由于爬取的頁(yè)面不是靜態(tài)頁(yè),內(nèi)容會(huì)隨著時(shí)間而修改, 因此例子中提取到的數(shù)據(jù)可能與您嘗試的結(jié)果不同。 該例子的唯一目的是讓您熟悉 Scrapy 終端。
首先,我們啟動(dòng)終端:
scrapy shell 'http://scrapy.org' --nolog
接著該終端(使用 Scrapy 下載器(downloader))獲取 URL 內(nèi)容并打印可用的對(duì)象及快捷命令(注意到以[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
>>>
之后,您就可以操作這些對(duì)象了:
>>> 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>
...
>>>
有時(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'
接著測(cè)試提取代碼:
>>> 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 會(huì)從其停下的地方恢復(fù)爬取,正如上面顯示的那樣。