Scrapy – Shell介绍

Scrapy Shell描述

Scrapy shell可以用来搜刮无错误代码的数据,而不需要使用spider。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设置

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来检查响应

你可以检查从Spider处理的响应,只有当你期望得到该响应时才可以。

例如–

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程