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)。其提供了一些額外的快捷方式。
shelp()
- 打印可用對象及快捷命令的幫助列表fetch(request_or_url)
- 根據(jù)給定的請求(request)或 URL 獲取一個(gè)新的 response,并更新相關(guān)的對象view(response)
- 在本機(jī)的瀏覽器打開給定的 response。 其會在 response 的 body 中添加一個(gè) Scrapy 終端根據(jù)下載的頁面會自動創(chuàng)建一些方便使用的對象,例如 Response 對象及 Selector 對象(對 HTML 及 XML 內(nèi)容)。
這些對象有:
下面給出一個(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>
...
>>>
有時(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ù)爬取,正如上面顯示的那樣。