Scrapy – 壳
Scrapy – 壳
描述
Scrapy shell 可用于清除具有无错误代码的数据,而无需使用蜘蛛。Scrapy shell 的主要目的是测试提取的代码、XPath 或 CSS 表达式。它还有助于指定您从中抓取数据的网页。
配置外壳
可以通过安装IPython(用于交互式计算)控制台来配置 shell ,这是一个强大的交互式 shell,提供自动完成、彩色输出等。
如果您在 Unix 平台上工作,那么最好安装 IPython。如果 IPython 无法访问,您也可以使用bpython。
您可以通过设置名为 SCRAPY_PYTHON_SHELL 的环境变量或通过如下定义 scrapy.cfg 文件来配置 shell –
[settings] shell = bpython
启动外壳
可以使用以下命令启动 Scrapy shell –
scrapy shell <url>
该URL指定的URL,该数据需要被刮掉。
使用外壳
shell 提供了一些额外的快捷方式和 Scrapy 对象,如下表所述 –
可用的快捷方式
Shell 在项目中提供了以下可用的快捷方式 –
| Sr.No | 快捷方式和说明 |
|---|---|
| 1 |
shelp() 它通过帮助选项提供可用对象和快捷方式。 |
| 2 |
fetch(request_or_url) 它收集来自请求或 URL 的响应,并且关联的对象将得到正确更新。 |
| 3 |
view(response) 您可以在本地浏览器中查看给定请求的响应以进行观察并正确显示外部链接,它将基本标记附加到响应正文。 |
可用的 Scrapy 对象
Shell 在项目中提供了以下可用的 Scrapy 对象 –
| Sr.No | 对象和描述 |
|---|---|
| 1 |
crawler 它指定当前的爬虫对象。 |
| 2 |
spider 如果当前 URL 没有蜘蛛,那么它将通过定义新蜘蛛来处理 URL 或蜘蛛对象。 |
| 3 |
request 它指定最后收集的页面的请求对象。 |
| 4 |
response 它指定最后收集的页面的响应对象。 |
| 5 |
settings 它提供当前的 Scrapy 设置。 |
Shell 会话示例
让我们尝试抓取 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
...
从 Spider 中调用 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)
如上面的代码所示,您可以使用以下函数从蜘蛛中调用 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