刮壳
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>
[s]回复<200 https://scrapy.org/>
[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
然后,您可以检查提取代码是否正常工作:
>>> 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阻止,因此您不能在此处使用提取快捷方式。然而,在你离开外壳之后,蜘蛛会继续爬行停止,如上图所示。