主机环境:Ubuntu 13.04
Python版本:2.7.4
——————————————————————————————————————————————————-
所谓网络爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这种说法不够专业,更专业的描述就是,抓取特定网站网页的HTML数据。不过由于一个网站的网页很多,而我们又不可能事先知道所有网页的URL地址,所以,如何保证我们抓取到了网站的所有HTML页面就是一个有待考究的问题了。
一般的方法是,定义一个入口页面,然后一般一个页面会有其他页面的URL,于是从当前页面获取到这些URL加入到爬虫的抓取队列中,然后进入到新新页面后再递归的进行上述的操作,其实说来就跟深度遍历或广度遍历一样。
上面介绍的只是爬虫的一些概念而非搜索引擎,实际上搜索引擎的话其系统是相当复杂的,爬虫只是搜索引擎的一个子系统而已。
Python开源的爬虫框架Scrapy是一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。
一、概述
Scrapy是一个用 Python 写的 Crawler Framework ,简单轻巧,并且非常方便,并且官网上说已经在实际生产中在使用了,不过现在还没有 Release 版本,可以直接使用他们的 Mercurial 仓库里抓取源码进行安装。
Scrapy 使用 Twisted 这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。
Scrapy整体架构如下图所示,其中包含了它的主要组件及系统的数据处理流程(绿色箭头所示)。下面就来一个个解释每个组件的作用及数据的处理过程。

