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ù)爬到它停止的地方临谱,如上圖所示悉默。