簡單的Python版本管理:pyenv Scrapy爬蟲入門教程一 Scrapy爬蟲入門教程二 Scrapy爬蟲入門教程三 Scrapy爬蟲入門教程四 Scrapy爬蟲入門教程五 Scrapy爬蟲入門教程六 Scrapy爬蟲入門教程七
Scrapy shell配置shell啟動shell使用shell可用快捷鍵可用Scrapy對象shell會話的示例從爬蟲調用shell檢查響應
開發環境: Python 3.6.0 版本
(當前最新) Scrapy 1.3.2 版本
(當前最新)
Scrapy shell是一個交互式shell,您可以在此快速嘗試和調試您的抓取代碼,而無需運行爬蟲程序。它用于測試數據提取代碼,但實際上可以使用它來測試任何類型的代碼,因為它也是一個常規的Python shell。
shell用于測試XPath或CSS表達式,并查看它們如何工作,以及他們從您要嘗試抓取的網頁中提取的數據。它允許您在編寫爬蟲時交互式測試表達式,而無需運行爬蟲來測試每個更改。
一旦你熟悉了Scrapy shell,你會發現它是開發和調試你的爬蟲的一個非常寶貴的工具。
如果你安裝了ipython,Scrapy shell會使用它(而不是標準的Python控制臺)。該IPython的控制臺功能更強大,并提供智能自動完成和彩色輸出,等等。
我們強烈建議您安裝IPython,特別是如果你正在使用Unix系統(IPython擅長)。有關 詳細信息,請參閱IPython安裝指南。
Scrapy還支持bpython,并且將嘗試在IPython 不可用的地方使用它。
通過scrapy的設置,您可以配置為使用中的任何一個 ipython
,bpython
或標準python
外殼,安裝無論哪個。這是通過設置SCRAPY_PYTHON_SHELL
環境變量來完成的; 或通過在scrapy.cfg中定義它:
要啟動Scrapy shell,可以使用如下shell命令:
scrapy shell <url>其中,是您要抓取的網址。
shell也適用于本地文件。如果你想玩一個網頁的本地副本,這可以很方便。shell了解本地文件的以下語法:
# UNIX-stylescrapy shell ./path/to/file.htmlscrapy shell ../other/path/to/file.htmlscrapy shell /absolute/path/to/file.html# File URIscrapy shell file:///absolute/path/to/file.html注意
當使用相對文件路徑時,是顯式的,并在它們前面./(或../相關時)。 將不會像一個人所期望的那樣工作(這是設計,而不是一個錯誤)。scrapy shell index.html 因為shell喜歡文件URI上的HTTP URL,并且index.html在語法上類似example.com, shell會將其視為index.html域名并觸發DNS查找錯誤:
$ scrapy shell index.html[ ... scrapy shell starts ... ][ ... traceback ... ]twisted.internet.error.DNSLookupError: DNS lookup failed:address 'index.html' not found: [Errno -5] No address associated with hostname.shell將不會預先測試index.html 當前目錄中是否存在調用的文件。再次,明確。
Scrapy shell只是一個普通的Python控制臺(或IPython控制臺,如果你有它),為方便起見,它提供了一些額外的快捷方式功能。
shelp()
- 打印有可用對象和快捷方式列表的幫助 *fetch(url[, redirect=True])
- 從給定的URL獲取新的響應,并相應地更新所有相關對象。你可以選擇要求HTTP 3xx重定向,不要通過redirect=Falsefetch(request)
- 從給定請求獲取新響應,并相應地更新所有相關對象。view(response)
- 在本地Web瀏覽器中打開給定的響應,以進行檢查。這將向響應正文添加一個標記,以便正確顯示外部鏈接(如圖片和樣式表)。但請注意,這將在您的計算機中創建一個臨時文件,不會自動刪除。Scrapy shell自動從下載的頁面創建一些方便的對象,如Response對象和 Selector對象(對于HTML和xml內容)。
這些對象是:
crawler- 當前Crawler對象。spider- 已知處理URL的Spider,或者Spider如果沒有為當前URL找到的爬蟲,則為 對象request- Request最后一個抓取頁面的對象。您可以replace() 使用fetch 快捷方式或使用快捷方式獲取新請求(而不離開shell)來修改此請求。response- 包含Response最后一個抓取頁面的對象settings- 當前Scrapy設置下面是一個典型的shell會話示例,我們首先抓取 http://scrapy.org頁面,然后繼續抓取https://reddit.com 頁面。最后,我們將(Reddit)請求方法修改為POST并重新獲取它獲取錯誤。我們通過在Windows中鍵入Ctrl-D(在Unix系統中)或Ctrl-Z結束會話。
請記住,在這里提取的數據可能不一樣,當你嘗試它,因為那些網頁不是靜態的,可能已經改變了你測試這個。這個例子的唯一目的是讓你熟悉Scrapy shell的工作原理。
首先,我們啟動shell: scrapy shell 'http://scrapy.org' --nolog
然后,shell獲取URL(使用Scrapy下載器)并打印可用對象和有用的快捷方式列表(您會注意到這些行都以[s]前綴開頭):
[s] Available Scrapy objects:[s] scrapy scrapy module (contains scrapy.Request, scrapy.Selector, etc)[s] crawler <scrapy.crawler.Crawler object at 0x7f07395dd690>[s] item {}[s] request <GET http://scrapy.org>[s] response <200 https://scrapy.org/>[s] settings <scrapy.settings.Settings object at 0x7f07395dd710>[s] spider <DefaultSpider 'default' at 0x7f0735891690>[s] Useful shortcuts:[s] fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)[s] fetch(req) Fetch a scrapy.Request and update local objects[s] shelp() Shell help (PRint this help)[s] view(response) View response in a browser>>>之后,我們可以開始使用對象:
>>> response.xpath('//title/text()').extract_first()'Scrapy | A Fast and Powerful Scraping and Web Crawling Framework'>>> fetch("http://reddit.com")>>> response.xpath('//title/text()').extract()['reddit: the front page of the internet']>>> request = request.replace(method="POST")>>> fetch(request)>>> response.status404>>> from pprint import pprint>>> pprint(response.headers){'Accept-Ranges': ['bytes'], 'Cache-Control': ['max-age=0, must-revalidate'], 'Content-Type': ['text/html; charset=UTF-8'], 'Date': ['Thu, 08 Dec 2016 16:21:19 GMT'], 'Server': ['snooserv'], 'Set-Cookie': ['loid=KqNLou0V9SKMX4qb4n; Domain=reddit.com; Max-Age=63071999; Path=/; expires=Sat, 08-Dec-2018 16:21:19 GMT; secure', 'loidcreated=2016-12-08T16%3A21%3A19.445Z; Domain=reddit.com; Max-Age=63071999; Path=/; expires=Sat, 08-Dec-2018 16:21:19 GMT; secure', 'loid=vi0ZVe4NkxNWdlH7r7; Domain=reddit.com; Max-Age=63071999; Path=/; expires=Sat, 08-Dec-2018 16:21:19 GMT; secure', 'loidcreated=2016-12-08T16%3A21%3A19.459Z; Domain=reddit.com; Max-Age=63071999; Path=/; expires=Sat, 08-Dec-2018 16:21:19 GMT; secure'], 'Vary': ['accept-encoding'], 'Via': ['1.1 varnish'], 'X-Cache': ['MISS'], 'X-Cache-Hits': ['0'], 'X-Content-Type-Options': ['nosniff'], 'X-Frame-Options': ['SAMEORIGIN'], 'X-Moose': ['majestic'], 'X-Served-By': ['cache-cdg8730-CDG'], 'X-Timer': ['S1481214079.394283,VS0,VE159'], 'X-Ua-Compatible': ['IE=edge'], 'X-Xss-Protection': ['1; mode=block']}>>>有時候,你想檢查在爬蟲的某一點被處理的響應,如果只檢查你期望的響應到達那里。
這可以通過使用該scrapy.shell.inspect_response
功能來實現。
下面是一個如何從爬蟲調用它的例子:
import scrapyclass 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.當你運行爬蟲,你會得到類似的東西:
2014-01-23 17:48:31-0400 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://example.com> (referer: None)2014-01-23 17:48:31-0400 [scrapy.core.engine] 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'然后,您可以檢查提取代碼是否正常工作:
>>> response.xpath('//h1[@class="fn"]')[]不,不是。因此,您可以在Web瀏覽器中打開響應,看看它是否是您期望的響應:
>>> view(response)True最后,您按Ctrl-D(或Windows中的Ctrl-Z)退出外殼并繼續抓?。?/p>>>> ^D2014-01-23 17:50:03-0400 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://example.net> (referer: None)...
請注意,您不能使用fetch此處的快捷方式,因為Scrapy引擎被shell阻止。然而,在你離開shell之后,爬蟲會繼續爬到它停止的地方,如上圖所示。
新聞熱點
疑難解答