初窥Scrapy

来源:互联网 发布:java怎么保留四位小数 编辑:程序博客网 时间:2024/06/06 02:57

Scrapy是一种用于爬取网站以及提取结构化数据的应用框架。其应用十分广泛,如数据挖掘,信息处理或历史归档等。


尽管Scrapy最初被设计为用来爬取网页,但它同时可依靠其他接口来提取数据(如亚马逊联合网络服务),或者可以作为一种通用的网络爬虫来使用。


带你过一个爬虫例子

为了给你展现Scrapy的能力,下面会带你过一个用Scrapy写成的非常简单的爬虫。


以下就是按照页码来爬取http://quotes.toscrape.com该网站上名言的爬虫代码:


将这段代码放进一个文本文档,并命名为quotes_spider.py,接着通过runspider命令来运行该爬虫:


scrapy runspider quotes_spider.py -o quotes.json


当爬虫运行结束后,在quotes.json文件中就可以看到以JSON格式存在的一串文本(包括作者和名言),看起来就像下面这张图所显示的那样:





刚发生了什么?

当你运行scrapy runspider quotes_spider.py -o quotes.json 这条命令时,Scrapy会查找其中的爬虫定义,并通过其爬虫引擎来运行该爬虫。


该爬虫通过给在start_urls属性中定义的网址(URL)提交请求(request)来启动(此刻为humor category页面的网址),并调用默认回调函数parse,将响应(response)作为参数传递给该函数。在parse函数中,我们通过CSS选择器来循环遍历名言所属的元素,接着将提取到的名言文本和作者通过一个Python字典返回,最后再查找下一页的链接并安排下一个请求(该请求同样使用parse作为回调函数)


Scrapy的优点之一:异步安排和处理请求。这表明Scrapy并不需要先等一个请求被处理完,它可以同时发送下一个请求或者进行其他操作。这也表明即使发生错误或出现某个请求失败的情况,其他请求也可以不受干扰继续向前。


这种异步方式能让爬取的速度变得非常快(在容错方式下,可以同时递交多个并发请求)。通过一些设置,Scrapy也可以让你控制爬取的状态。你可以设置一个请求递交的延迟时间(download delay),以此来限制每个域名或IP的并发请求数量,甚至可以使用自动节流扩展程序(auto-throttling extension)来自动调节爬取速度。


注意:

以上爬取出来的JSON文件是通过feed exports生成的,你完全可以更改导出格式(如XML或CSV),或更改存储后端(如FTP或Amazon S3)。你也可以写一个字段管道(item pipeline)将数据存入数据库中。


还有什么?

现在你已经看过怎么用Scrapy从一个网站来提取和存储数据字段了,但这只是冰山一角。Scrapy提供了许多强有力的功能来让数据爬取变得简单而又有效,比如:


·内置支持:可使用扩展的CSS选择器和XPath表达式从HTML/XML源码中选择和提取数据,同时支持正则表达式(regular expressions)。


·在数据抓取前,用于测试CSS和XPath表达式的交互式shell控制台(IPython aware),它在你编写和调试爬虫程序时非常有用。


·内置支持:可导出为JSON, CSV,和XML等多种格式并将它们存储在FTP, S3,和本地文件系统等多种后端中。


·强大的编码支持以及自动检测功能,以用于处理多种语言的,非标准的以及不完整的编码声明。


·强大的扩展性支持:允许你通过信号和完善的接口(中间件、扩展程序和管道)来插入你自己的功能。


·众多的内置扩展程序和中间件可用于处理:

    -cookies和会话处理

    -压缩、身份验证和缓存等HTTP功能

    -用户代理欺骗

    -爬虫协议

    -爬取深度限制

    -等等


·Telnet控制台:用于接入你Scrapy中的Python控制台,以此来检查和调试你的爬虫程序。


·其他强大的功能:可重复使用爬虫去爬取站点地图(Sitemap)和XML/CSV文件中的网站;通过媒体管道(media pipeline)来自动下载与所爬取字段有关的图片(或其他任何媒体)、缓存域名解析器等等!


下一步做什么?

接下来就是要安装Scrapy,跟随引导来学习如何创建一个完善的Scrapy项目,并加入这个Scrapy大家庭。感谢你的关注!

原创粉丝点击