-
scrapy
Scrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和 自动化测试。
Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。
Scratch,是抓取的意思,这个Python的爬虫框架叫Scrapy,大概也是这个意思吧,就叫它:小刮刮吧。
基本功能
编辑
小刮刮是一个为遍历爬行网站、分解获取数据而设计的应用程序框架,它可以应用在广泛领域:数据挖掘、信息处理和或者历史片(历史记录)打包等等
Even though Scrapy was originally designed for screen scraping (more precisely, web scraping), it can also be used to extract data using APIs (such as Amazon Associates Web Services) or as a general purpose web crawler.
尽管小刮刮原本是设计用来屏幕抓取(更精确的说,是网络抓取)的目的,但它也可以用来访问API来提取数据,比如Amazon的AWS或者用来当作通常目的应用的 网络蜘蛛
The purpose of this document is to introduce you to the concepts behind Scrapy so you can get an idea of how it works and decide if Scrapy is what you need.
本文档的目的是介绍一下小刮刮背后的概念,这样你会了解它是如何工作的,以决定它是不是你需要的
如何开始
编辑
当你准备启动一个项目时,可以从这个教程开始
选择网站
选择一个网站
如果你需要从某个网站提取一些信息,但是网站不提供API或者其他可编程的访问机制,那么小刮刮可以帮助你(提取信息)
让我们看下Mininova网站,需要提取的网址,名称,描述和torrent文件的大小、添加日期
下面这个列表是所有今天新增的torrents文件的页面:参考扩展阅读1
备注:torrent是洪流的意思,这里指bit torrent,比特洪流,就是我们常说的BT文件
定义数据
定义你要抓取的数据
第一件事情就是定义你要抓取的数据,在小刮刮这个是通过定义Scrapy Items来实现的(本例是BT文件)
这就是要定义的Item
1
2
3
4
5
6
|
from scrapy.item import Item, Field
class Torrent(Item):
url = Field()
name = Field()
description = Field()
size = Field()
|
撰写蜘蛛
撰写一个蜘蛛来抓取数据
下一步是写一个指定起始网址的蜘蛛(参考扩展阅读1),包含follow链接规则和数据提取规则
如果你看一眼页面内容,就会发现所有的 torrent网址都是类似:参考扩展阅读2的样子,其中Number是一个整数,我们将用 正则表达式,例如/tor/\d+.来提取规则
我们将使用Xpath,从页面的HTML Source里面选取要要抽取的数据,选取众多数据页面中的一个,例如参考阅读3
根据页面HTML 源码,建立XPath,选取:torrent name, description , size,这些数据
通过带可以看到
Home[2009][Eng]XviD-ovd
name属性包含在H1 标签内,使用 XPath expression提取:
//h1/text()
description在id=”description“的div中
Description:
"HOME" - a documentary film by Yann Arthus-Bertrand
***
"We are living in exceptional times. Scientists tell us that we have 10 years to change the way we live, avert the depletion of natural resources and the catastrophic evolution of the Earth's climate. ...
XPath提取
//div[@id='description']
size属性在第二个
tag,id=specifications的div内
XPath expression提取
//div[@id='specifications']/p[2]/text()[2]
如果要了解更多的XPath 参考这里 XPath reference.
蜘蛛代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class MininovaSpider(CrawlSpider):
name = '参考阅读4'
allowed_domains = [ '参考阅读4' ]
start_urls = [ '参考阅读1' ]
rules = [Rule(SgmlLinkExtractor(allow = [ '/tor/\d+' ]), 'parse_torrent' )]
def parse_torrent( self , response):
x = HtmlXPathSelector(response)
torrent = TorrentItem()
torrent[ 'url' ] = response.url
torrent[ 'name' ] = x.select( "//h1/text()" ).extract()
torrent[ 'description' ] = x.select( "//div[@id='description']" ).extract()
torrent[ 'size' ] = x.select( "//div[@id='info-left']/p[2]/text()[2]" ).extract()
return torrent
|
因为很简单的原因,我们有意把重要的数据定义放在了上面(torrent数据定义),
运行蜘蛛
运行蜘蛛来抓取数据
最后,我们运行蜘蛛来爬取这个网站,输出为json格式scraped_data.json
scrapy crawl 参考阅读4 -o scraped_data.json -t json
这个使用了feed exports,来生成json格式,当然,你可以很简单的更改输出格式为csv,xml,或者存储在后端(ftp或者Amazon S3)
你也可以写一段item pipeline,把数据直接写入数据库,很简单
Review数据
Review一下抓取的数据
查看一下数据:scraped_data.json,内容大致如下
[{"url": "参考阅读2", "name": ["Home[2009][Eng]XviD-ovd"], "description": ["HOME - a documentary film by ..."], "size": ["699.69 megabyte"]}, # ... other items ... ]
关注一下数据,你会发现,所有字段都是lists(除了url是直接赋值),这是因为selectors返回的就是lists格式,如果你想存储单独数据或者在数据上增加一些解释或者清洗,可以使用Item Loaders
更多
你也看到了如何使用小刮刮从一个网站提取和存储数据,但,这只是表象,实际上,小刮刮提供了许多强大的特性,让它更容易和高效的抓取:
1>内建 selecting and extracting,支持从HTML,XML提取数据
2>内建Item Loaders,支持 数据清洗和过滤消毒,使用预定义的一个过滤器集合,可以在所有蜘蛛间公用
3>内建多格式generating feed exports支持(JSON, CSV, XML),可以在后端存储为多种方式(FTP, S3, local filesystem)
4>针对抓取对象,具有自动图像(或者任何其他媒体)下载automatically downloading images的管道线
5>支持扩展抓取extending Scrap,使用signals来自定义插入函数或者定义好的API(middlewares, extensions, and pipelines)
6>大范围的内建中间件和扩展,基于但不限于cookies and session handling
HTTP compression
HTTP authentication
HTTP cache
user-agent spoofing
robots.txt
crawl depth restriction
and more
7>强壮的编码支持和自动识别机制,可以处理多种国外的、非标准的、不完整的编码声明等等
8>可扩展的统计采集stats collection,针对数十个采集蜘蛛,在监控蜘蛛性能和识别断线断路?方面很有用处
9>一个可交互的XPaths脚本命令平台接口Interactive shell console,在调试撰写蜘蛛是上非常有用
10>一个系统服务级别的设计,可以在产品中非常容易的部署和运行你的蜘蛛
11>内建的Web service,可以监视和控制你的机器人
12>一个Telnet控制台Telnet console,可以钩入一个Python的控制台在你的抓取进程中,以便内视或者调试你的爬虫
13>支持基于Sitemap的网址发现的爬行抓取
14>具备缓存DNS和resolver(转发?冲突解决?)功能