




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、开源python网络爬虫框架Scrapy介绍:所 谓网络爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这种说法不够专业,更专业的描述就是,抓取特定网站网页的HTML数据。不过由于一个网站的 网页很多,而我们又不可能事先知道所有网页的URL地址,所以,如何保证我们抓取到了网站的所有HTML页面就是一个有待考究的问题了。一般的方法是,定义一个入口页面,然后一般一个页面会有其他页面的URL,于是从当前页面获取到这些URL加入到爬虫的抓取队列中,然后进入到新新页面后再递归的进行上述的操作,其实说来就跟深度遍历或广度遍历一样。上面介绍的只是爬虫的一些概念而非搜索引擎,实际上搜索引擎的话其系统是相当
2、复杂的,爬虫只是搜索引擎的一个子系统而已。下面介绍一个开源的爬虫框架Scrapy。一、概述Scrapy是一个用Python写的CrawlerFramework,简单轻巧,并且非常方便,并且官网上说已经在实际生产中在使用了,不过现在还没有Release版本,可以直接使用他们的Mercurial仓库里抓取源码进行安装。Scrapy使用Twisted这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。整体架构如下图所示:绿 线是数据流向,首先从初始URL开始,Scheduler会将其交给Downloader进行下载,下载之后会交给Spider进行分 析,Spid
3、er分析出来的结果有两种:一种是需要进一步抓取的链接,例如之前分析的“下一页”的链接,这些东西会被传回Scheduler;另一 种是需要保存的数据,它们则被送到ItemPipeline那里,那是对数据进行后期处理(详细分析、过滤、存储等)的地方。另外,在数据流动的通 道里还可以安装各种中间件,进行必要的处理。二、组件1、ScrapyEngine(Scrapy引擎)Scrapy引擎是用来控制整个系统的数据处理流程,并进行事务处理的触发。更多的详细内容可以看下面的数据处理流程。2、Scheduler(调度)调度程序从Scrapy引擎接受请求并排序列入队列,并在Scrapy引擎发出请求后返还给他们。
4、3、Downloader(下载器)下载器的主要职责是抓取网页并将网页内容返还给蜘蛛(Spiders)。4、Spiders(蜘蛛)蜘蛛是有Scrapy用户自己定义用来解析网页并抓取制定URL返回的内容的类,每个蜘蛛都能处理一个域名或一组域名。换句话说就是用来定义特定网站的抓取和解析规则。蜘蛛的整个抓取流程(周期)是这样的:1. 首先获取第一个URL的初始请求,当请求返回后调取一个回调函数。第一个请求是通过调用start_requests()方法。该方法默认从start_urls中的Url中生成请求,并执行解析来调用回调函数。2. 在回调函数中,你可以解析网页响应并返回项目对象和请求对象或两者的迭
5、代。这些请求也将包含一个回调,然后被Scrapy下载,然后有指定的回调处理。3. 在回调函数中,你解析网站的内容,同程使用的是Xpath选择器(但是你也可以使用BeautifuSoup,lxml或其他任何你喜欢的程序),并生成解析的数据项。4. 最后,从蜘蛛返回的项目通常会进驻到项目管道。5、ItemPipeline(项目管道)项 目管道的主要责任是负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的 次序处理数据。每个项目管道的组件都是有一个简单的方法组成的Python类。他们获取了项目并执行他们的方法,同时他们还需要
6、确定的是是否需要在项目管 道中继续执行下一步或是直接丢弃掉不处理。项目管道通常执行的过程有:1. 清洗HTML数据2. 验证解析到的数据(检查项目是否包含必要的字段)3. 检查是否是重复数据(如果重复就删除)4. 将解析到的数据存储到数据库中6、Downloadermiddlewares(下载器中间件)下 载中间件是位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。它提供了一个自定义的代码的方式来拓展 Scrapy的功能。下载中间器是一个处理请求和响应的钩子框架。他是轻量级的,对Scrapy尽享全局控制的底层的系统。7、Spidermiddlewa
7、res(蜘蛛中间件)蜘 蛛中间件是介于Scrapy引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛的响应输入和请求输出。它提供一个自定义代码的方式来拓展Scrapy的功能。 蛛中间件是一个挂接到Scrapy的蜘蛛处理机制的框架,你可以插入自定义的代码来处理发送给蜘蛛的请求和返回蜘蛛获取的响应内容和项目。8、Schedulermiddlewares(调度中间件)调度中间件是介于Scrapy引擎和调度之间的中间件,主要工作是处从Scrapy引擎发送到调度的请求和响应。他提供了一个自定义的代码来拓展Scrapy的功能。三、数据处理流程Scrapy的整个数据处理流程有Scrapy引擎进行控制,其主要的运行
8、方式为:1. 引擎打开一个域名,时蜘蛛处理这个域名,并让蜘蛛获取第一个爬取的URL。2. 引擎从蜘蛛那获取第一个需要爬取的URL,然后作为请求在调度中进行调度。3. 引擎从调度那获取接下来进行爬取的页面。4. 调度将下一个爬取的URL返回给引擎,引擎将他们通过下载中间件发送到下载器。5. 当网页被下载器下载完成以后,响应内容通过下载中间件被发送到引擎。6. 引擎收到下载器的响应并将它通过蜘蛛中间件发送到蜘蛛进行处理。7. 蜘蛛处理响应并返回爬取到的项目,然后给引擎发送新的请求。8. 引擎将抓取到的项目项目管道,并向调度发送请求。9. 系统重复第二部后面的操作,直到调度中没有请求,然后断开引擎与
9、域之间的联系。安装:Scrapy 是一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化 测试。Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、 sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。下面介绍Scrapy在windows下的安装:首先下载windows版:Scrapy-842.win32.exe,直接安装。安装之后不能直接运行scrapy提供的test,会提示错误,因为scrapy基于其
10、他一些python库,需要把这些库都安装才行。Twisted:TwistedMatrix是 一种用来进行网络服务和应用程序编程的纯Python框架,虽然TwistedMatrix中有大量松散耦合的模块化组件,但该框架的中心概念 还是非阻塞异步服务器这一思想。Twisted的安装也非常简单,在这里直接下载windows平台下的相应版本即可:/packages/2.7/T/Twisted/,erface:在这里下载/pypi/erface/3.8.0#downloads。zope.i
11、nterface没有提供windows平台下的exe版,只提供了windows平台下的egg包。ez_setup:下载/pypi/ez_setup,安装。将egg文件放置在python安装目录Scripts目录下。打开CMD并切换至scripts目录,easy_erface-3.8.0-py2.6-win32.egg安装。w3lib:erface问题解决之后还会提示缺少w3lib,下载/pypi/w3lib后安装即可libxml2:使用scrapy的html解析功能
12、时,会提示你缺少libxml2,所以我们先把这个也装上,地址/sources/win32/python/,下载相应的版本即可。至此就可以使用Scrapy玩spider了,大家可以根据文档写一个简单的爬虫试试,实际上使用scrapy做一个简易的爬虫甚至只需要几行代码就可以了,以后有空再详细说说使用方法,本文不做更多描述。入门:本文参考ScrapyTutorial里面的文档,翻译出来加上自己的理解,供大家学习。在本文中,我们将学会如何使用Scrapy建立一个爬虫程序,并爬取指定网站上的内容,这一切在Scrapy框架内实现将是很简单轻松的事情。本教程主要内容包括一下
13、四步:1.创建一个新的ScrapyProject2.定义你需要从网页中提取的元素Item3.实现一个Spider类,通过接口完成爬取URL和提取Item的功能4.实现一个ItemPipeLine类,完成Item的存储功能新建工程首先,为我们的爬虫新建一个工程,首先进入一个目录(任意一个我们用来保存代码的目录),执行:pythonviewplaincopyprint?1. scrapystartprojectDomzscrapystartprojectDomz最后的Domz就是项目名称。这个命令会在当前目录下创建一个新目录Domz,结构如下:pythonviewplaincopyprint?1.
14、 dmoz/2. scrapy.cfg3. dmoz/4. _init_.py5. items.py6. pipelines.py7. settings.py8. spiders/9. _init_.pydmoz/scrapy.cfgdmoz/_init_.pyitems.pypipelines.pysettings.pyspiders/_init_.pyscrapy.cfg:项目配置文件items.py:需要提取的数据结构定义文件pipelines.py:管道定义,用来对items里面提取的数据做进一步处理,如保存等settings.py:爬虫配置文件spiders:放置spider的目录定
15、义Item在items.py里面定义我们要抓取的数据:pythonviewplaincopyprint?1. fromscrapy.itemimportItem,Field2. 3. classDmozItem(Item):4. title=Field()5. link=Field()6. desc=Field()fromscrapy.itemimportItem,FieldclassDmozItem(Item):title=Field()link=Field()desc=Field()这里我们需要获取dmoz页面上的标题,链接,描述,所以定义一个对应的items结构,不像Django里面mo
16、dels的定义有那么多种类的Field,这里只有一种就叫Field(),再复杂就是Field可以接受一个default值。实现Spiderspider只是一个继承字scrapy.spider.BaseSpider的Python类,有三个必需的定义的成员name:名字,这个spider的标识start_urls:一个url列表,spider从这些网页开始抓取parse():一个方法,当start_urls里面的网页抓取下来之后需要调用这个方法解析网页内容,同时需要返回下一个需要抓取的网页,或者返回items列表所以在spiders目录下新建一个spider,dmoz_spider.py:pyth
17、onviewplaincopyprint?1. classDmozSpider(BaseSpider):2. name=3. start_urls=4. /Computers/Programming/Languages/Python/Books/,5. /Computers/Programming/Languages/Python/Resources/6. 7. 8. defparse(self,response):9. filename=response.url.split(/)-210. open(fi
18、lename,wb).write(response.body)classDmozSpider(BaseSpider):name=start_urls=/Computers/Programming/Languages/Python/Books/,/Computers/Programming/Languages/Python/Resources/defparse(self,response):filename=response.url.split(/)-2open(filename,wb).write(resp
19、onse.body)提取Item提取数据到Items里面,主要用到XPath提取网页数据:scrapy有提供两个XPath选择器,HtmlXPathSelector和XmlXPathSelector,一个用于HTML,一个用于XML,XPath选择器有三个方法select(xpath):返回一个相对于当前选中节点的选择器列表(一个XPath可能选到多个节点)extract():返回选择器(列表)对应的节点的字符串(列表)re(regex):返回正则表达式匹配的字符串(分组匹配)列表一种很好的方法是在Shell里面对XPath进行测试:pythonviewplaincopyprint?1. sc
20、rapyshell/Computers/Programming/Languages/Python/Books/scrapyshell/Computers/Programming/Languages/Python/Books/现在修改parse()方法看看如何提取数据到items里面去:pythonviewplaincopyprint?1. defparse(self,response):2. hxs=HtmlXPathSelector(response)3. sites=hxs.select(/ul/li)4. items
21、=5. forsiteinsites:6. item=DmozItem()7. itemtitle=site.select(a/text().extract()8. itemlink=site.select(a/href).extract()9. itemdesc=site.select(text().extract()10. items.append(item)11. returnitemsdefparse(self,response):hxs=HtmlXPathSelector(response)sites=hxs.select(/ul/li)items=forsiteinsites:it
22、em=DmozItem()itemtitle=site.select(a/text().extract()itemlink=site.select(a/href).extract()itemdesc=site.select(text().extract()items.append(item)returnitems实现PipeLinePipeLine用来对Spider返回的Item列表进行保存操作,可以写入到文件、或者数据库等。PipeLine只有一个需要实现的方法:process_item,例如我们将Item保存到一个文件中:pythonviewplaincopyprint?1. def_in
23、it_(self):2. self.file=open(jingdong.txt,wb)3. 4. defprocess_item(self,item,spider):5. self.file.write(itemtitle+t+itemlink+t+itemdesc+n)def_init_(self):self.file=open(jingdong.txt,wb)defprocess_item(self,item,spider):self.file.write(itemtitle+t+itemlink+t+itemdesc+n)到现在,我们就完成了一个基本的爬虫的实现,可以输入下面的命令来启
24、动这个Spider:pythonviewplaincopyprint?1. Scrapy之URL解析与递归爬取:前面介绍了Scrapy如何实现一个最简单的爬虫,但是这个Demo里只是对一个页面进行了抓取。在实际应用中,爬虫一个重要功能是”发现新页面”,然后递归的让爬取操作进行下去。发 现新页面的方法很简单,我们首先定义一个爬虫的入口URL地址,比如Scrapy入门教程中的start_urls,爬虫首先将这个页面的内容抓取之后, 解析其内容,将所有的链接地址提取出来。这个提取的过程是很简单的,通过一个html解析库,将这样的节点内容提取出来,href参数的值就是一个新页面 的URL。获取这个URL值之后,将其加入到任务队列中,爬虫不断的从队列中取URL即可。这样,只需要为爬虫定义一个入口的URL,那么爬虫就能够自动 的爬取到指定网站的绝大多数页面。当然,在具体的实现中,我们还需要对提取的URL做进一步处理:1.判断URL指向网站的域名,如果指向的是外部网站,那么可以将其丢弃2.URL去重,可以将所有爬取过的URL存入数据库中,然后查询新提取的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第一月考数学试卷
- 二年级阶段测试数学试卷
- 定陶初中二模数学试卷
- 课件培训的心得
- 2025至2030城市应急联动行业市场深度调研及前景趋势与发展趋势分析与未来投资战略咨询研究报告
- 四川眉山职业技术学院招聘考试真题2024
- 宁波前湾控股集团有限公司人员招聘考试真题2024
- 成都市东光实验小学教师招聘考试真题2024
- 2025至2030超级食物粉行业市场深度研究与战略咨询分析报告
- 奋飞初三期中数学试卷
- 肉毒素治疗眼睑痉挛
- 叉车教学课件教学课件
- 《化工设备机械基础(第8版)》完整全套教学课件
- 2024年江西省中考英语试题含解析
- 人工智能算法与实践-第16章 LSTM神经网络
- 数学史简介课件可编辑全文
- 贵阳出租车驾驶员从业资格证(区域)考试总题库(含答案)
- 金川公司社会招聘试题
- 建设银行房产抵押贷款合同
- 福建省初中历史八年级期末下册通关试卷详细答案和解析
- 2024CSCO结直肠癌诊疗指南解读
评论
0/150
提交评论