刮壳

Scrapy shell是一个交互式shell,您可以在不用运行蜘蛛的情况下快速地尝试和调试您的刮削代码。它用于测试数据提取代码,但实际上它可以用于测试任何类型的代码,因为它也是一个常规的Python shell。

shell用于测试XPath或CSS表达式,并查看它们是如何工作的,以及从您尝试擦除的网页中提取的数据。它允许您在编写蜘蛛时交互式地测试您的表情,而无需运行蜘蛛来测试每个变化。

一旦你熟悉了Scrapy shell,你会发现它是开发和调试你的蜘蛛的宝贵工具。

配置shell

如果您安装了IPython,Scrapy shell将使用它(而不是标准的Python控制台)。 IPython控制台功能更强大,并提供智能自动完成和彩色输出等功能。

我们强烈建议您安装IPython,特别是如果您正在使用Unix系统(IPython擅长)。有关详细信息,请参阅IPython安装指南。

Scrapy也支持bpython,并将尝试使用IPython不可用的地方。

通过scrapy的设置,您可以将其配置为使用任何一个ipython,bpython或标准的python shell,无论安装哪一个。这通过设置SCRAPY_PYTHON_SHELL环境变量来实现;或通过在scrapy.cfg中定义它:

[设置]

shell = bpython

启动shell

要启动Scrapy shell,可以使用shell命令:

刮板壳<url>

其中<url>是要删除的URL。

shell也适用于本地文件。如果你想玩一个网页的本地副本,这可以很方便。 shell了解本地文件的以下语法:

#UNIX风格

scrapy shell ./path/to/file.html

scrapy shell ../other/path/to/file.html

scrapy shell /absolute/path/to/file.html

#文件URI

scrapy shell file:///absolute/path/to/file.html

注意

使用相对文件路径时,请明确地使用./(或../相关)添加它们。 scrapy shell index.html将无法正常工作,因为可以预期(这是设计而不是错误)。

因为shell通过File URIs支持HTTP URL,而index.html在语法上类似于example.com,shell将将index.html视为域名并触发DNS查找错误:

$ scrapy shell index.html

[...刮壳开始...]

[ ... 追溯 ... ]

twisted.internet.error.DNSLookupError:DNS查找失败:

地址'index.html'未找到:[Errno -5]没有与主机名关联的地址。

如果在当前目录中存在一个名为index.html的文件,shell将不会事先测试。再一次,要明确。

使用shell

Scrapy shell只是一个常规的Python控制台(或者如果有的话可以使用IPython控制台),为了方便起见,它提供了一些其他的快捷方式。

可用的捷径

shelp() - 使用可用对象和快捷方式的列表打印帮助

fetch(url [,redirect = True]) - 从给定的URL获取新的响应并相应地更新所有相关对象。您可以随意请求HTTP 3xx重定向,而不要通过redirect = False

fetch(request) - 从给定的请求中获取新的响应并相应地更新所有相关的对象。

查看(响应) - 在本地Web浏览器中打开给定的响应,进行检查。这将为响应正文添加一个<base>标签,以便外部链接(如图像和样式表)正确显示。但是请注意,这将在您的计算机中创建一个临时文件,不会自动删除。

可用的刮擦物体

Scrapy shell自动从下载的页面创建一些方便的对象,如Response对象和Selector对象(用于HTML和XML内容)。

那些对象是:

crawler - 当前的Crawler对象。

蜘蛛 - 被称为处理URL的蜘蛛,或者Spider对象,如果没有为当前URL找到蜘蛛

请求 - 最后提取页面的Request对象。您可以使用replace()或使用提取快捷方式获取新请求(而不离开shell)来修改此请求。

response - 一个包含最后提取的页面的Response对象

设置 - 当前Scrapy设置

shell会话示例

以下是一个典型的shell会话的例子,我们从抓取http://scrapy.org页面开始,然后继续浏览https://reddit.com页面。最后,我们修改(Reddit)请求方法来POST并重新获取它得到一个错误。我们通过在Windows中键入Ctrl-D(在Unix系统中)或Ctrl-Z来结束会话。

请记住,在尝试它时,这里提取的数据可能不一样,因为这些页面不是静态的,并且在您测试此时可能已更改。此示例的唯一目的是让您熟悉Scrapy Shell的工作原理。

