Scrapy – Shell
描述
Scrapy shell可用于以无错误的代码来采集数据,而不需要使用蜘蛛。Scrapy shell的主要目的是测试提取的代码、XPath或CSS表达式。它还有助于指定你要搜刮数据的网页。
配置Shell
可以通过安装IPython (用于交互式计算)控制台来配置shell,它是一个强大的交互式shell,可以提供自动完成,彩色输出等。
如果你是在Unix平台上工作,那么最好安装IPython。如果IPython无法访问,你也可以使用bpython 。
你可以通过设置名为SCRAPY_PYTHON_SHELL的环境变量或通过定义scrapy.cfg文件来配置shell,如下所示
[settings]
shell = bpython
启动Shell
Scrapy shell可以用以下命令启动
scrapy shell <url>
url 指的是需要刮取数据的URL。
使用Shell
shell提供了一些额外的快捷方式和Scrapy对象,如下表所示
可用的快捷方式
Shell在项目中提供了以下可用的快捷方式
序号 | 快捷方式和描述 |
---|---|
1 | shelp() 它提供可用的对象和带有帮助选项的快捷方式。 |
2 | fetch(request_or_url) 它收集来自请求或URL的响应,相关的对象将被适当更新。 |
3 | view(response) 你可以在本地浏览器中查看给定请求的响应,以便观察,为了正确显示外部链接,它在响应体中附加了一个基础标签。 |
可用的Scrapy对象
Shell在项目中提供了以下可用的Scrapy对象
序号 | 对象和描述 |
---|---|
1 | crawler 它指定了当前的爬虫对象。 |
2 | spider 如果目前的URL没有spider,那么它将通过定义新的spider来处理URL或spider对象。 |
3 | request 它指定了最后收集的页面的请求对象。 |
4 | **response ** 它指定了最后收集的页面的响应对象。 |
5 | settings 它提供了当前的Scrapy设置。 |
壳牌会话的例子
让我们尝试刮取scrapy.org网站,然后开始刮取reddit.com上的数据。
在继续前进之前,首先我们将启动shell,如下面的命令所示
scrapy shell 'http://scrapy.org' --nolog
Scrapy将显示可用的对象,同时使用上述URL —
[s] Available Scrapy objects:
[s] crawler <scrapy.crawler.Crawler object at 0x1e16b50>
[s] item {}
[s] request <GET http://scrapy.org >
[s] response <200 http://scrapy.org >
[s] settings <scrapy.settings.Settings object at 0x2bfd650>
[s] spider <Spider 'default' at 0x20c6f50>
[s] Useful shortcuts:
[s] shelp() Provides available objects and shortcuts with help option
[s] fetch(req_or_url) Collects the response from the request or URL and associated
objects will get update
[s] view(response) View the response for the given request
接下来,从对象的工作开始,如下所示 −
>> response.xpath('//title/text()').extract_first()
u'Scrapy | A Fast and Powerful Scraping and Web Crawling Framework'
>> fetch("http://reddit.com")
[s] Available Scrapy objects:
[s] crawler
[s] item {}
[s] request
[s] response <200 https://www.reddit.com/>
[s] settings
[s] spider
[s] Useful shortcuts:
[s] shelp() Shell help (print this help)
[s] fetch(req_or_url) Fetch request (or URL) and update local objects
[s] view(response) View response in a browser
>> response.xpath('//title/text()').extract()
[u'reddit: the front page of the internet']
>> request = request.replace(method="POST")
>> fetch(request)
[s] Available Scrapy objects:
[s] crawler
...
从蜘蛛调用 Shell 来检查响应
你可以检查从蜘蛛处理的响应,只有当你期望得到该响应时。
例如 –
import scrapy
class SpiderDemo(scrapy.Spider):
name = "spiderdemo"
start_urls = [
"http://mysite.com",
"http://mysite1.org",
"http://mysite2.net",
]
def parse(self, response):
# You can inspect one specific response
if ".net" in response.url:
from scrapy.shell import inspect_response
inspect_response(response, self)
如上面的代码所示,你可以从spiders中调用shell来检查响应,使用下面的函数—
scrapy.shell.inspect_response
现在运行spider,你将得到以下屏幕 −
2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200) (referer: None)
2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200) (referer: None)
2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200) (referer: None)
[s] Available Scrapy objects:
[s] crawler
...
>> response.url
'http://mysite2.org'
你可以使用以下代码检查提取的代码是否工作 −
>> response.xpath('//div[@class = "val"]')
它的输出显示为
[]
上面一行只显示了一个空白输出。现在你可以调用shell来检查响应,如下图所示
>> view(response)
它显示的响应为
True