百度百科Scrapy
Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。[1]
Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。[2]
中文名 抓取
外文名scrapy
基本功能 数据挖掘
特点应用框架
应用数据挖掘、监测和自动化测试
目录
基本功能
Scrapy是一个为爬取网站数据、提取结构性数据而设计的应用程序框架,它可以应用在广泛领域:Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。通常我们可以很简单的通过 Scrapy 框架实现一个爬虫,抓取指定网站的内容或图片。[3] 尽管Scrapy原本是设计用来屏幕抓取(更精确的说,是网络抓取),但它也可以用来访问API来提取数据。
Scrapy架构
Scrapy Engine(引擎):负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
Scheduler(调度器):它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理。
Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。
Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。
Downloader Middlewares(下载中间件):一个可以自定义扩展下载功能的组件。
Spider Middlewares(Spider中间件):一个可以自定扩展和操作引擎和Spider中间通信的功能组件。[1] [2]
如何开始
新建项目 :新建一个新的爬虫项目 明确目标 (编写items.py):明确你想要抓取的目标 制作爬虫 (spiders/xxspider.py):制作爬虫开始爬取网页 存储内容 (pipelines.py):设计管道存储爬取内容 具体如下:
选择网站
选择一个网站,如果你需要从某个网站提取一些信息,但是网站不提供API或者其他可编程的访问机制,那么Scrapy可以帮助你提取信息。
定义数据
定义你要抓取的数据,第一件事情就是定义你要抓取的数据,在Scrapy这个是通过定义Scrapy Items来实现的。[2] 这就是要定义的Item from scrapy.item import Item, Field class Torrent(Item):
url = Field() name = Field() description = Field() size = Field()
撰写蜘蛛
撰写一个蜘蛛来抓取数据 下一步是写一个指定起始网址的蜘蛛,包含follow链接规则和数据提取规则。 例如/tor/\d+.来提取规则 使用Xpath,从页面的HTML Source里面选取要要抽取的数据,选取众多数据页面中的一个。 根据页面HTML 源码,建立XPath,选取:torrent name, description , size,这些数据 通过带可以看到
Home[2009][Eng]XviD-ovd
name属性包含在H1 标签内,使用 XPath expression提取: //h1/text() description在id=”description“的div中
Description:
***
"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. 蜘蛛代码如下: 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() yield torrent
因为很简单的原因,我们有意把重要的数据定义放在了上面。
运行蜘蛛
运行蜘蛛来抓取数据 我们需要创建一个运行文件,放在setting同级目录下,用来单独运行蜘蛛: from scrapy.cmdline import execute execute('scrapy crawl 所创建的py文件名'.split()) 最后,运行这个文件,可以看到相应的数据就输出了出来。
Review数据
查看一下数据:scraped_data.json。 关注一下数据,你会发现,所有字段都是lists(除了url是直接赋值),这是因为selectors返回的就是lists格式,如果你想存储单独数据或者在数据上增加一些解释或者清洗,可以使用Item Loaders
更多
你也看到了如何使用Scrapy从一个网站提取和存储数据,实际上,Scrapy提供了许多强大的特性,让它更容易和高效的抓取:[1]
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功能
参考资料
[1] (美)Ryan Mitchell.Python网络数据采集.人民邮电出版社,2016.3
[2] (美)迪米特里奥斯·考奇斯·劳卡斯 .《精通Python爬虫框架Scrapy》.人民邮电出版社,2018.2
[3] 胡松涛 .PYTHON 网络爬虫实战 .清华大学出版社, 2017.1
百度百科Scrapy