国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Scrapy爬蟲入門教程八

2019-11-06 06:07:17
字體:
來源:轉載
供稿:網友

簡單的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

Scrapy shell是一個交互式shell,您可以在此快速嘗試和調試您的抓取代碼,而無需運行爬蟲程序。它用于測試數據提取代碼,但實際上可以使用它來測試任何類型的代碼,因為它也是一個常規的Python shell。

shell用于測試XPath或CSS表達式,并查看它們如何工作,以及他們從您要嘗試抓取的網頁中提取的數據。它允許您在編寫爬蟲時交互式測試表達式,而無需運行爬蟲來測試每個更改。

一旦你熟悉了Scrapy shell,你會發現它是開發和調試你的爬蟲的一個非常寶貴的工具。

配置shell

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

我們強烈建議您安裝IPython,特別是如果你正在使用Unix系統(IPython擅長)。有關 詳細信息,請參閱IPython安裝指南。

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

通過scrapy的設置,您可以配置為使用中的任何一個 ipythonbpython或標準python外殼,安裝無論哪個。這是通過設置SCRAPY_PYTHON_SHELL環境變量來完成的; 或通過在scrapy.cfg中定義它:

[settings]shell = bpython

啟動shell

要啟動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 當前目錄中是否存在調用的文件。再次,明確。

使用shell

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

可用快捷鍵

shelp() - 打印有可用對象和快捷方式列表的幫助 *fetch(url[, redirect=True]) - 從給定的URL獲取新的響應,并相應地更新所有相關對象。你可以選擇要求HTTP 3xx重定向,不要通過redirect=Falsefetch(request) - 從給定請求獲取新響應,并相應地更新所有相關對象。view(response) - 在本地Web瀏覽器中打開給定的響應,以進行檢查。這將向響應正文添加一個標記,以便正確顯示外部鏈接(如圖片和樣式表)。但請注意,這將在您的計算機中創建一個臨時文件,不會自動刪除。

可用Scrapy對象

Scrapy shell自動從下載的頁面創建一些方便的對象,如Response對象和 Selector對象(對于HTML和xml內容)。

這些對象是:

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

shell會話的示例

下面是一個典型的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']}>>>

從爬蟲調用shell檢查響應

有時候,你想檢查在爬蟲的某一點被處理的響應,如果只檢查你期望的響應到達那里。

這可以通過使用該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)退出外殼并繼續抓取:

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

請注意,您不能使用fetch此處的快捷方式,因為Scrapy引擎被shell阻止。然而,在你離開shell之后,爬蟲會繼續爬到它停止的地方,如上圖所示。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 资阳市| 南溪县| 青冈县| 资阳市| 耿马| 河西区| 通山县| 汉川市| 石阡县| 洛隆县| 鹤山市| 张家港市| 辉南县| 莫力| 田阳县| 于田县| 郁南县| 四平市| 江永县| 陇川县| 保亭| 邹城市| 夏河县| 乳源| 罗城| 北海市| 农安县| 平遥县| 牙克石市| 河曲县| 定边县| 团风县| 施甸县| 东安县| 彝良县| 台江县| 平武县| 独山县| 拉萨市| 常熟市| 阿拉尔市|