Scrapy爬蟲入門教程八 交互式 shell 方便調(diào)試

Python版本管理:pyenv和pyenv-virtualenv
Scrapy爬蟲入門教程一 安裝和基本使用
Scrapy爬蟲入門教程二 官方提供Demo
Scrapy爬蟲入門教程三 命令行工具介紹和示例
Scrapy爬蟲入門教程四 Spider(爬蟲)
Scrapy爬蟲入門教程五 Selectors(選擇器)
Scrapy爬蟲入門教程六 Items(項目)
Scrapy爬蟲入門教程七 Item Loaders(項目加載器)
Scrapy爬蟲入門教程八 交互式 shell 方便調(diào)試
Scrapy爬蟲入門教程九 Item Pipeline(項目管道)
Scrapy爬蟲入門教程十 Feed exports(導(dǎo)出文件)
Scrapy爬蟲入門教程十一 Request和Response(請求和響應(yīng))
Scrapy爬蟲入門教程十二 Link Extractors(鏈接提取器)

開發(fā)環(huán)境:
Python 3.6.0 版本 (當(dāng)前最新)
Scrapy 1.3.2 版本 (當(dāng)前最新)

Scrapy shell

Scrapy shell是一個交互式shell泞当,您可以在此快速嘗試和調(diào)試您的抓取代碼,而無需運行爬蟲程序盗飒。它用于測試數(shù)據(jù)提取代碼,但實際上可以使用它來測試任何類型的代碼蝶溶,因為它也是一個常規(guī)的Python shell汗贫。

shell用于測試XPath或CSS表達式,并查看它們?nèi)绾喂ぷ鞑可撸约八麄儚哪獓L試抓取的網(wǎng)頁中提取的數(shù)據(jù)咐蝇。它允許您在編寫爬蟲時交互式測試表達式有序,而無需運行爬蟲來測試每個更改。

一旦你熟悉了Scrapy shell警绩,你會發(fā)現(xiàn)它是開發(fā)和調(diào)試你的爬蟲的一個非常寶貴的工具盅称。

配置shell

如果你安裝了IPython缩膝,Scrapy shell會使用它(而不是標準的Python控制臺)。該IPython的控制臺功能更強大将饺,并提供智能自動完成和彩色輸出痛黎,等等。

我們強烈建議您安裝IPython桌肴,特別是如果你正在使用Unix系統(tǒng)(IPython擅長)琉历。有關(guān) 詳細信息,請參閱IPython安裝指南彪置。

Scrapy還支持bpython拳魁,并且將嘗試在IPython 不可用的地方使用它。

通過scrapy的設(shè)置姚糊,您可以配置為使用中的任何一個 ipython授舟,bpython或標準python外殼,安裝無論哪個肠槽。這是通過設(shè)置SCRAPY_PYTHON_SHELL環(huán)境變量來完成的; 或通過在scrapy.cfg中定義它:

[settings]
shell = bpython

啟動shell

要啟動Scrapy shell秸仙,可以使用如下shell命令:

scrapy shell <url>

其中桩盲,<url>是您要抓取的網(wǎng)址。

shell也適用于本地文件捞蛋。如果你想玩一個網(wǎng)頁的本地副本姑曙,這可以很方便伤靠。shell了解本地文件的以下語法:

# UNIX-style
scrapy shell ./path/to/file.html
scrapy shell ../other/path/to/file.html
scrapy shell /absolute/path/to/file.html

# File URI
scrapy shell file:///absolute/path/to/file.html

注意

當(dāng)使用相對文件路徑時啼染,是顯式的迹鹅,并在它們前面./(或../相關(guān)時)。 將不會像一個人所期望的那樣工作(這是設(shè)計阀蒂,而不是一個錯誤)。scrapy shell index.html
因為shell喜歡文件URI上的HTTP URL酗失,并且index.html在語法上類似example.com昧绣, shell會將其視為index.html域名并觸發(fā)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將不會預(yù)先測試index.html 當(dāng)前目錄中是否存在調(diào)用的文件夜畴。再次,明確兑牡。

使用shell

Scrapy shell只是一個普通的Python控制臺(或IPython控制臺兔簇,如果你有它)垄琐,為方便起見,它提供了一些額外的快捷方式功能墩朦。