绿线是数据流向,首先从初始 URL 开始,Scheduler 会将其交给 Downloader 进行下载,下载之后会交给 Spider 进行分析,Spider 分析出来的结果有两种:一种是需要进一步抓取的链接,例如之前分析的“下一页”的链接,这些东西会被传回 Scheduler ;另一种是需要保存的数据,它们则被送到 Item Pipeline 那里,那是对数据进行后期处理(详细分析、过滤、存储等)的地方。另外,在数据流动的通道里还可以安装各种中间件,进行必要的处理。
二、组件
1、Scrapy Engine(Scrapy引擎)
Scrapy引擎是用来控制整个系统的数据处理流程,并进行事务处理的触发。更多的详细内容可以看下面的数据处理流程。
2、Scheduler(调度)
调度程序从Scrapy引擎接受请求并排序列入队列,并在Scrapy引擎发出请求后返还给他们。
3、Downloader(下载器)
下载器的主要职责是抓取网页并将网页内容返还给蜘蛛( Spiders)。
4、Spiders(蜘蛛)
蜘蛛是有Scrapy用户自己定义用来解析网页并抓取制定URL返回的内容的类,每个蜘蛛都能处理一个域名或一组域名。换句话说就是用来定义特定网站的抓取和解析规则。
蜘蛛的整个抓取流程(周期)是这样的:
- 首先获取第一个URL的初始请求,当请求返回后调取一个回调函数。第一个请求是通过调用start_requests()方法。该方法默认从start_urls中的Url中生成请求,并执行解析来调用回调函数。
- 在回调函数中,你可以解析网页响应并返回项目对象和请求对象或两者的迭代。这些请求也将包含一个回调,然后被Scrapy下载,然后有指定的回调处理。
- 在回调函数中,你解析网站的内容,同程使用的是Xpath选择器(但是你也可以使用BeautifuSoup, lxml或其他任何你喜欢的程序),并生成解析的数据项。
- 最后,从蜘蛛返回的项目通常会进驻到项目管道。
5、Item Pipeline(项目管道)
项目管道的主要责任是负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。每个项目管道的组件都是有一个简单的方法组成的Python类。他们获取了项目并执行他们的方法,同时他们还需要确定的是是否需要在项目管道中继续执行下一步或是直接丢弃掉不处理。
项目管道通常执行的过程有:
- 清洗HTML数据
- 验证解析到的数据(检查项目是否包含必要的字段)
- 检查是否是重复数据(如果重复就删除)
- 将解析到的数据存储到数据库中
6、Downloader middlewares(下载器中间件)
下载中间件是位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。它提供了一个自定义的代码的方式来拓展Scrapy的功能。下载中间器是一个处理请求和响应的钩子框架。他是轻量级的,对Scrapy尽享全局控制的底层的系统。
7、Spider middlewares(蜘蛛中间件)
蜘蛛中间件是介于Scrapy引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛的响应输入和请求输出。它提供一个自定义代码的方式来拓展Scrapy的功能。蛛中间件是一个挂接到Scrapy的蜘蛛处理机制的框架,你可以插入自定义的代码来处理发送给蜘蛛的请求和返回蜘蛛获取的响应内容和项目。
8、Scheduler middlewares(调度中间件)
调度中间件是介于Scrapy引擎和调度之间的中间件,主要工作是处从Scrapy引擎发送到调度的请求和响应。他提供了一个自定义的代码来拓展Scrapy的功能。
三、数据处理流程
Scrapy的整个数据处理流程有Scrapy引擎进行控制,其主要的运行方式为:
- 引擎打开一个域名,时蜘蛛处理这个域名,并让蜘蛛获取第一个爬取的URL。
- 引擎从蜘蛛那获取第一个需要爬取的URL,然后作为请求在调度中进行调度。
- 引擎从调度那获取接下来进行爬取的页面。
- 调度将下一个爬取的URL返回给引擎,引擎将他们通过下载中间件发送到下载器。
- 当网页被下载器下载完成以后,响应内容通过下载中间件被发送到引擎。
- 引擎收到下载器的响应并将它通过蜘蛛中间件发送到蜘蛛进行处理。
- 蜘蛛处理响应并返回爬取到的项目,然后给引擎发送新的请求。
- 引擎将抓取到的项目项目管道,并向调度发送请求。
- 系统重复第二部后面的操作,直到调度中没有请求,然后断开引擎与域之间的联系。
四、驱动器
Scrapy是由Twisted写的一个受欢迎的Python事件驱动网络框架,它使用的是非堵塞的异步处理。如果要获得更多关于异步编程和Twisted的信息,请参考下面两条链接。
参考文献:http://doc.scrapy.org/topics/architecture.html
————————————————————————————————————————————————-
以上内容转载自http://www.tuicool.com/articles/fiyIbq
也可以参考官方的文档。
下面的实例实现的是爬取本博客的所有文章。
定制的爬虫代码:my_spider.py
04 |
from scrapy.spider import BaseSpider
|
05 |
from scrapy.selector import HtmlXPathSelector
|
07 |
from mymodules.items import Website
|
09 |
class My_Spider(BaseSpider):
|
11 |
allowed_domains = [ "yanming8.cn" ]
|
16 |
def parse( self , response):
|
17 |
hxs = HtmlXPathSelector(response)
|
18 |
blogs_url = hxs.select( '//h2/a/@href' ).extract()
|
20 |
items.extend([ self .make_requests_from_url(url).replace(callback = self .parse_post)
|
23 |
pages = hxs.select( '//div[@class="loop-nav-previous grid_5 alpha"]/a[not(@title)]/@href' ).extract()
|
25 |
items.append( self .make_requests_from_url(next_page))
|
29 |
def parse_post( self , response):
|
31 |
hxs = HtmlXPathSelector(response)
|
34 |
item[ 'url' ] = unicode (response.url)
|
35 |
item[ 'name' ] = hxs.select( '//h1[@class="entry-title entry-title-single"]/text()' ).extract()
|
36 |
item[ 'description' ] = response.body_as_unicode()
|
37 |
print response.url,item[ 'name' ]
|
代码中parse函数是用于获取文章列表的,并将每一页的文章地址加入list列表并返回,该函数是默认的回调函数。
代码中parse_post函数是用于获取每篇文章的具体内容。
然后会返回给pipeline进行处理,在这里可以进行索引内容的文件或者数据库存储。
分享到:
相关推荐
Scrapy 是一个强大的 Python 网络爬虫框架,它为开发者提供了构建高效、可扩展的网络爬虫所需的各种工具和组件。Scrapy 架构设计巧妙,利用 Twisted 异步网络库来处理网络通信,确保爬虫在处理大量网页时能够保持...
本项目主要关注的是使用Python3.6和Scrapy框架构建针对Bing和百度这两个主流搜索引擎的爬虫。下面将详细介绍这两个搜索引擎爬虫的相关知识。 首先,Python3.6是Python编程语言的一个版本,它具有强大的标准库,尤其...
"开源python网络爬虫框架Scrapy资料" Scrapy 是一个基于 Python 语言的开源网络爬虫框架,它提供了一个灵活、轻巧、高效的方式来抓取和处理网页数据。Scrapy 框架的核心组件包括 Scrapy 引擎、Scheduler、...
Scrapy是一个基于Python的开源网络爬虫框架,用于高效地抓取网站数据并提取结构化信息。Scrapy设计为模块化,便于扩展和定制,适用于各种规模的爬虫项目。 一、Scrapy架构 Scrapy的整体架构由多个核心组件构成,...
Scrapy是一个用Python编写的开源网络爬虫框架,它设计简洁、高效,适用于快速开发和实现复杂的网络爬虫项目。Scrapy的核心由多个组件构成,包括Scrapy Engine(引擎)、Scheduler(调度器)、Downloader(下载器)、...
Scrapy是一款强大的开源网页抓取框架,被广泛应用于数据采集领域。本文档旨在通过一个具体的示例,详细讲解如何使用Scrapy创建并运行一个基本的爬虫项目。 ##### 1.1 准备工作 在开始之前,请确保已经安装了Python...
Scrapy是一个基于Python的开源网络爬虫框架,它设计得简单高效,适用于各种数据抓取任务。Scrapy的架构设计允许开发者专注于编写抓取和处理数据的逻辑,而无需关心网络通信和其他底层实现细节。 Scrapy的核心组成...
### 使用Python的爬虫框架Scrapy爬取网页数据 #### Scrapy简介 Scrapy是一个用于Web数据抓取的强大开源框架,使用Python语言编写。它能够高效地从网站上抓取所需的数据,支持包括数据清洗、存储在内的多种操作。...
在Python的Web爬虫领域,Scrapy是一个强大而高效的框架,常用于构建数据抓取项目。它提供了丰富的功能,如请求调度、中间件处理、数据清洗等,使得爬虫开发变得更加便捷。而MySQL作为流行的开源关系型数据库,常用于...
Scrapy是一款用于Python的开源和协作的网络爬虫框架。它提供了所有必要的工具和服务,以便快速开发出一个可以抓取任何网站并从中提取结构化的数据的应用程序。Scrapy具有以下特点: 1. **高度模块化**:Scrapy的...
具体来说,我们可以通过分析“ping-scrapy-master”项目中的代码来了解Scrapy框架的几个核心组件,例如爬虫Spider的定义,Item的定义,以及如何在Spider中使用Selector进行数据的选择和抽取。除此之外,我们还可以...
以下是一些关于Python爬虫的知识点,以及提到的一些开源爬虫工具: 1. **Python爬虫源代码**: - Python爬虫源代码通常涉及到requests库用于发送HTTP请求,BeautifulSoup或lxml库解析HTML或XML文档,可能还会使用...
在Python 2.7环境下使用Scrapy,你需要确保系统已经安装了Python 2.7版本,并通过`pip install scrapy`命令来安装Scrapy框架。不过,值得注意的是,Python 2.7已在2020年停止官方支持,建议迁移到Python 3.x,以获得...
在`spiders`目录下,创建一个新的Python文件,如`douban_movie_spider.py`,并定义一个爬虫类,继承自`scrapy.Spider`。 **3. 编写爬虫** 在爬虫类中,你需要定义起始URL、解析规则(使用XPath或CSS选择器)以及...
Scrapy是一个强大的、开源的Python爬虫框架,其版本号为v2.11.1。这个框架的设计理念是让开发者能够快速构建自己的网络爬虫,以高效地抓取网页内容和各种媒体资源,如图片。Scrapy的核心是基于Twisted,这是一个著名...
Scrapy是一个基于Python的开源Web爬虫框架,它提供了一整套的解决方案,包括网络请求、数据解析、中间件处理、爬虫调度等。Scrapy的核心组件包括Spider(爬虫)、Downloader(下载器)、Scheduler(调度器)和Item ...
Scrapy是一个用Python编写的开源网络爬虫框架,它为开发者提供了构建网络爬虫应用的高效工具。Scrapy以其模块化的设计和强大的功能而闻名,可以处理网页抓取、数据解析、请求调度等多个环节。通过Scrapy,开发者能够...