Scrapy 简明教程

Scrapy - Shell

Description

Scrapy shell 可用于使用无错误的代码来抓取数据,而无需使用爬虫。Scrapy shell 的主要目的是测试已提取的代码、XPath 或 CSS 表达式。它还有助于指定您要从中抓取数据的网页。

Configuring the Shell

可以通过安装 IPython (用于交互式计算)控制台来配置 shell,这是一个功能强大的交互式 shell,它提供了自动完成、着色输出等功能。

如果您在 Unix 平台上工作,那么最好安装 IPython。如果 IPython 不可访问,您还可以使用 bpython

您可以通过设置名为 SCRAPY_PYTHON_SHELL 的环境变量或按如下方式定义 scrapy.cfg 文件来配置 shell:

[settings]
shell = bpython

Launching the Shell

可以使用以下命令启动 Scrapy shell:

scrapy shell <url>

url 指定要抓取数据的 URL。

Using the Shell

shell 提供一些附加快捷方式和 Scrapy 对象,如下表所述:

Available Shortcuts

shell 在项目中提供了以下可用快捷方式:

Sr.No

Shortcut & Description

1

shelp() 它通过帮助选项提供了可用的对象和快捷方式。

2

fetch(request_or_url) 它收集来自请求或网址的响应,并且关联的对象会被恰当地更新。

3

view(response) 您可以在浏览器的本地浏览器中查看给定请求的响应以进行观察,并且为了正确地显示外部链接,它会追加一个基础标记到响应体。

Available Scrapy Objects

Shell 在 project 中提供了以下可用的 Scrapy 对象 −

Sr.No

Object & Description

1

crawler 它指定了当前的爬虫对象。

2

spider 如果没有当前网址的爬虫,那么它将通过定义新的爬虫来处理网址或爬虫对象。

3

request 它指定了最后一个收集页面的请求对象。

4

response 它指定了最后一个收集页面的响应对象。

5

settings 它提供了当前的 Scrapy 设置。

Example of Shell Session

让我们尝试爬取 scrapy.org 网站,然后按照说明开始从 reddit.com 爬取数据。

在继续之前,首先我们将按照以下命令启动 shell −

scrapy shell 'http://scrapy.org' --nolog

Scrapy 将在使用以上网址时显示可用的对象 −

[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
...

Invoking the Shell from Spiders to Inspect Responses

只有当您希望获取该响应时,您才能检查从爬虫处理的响应。

例如 −

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)

如以上代码所示,您可以在爬虫中调用 shell 来使用以下函数检查响应 −

scrapy.shell.inspect_response

现在运行爬虫,您将得到以下屏幕 −

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