可用快捷鍵

  • shelp() - 打印有可用對象和快捷方式列表的幫助
    *fetch(url[, redirect=True]) - 從給定的URL獲取新的響應(yīng)翻擒,并相應(yīng)地更新所有相關(guān)對象陋气。你可以選擇要求HTTP 3xx重定向,不要通過redirect=False
  • fetch(request) - 從給定請求獲取新響應(yīng)痒玩,并相應(yīng)地更新所有相關(guān)對象议慰。
  • view(response) - 在本地Web瀏覽器中打開給定的響應(yīng)别凹,以進行檢查。這將向響應(yīng)正文添加一個<base>標記堕战,以便正確顯示外部鏈接(如圖片和樣式表)。但請注意浇雹,這將在您的計算機中創(chuàng)建一個臨時文件屿讽,不會自動刪除伐谈。

可用Scrapy對象

Scrapy shell自動從下載的頁面創(chuàng)建一些方便的對象,如Response對象和 Selector對象(對于HTML和XML內(nèi)容)诵棵。

這些對象是:

  • crawler- 當(dāng)前Crawler對象履澳。
  • spider- 已知處理URL的Spider,或者Spider如果沒有為當(dāng)前URL找到的爬蟲柄冲,則為 對象
  • request- Request最后一個抓取頁面的對象现横。您可以replace() 使用fetch 快捷方式或使用快捷方式獲取新請求(而不離開shell)來修改此請求阁最。
  • response- 包含Response最后一個抓取頁面的對象
  • settings- 當(dāng)前Scrapy設(shè)置

shell會話的示例

下面是一個典型的shell會話示例速种,我們首先抓取 http://scrapy.org頁面,然后繼續(xù)抓取https://reddit.com 頁面馏颂。最后闸餐,我們將(Reddit)請求方法修改為POST并重新獲取它獲取錯誤舍沙。我們通過在Windows中鍵入Ctrl-D(在Unix系統(tǒng)中)或Ctrl-Z結(jié)束會話剔宪。

請記住,在這里提取的數(shù)據(jù)可能不一樣感帅,當(dāng)你嘗試它失球,因為那些網(wǎng)頁不是靜態(tài)的,可能已經(jīng)改變了你測試這個豺撑。這個例子的唯一目的是讓你熟悉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.status
404

>>> 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']}
>>>

從爬蟲調(diào)用shell檢查響應(yīng)

有時候兔朦,你想檢查在爬蟲的某一點被處理的響應(yīng)沽甥,如果只檢查你期望的響應(yīng)到達那里。

這可以通過使用該scrapy.shell.inspect_response功能來實現(xiàn)亥曹。

下面是一個如何從爬蟲調(diào)用它的例子:

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)你運行爬蟲媳瞪,你會得到類似的東西:

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瀏覽器中打開響應(yīng)察蹲,看看它是否是您期望的響應(yīng):

>>> view(response)
True

最后洽议,您按Ctrl-D(或Windows中的Ctrl-Z)退出外殼并繼續(xù)抓取:

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

請注意镜雨,您不能使用fetch此處的快捷方式儿捧,因為Scrapy引擎被shell阻止菲盾。然而,在你離開shell之后诡挂,爬蟲會繼續(xù)爬到它停止的地方临谱,如上圖所示悉默。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抄课,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子间聊,更是在濱河造成了極大的恐慌抵拘,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異叹话,居然都是意外死亡,警方通過查閱死者的電腦和手機墩瞳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門驼壶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人喉酌,你說我怎么就攤上這事热凹。” “怎么了泪电?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵般妙,是天一觀的道長相速。 經(jīng)常有香客問我碟渺,道長,這世上最難降的妖魔是什么突诬? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任苫拍,我火速辦了婚禮,結(jié)果婚禮上旺隙,老公的妹妹穿的比我還像新娘绒极。我一直安慰自己,他們只是感情好蔬捷,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布垄提。 她就那樣靜靜地躺著,像睡著了一般周拐。 火紅的嫁衣襯著肌膚如雪铡俐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天妥粟,我揣著相機與錄音高蜂,去河邊找鬼。 笑死罕容,一個胖子當(dāng)著我的面吹牛备恤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锦秒,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼露泊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了旅择?” 一聲冷哼從身側(cè)響起惭笑,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后沉噩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捺宗,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年川蒙,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚜厉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡畜眨,死狀恐怖昼牛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情康聂,我是刑警寧澤贰健,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站恬汁,受9級特大地震影響伶椿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氓侧,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一悬垃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧甘苍,春花似錦尝蠕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至囚聚,卻和暖如春靖榕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背顽铸。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工茁计, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谓松。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓星压,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鬼譬。 傳聞我的和親對象是個殘疾皇子娜膘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容