Scrapy 終端是一個交互終端,能夠在未啓動 spider 的狀況下嘗試及調試你的爬取代碼。其本意是用來測試提取數據的代碼,不過能夠將其做爲正常的 Python 終端,在上面測試任何 Python 代碼。css
該終端是用來測試 XPath 或 CSS 表達式,查看他們的工做方式及從爬取的網頁中提取的數據。 在編寫您的 spider 時,該終端提供了交互性測試您的表達式代碼的功能,免去了每次修改後運行 spider 的麻煩。html
scrapy shell <url>
<url> 是你要爬取的網頁的地址。shell
shelp()
- 打印可用對象及快捷命令的幫助列表fetch(request_or_url)
- 根據給定的請求(request)或 URL 獲取一個新的 response,並更新相關的對象view(response)
- 在本機的瀏覽器打開給定的 response。 其會在 response 的 body 中添加一個 tag ,使得外部連接(例如圖片及 css)能正確顯示。 注意,該操做會在本地建立一個臨時文件,且該文件不會被自動刪除。Scrapy 終端根據下載的頁面會建立一些方便使用的對象,例如 Response 對象及 Selector 對象(對 HTML 和 XML 內容)。瀏覽器
這些對象有: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 的某個位置中查看被處理的 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 會從其停下的地方恢復爬取,正如上面顯示的那樣。