主机环境: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一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化...
使用Charles,mitmdump,Appium等工具实现App爬取的方法,紧接着介绍了pyspider框架和Scrapy框架的使用,以及分布式爬虫的知识,最后介绍了Bloom Filter效率优化,Docker和Scrapyd爬虫部署,Ger
feapder是一种简单,快速,轻量级的爬虫框架。起名源于fast,easy,air,pro,spider的缩写,以开发快速,抓取快速,使用简单,功能强大为一体,历时4年倾心打造。支持轻量爬虫,分布爬虫,并列爬虫,爬虫集成,以及...
蜘蛛 学习中的写的一些爬虫代码,包括淘宝,大型新闻网站,一些实验数据网站等,所有爬虫基于python3,部分爬虫基于scrapy框架。淘宝:淘宝爬虫cma_data_spider:中国气象数据网爬虫
scrapy是一个Python爬虫框架,爬取效率极高,具有高度定制性,但是不支持分布式。而scrapy-redis一套基于redis数据库、运行在scrapy框架之上的组件,可以让scrapy支持分布式策略,Slaver端共享Master端redis数据库里...
leetcode融资 ...爬虫(scrapySpider文件夹): 网易: 凤凰网: FT中文网: 第一财经: 备注 统一时间格式: YY-NN-DD HH:MM 来源: 第一财经: yicai FT中文网: ftchinese 凤凰网: ifeng 网易财经: wangyi
moear-spider-zhihudailyMoEar的爬虫插件,用以提供对知乎日报的文章爬取以及文章格式化等功能BadgeGitHub文档PyPi其他License本项目采用 协议开源发布,请您在修改后维持开源发布,并为原作者额外署名,谢谢您的...
迁移代码到爬虫框架scrapy 优化了抽取部分代码 数据持久化迁移到mongodb 修复chatbot失败问题 开放neo4j后台界面,可以查看知识图谱成型效果 提示 如果是项目问题,请提问题。 如果涉及到不方便公开的,请发邮件。 ...
spider 爬虫目录 主要在里面的scrapy目录 其他的是demo文件 static 网站静态文件 templates 网站模板 web flask相关代码 环境 Python 3.6.* Mysql 5.7 Flask 1.0.2 scrapy 1.6.0 部署和运行 git clone https://g
(本科毕业设计)基于网络爬虫的数据分析系统的实现:用python2.7 + Scrapy-Redis分布式架构下的网络爬虫,用json编码+ Cookies池+搜索策略BFS +破解验证码+布隆过滤器+抵制AJAX,Redis放到内存中去重加权和实现...
很棒的网络刮板 支持 令人敬畏的Web scaper,爬虫的集合。 Java ...开源Web爬虫,建立在nosql数据库(apacheouchdb,riak),AMQP数据库(rabbitmq),webmachine和mochiweb之上。 Python scrap