scrapy

scrapy通用爬虫
CrawlSpider它是Spider的派生类,Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则Rule来提供跟进链接的方便的机制,从爬取的网页结果中获取链接并继续爬取的工作.

CrawlSpider继承于Spider类,除了继承过来的属性外(name、allow_domains),还提供了新的属性和方法:

class XcfcrawlspiderSpider(CrawlSpider):
#爬虫名称
name = 'xcfCrawlSpider'
#设置允许爬取的域
allowed_domains = ['xiachufang.com']
#设置起始的url
start_urls = ['http://www.xiachufang.com/category/']
rules = (
Rule(
LinkExtractor(allow=r'.*?/category/\d+/'),
callback='parse_item',
follow=True,
process_links='check_category_url'
),
)

Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。

Scrap,是碎片的意思,这个Python的爬虫框架叫Scrapy。

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.

尽管Scrapy原本是设计用来屏幕抓取(更精确的说,是网络抓取)的目的,但它也可以用来访问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.

本文档的目的是介绍一下Scrapy背后的概念,这样你会了解它是如何工作的,以决定它是不是你需要的

当你准备启动一个项目时,可以从这个教程开始

选择网站

选择一个网站

如果你需要从某个网站提取一些信息,但是网站不提供API或者其他可编程的访问机制,那么Scrapy可以帮助你(提取信息)

让我们看下Mininova网站,需要提取的网址,名称,描述和torrent文件的大小、添加日期

下面这个列表是所有今天新增的torrents文件的页面:参考扩展阅读1

备注:torrent是洪流的意思,这里指bit torrent,比特洪流,就是我们常说的BT文件

定义数据

定义你要抓取的数据

第一件事情就是定义你要抓取的数据,在Scrapy这个是通过定义Scrapy Items来实现的(本例是BT文件)

这就是要定义的Item

`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内

Category: Movies > Documentary

Total size: 699.79 megabyte

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()

yield torrent

|

因为很简单的原因,我们有意把重要的数据定义放在了上面(torrent数据定义),

你可能感兴趣的:(scrapy)