首先,我们启动shell:

刮板“http://scrapy.org” - 诺基亚

然后,shell获取URL(使用Scrapy下载器)并打印可用对象列表和有用的快捷方式(您会注意到这些行都以[s]前缀开头):

可用的刮擦物体:

刮擦刮板模块(包含刮擦,请求,刮擦等)

[s] crawler <scrapy.crawler.Crawler object at 0x7f07395dd690>

[s]项目{}

请求<GET http://scrapy.org&gt;

[s]回复<200 https://scrapy.org/&gt;

[s]设置<scrapy.settings.Settings对象在0x7f07395dd710>

[s] spider <DefaultSpider'default'at 0x7f0735891690>

有用的捷径:

[s] fetch(url [,redirect = True])获取URL并更新本地对象(默认情况下,遵循重定向)

抓取(req)获取scrapy.Request并更新本地对象

[s] shelp()Shell帮助(打印此帮助)

[s] view(response)在浏览器中查看响应

>>>

之后,我们可以开始玩对象:

>>> response.xpath('// title / text()')。extract_first()

“刮擦”快速强大的抓取和网页抓取框架“

>>> fetch(“http://reddit.com”)

>>> response.xpath('// title / text()')。extract()

['reddit:互联网的首页]

>>> request = request.replace(method =“POST”)

>>> fetch(request)

>>> response.status

404

>>>从pprint import pprint

>>> pprint(response.headers)

{'Accept-Ranges':['bytes'],

'Cache-Control':['max-age = 0,must-revalidate'],

'Content-Type':['text / html;字符集= UTF-8' ],

'日期':['星期四,2016年12月08日16:21:19 GMT'],

'服务器':['snooserv'],

'Set-Cookie':['loid = KqNLou0V9SKMX4qb4n;域= reddit.com;最大年龄= 63071999;路径= /; expires = Sat,08-Dec-2018 16:21:19 GMT;安全',

            “loidcreated = 2016-12-08T16%3A21%3A19.445Z;域= reddit.com;最大年龄= 63071999;路径= /; expires = Sat,08-Dec-2018 16:21:19 GMT;安全',

            “雾状= vi0ZVe4NkxNWdlH7r7;域= reddit.com;最大年龄= 63071999;路径= /; expires = Sat,08-Dec-2018 16:21:19 GMT;安全',

            “loidcreated = 2016-12-08T16%3A21%3A19.459Z;域= reddit.com;最大年龄= 63071999;路径= /; expires = Sat,08-Dec-2018 16:21:19 GMT;安全'\],

'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':['雄伟'],

'X-Served-By':['cache-cdg8730-CDG'],

'X-Timer':['S1481214079.394283,VS0,VE159'],

'X-Ua-Compatible':['IE = edge'],

'X-Xss-Protection':['1;模式=块']}

>>>

从蜘蛛调用shell来检查响应

有时你想检查在蜘蛛的某一点正在处理的响应,如果只是要检查你期望的响应到达那里。

这可以通过使用scrapy.shell.inspect_response函数来实现。

以下是您从蜘蛛中调用它的示例:

进口刮板

MySpider类(scrapy.Spider):

name =“myspider”

start\_urls = \[

    “http://example.com”

    “http://example.org”

    “http://example.net”

\]



def解析(self,response):

    #我们想检查一个具体的响应。

    如果“.org”在response.url中:

        从scrapy.shell导入inspect\_response

        inspect\_response(回应,自我)



    #其他解析码。

当你运行蜘蛛时,你会得到类似的东西:

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] crawler <scrapy.crawler.Crawler object at 0x1e16b50>

...

>>> response.url

'http://example.org'

然后,您可以检查提取代码是否正常工作:

>>> response.xpath('// h1 [@ class =“fn”]')

[]

不,不,因此,您可以在Web浏览器中打开响应,看看是否是您期望的响应:

>>>查看(回复)

真正

最后,您按Ctrl-D(或Windows中的Ctrl-Z)退出shell并继续抓取:

>>> ^ D

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

...

请注意,由于Scrapy引擎被shell阻止,因此您不能在此处使用提取快捷方式。然而,在你离开外壳之后,蜘蛛会继续爬行停止,如上图所示。

results matching ""

    No results matching ""