百度百科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
因为很简单的原因,我们有意把重要的数据定义放在了上面。