版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用Scrapy爬虫框架采集数据——爬取汽车之家数据 本章学习目标了解Scrapy爬虫框架的工作原理了解Scrapy爬虫框架的安装过程以及各组件的基本含义和用法掌握Scrapy爬虫框架采集数据的实例6.3.1Selector
在抓取web页面时,需要执行的最常见任务是从HTML源提取数据。有几个库可以实现这一点。BeautifulSoup是Python程序员中非常流行的web抓取库,它根据HTML代码的结构构造Python对象,并合理地处理不好的标记,但它有一个缺点:速度慢。lxml是一个基于ElementTree的pythonAPI的XML解析库(它也解析HTML)。(lxml不是Python标准库的一部分。)Scrapy有自己的数据提取机制。它们之所以称为选择器,是因为它们“选择”由XPath或CSS表达式指定的HTML文档的某些部分。6.3Scrapy各组件的用法XPath是一种用于在XML文档中选择节点的语言,也可以与HTML一起使用。CSS是一种用于向HTML文档应用样式的语言。它定义了选择器来将这些样式与特定的HTML元素关联起来。Scrapy选择器是在lxml库之上构建的,这意味着它们在速度和解析精度方面非常相似。Scrapy选择器是通过传递文本或文本响应对象构造的Selector类的实例。它根据输入类型自动选择最佳解析规则(XML或HTML),以下几种构建选择器selector的方式。>>>fromscrapy.selectorimportSelector>>>fromscrapy.httpimportHtmlResponse从文本构建实例:>>>body='<html><body><span>good</span></body></html>'>>>Selector(text=body).xpath('//span/text()').extract()[u'good']从响应构建实例:>>>response=HtmlResponse(url='http://example',body=body)>>>Selector(response=response).xpath('//span/text()').extract()[u'good']了方便起见,响应对象含有一个selector属性,完全可以使用这个快捷方式:>>>response.selector.xpath('//span/text()').extract()[u'good']实例【6-1】将使用一个HTML代码作为案例,进一步地介绍如何使用selector选择器。这里将是Scrapy的shell程序进行交互和测试。<html><head><basehref='http://example/'/><title>Examplewebsite</title></head><body><divid='images'><ahref='image1.html'>Name:Myimage1<br/><imgsrc='image1_thumb.jpg'/></a><ahref='image2.html'>Name:Myimage2<br/><imgsrc='image2_thumb.jpg'/></a><ahref='image3.html'>Name:Myimage3<br/><imgsrc='image3_thumb.jpg'/></a><ahref='image4.html'>Name:Myimage4<br/><imgsrc='image4_thumb.jpg'/></a><ahref='image5.html'>Name:Myimage5<br/><imgsrc='image5_thumb.jpg'/></a></div></body></html>1)首先是打开Scrapy的shell程序:scrapyshellurl(这里的url是指要使用的url)2)然后在shell加载之后,您将拥有响应response作为变量可用,以及响应中附加的选择器属性response.selector。由于这里处理的是HTML,选择器将自动使用HTML解析器。因此,通过查看页面的HTML代码,可以构造一个XPath来选择标题标记中的文本。>>>response.selector.xpath('//title/text()’)[<Selector(text)xpath=//title/text()>]3)使用XPath和CSS查询响应非常常见,响应包括两个方便的快捷方式:response.xpath()和response.css()。>>>response.xpath('//title/text()')[<Selector(text)xpath=//title/text()>]>>>response.css('title::text')[<Selector(text)xpath=//title/text()>]如您所见,.xpath()和.css()方法返回一个SelectorList实例,这是一个新的选择器列表。该API可用于快速选择嵌套数据。>>>response.css('img').xpath('@src').extract()[u'image1_thumb.jpg',u'image2_thumb.jpg',u'image3_thumb.jpg',u'image4_thumb.jpg',u'image5_thumb.jpg']要实际提取文本数据,必须调用selector.extract()方法,如下所示。>>>response.xpath('//title/text()').extract()[u'Examplewebsite']如果只想提取第一个匹配的元素,可以调用选择器.extract_first()。>>>response.xpath('//div[@id="images"]/a/text()').extract_first()u'Name:Myimage1'如果没有找到元素,则返回None。>>>response.xpath('//div[@id="not-exists"]/text()').extract_first()isNoneTrue可以提供一个默认返回值作为参数。>>>response.xpath('//div[@id="not-exists"]/text()').extract_first(default='not-found')'not-found'CSS选择器可以使用CSS3伪元素选择文本或属性节点。>>>response.css('title::text').extract()[u'Examplewebsite']选择方法(.xpath()或.css())返回相同类型的选择器列表,因此您也可以调用这些选择器的选择方法。这里有一个例子。>>>links=response.xpath('//a[contains(@href,"image")]')>>>links.extract()[u'<ahref="image1.html">Name:Myimage1<br><imgsrc="image1_thumb.jpg"></a>',u'<ahref="image2.html">Name:Myimage2<br><imgsrc="image2_thumb.jpg"></a>',u'<ahref="image3.html">Name:Myimage3<br><imgsrc="image3_thumb.jpg"></a>',u'<ahref="image4.html">Name:Myimage4<br><imgsrc="image4_thumb.jpg"></a>',u'<ahref="image5.html">Name:Myimage5<br><imgsrc="image5_thumb.jpg"></a>']>>>forindex,linkinenumerate(links):...args=(index,link.xpath('@href').extract(),link.xpath('img/@src').extract())...print'Linknumber%dpointstourl%sandimage%s'%argsLinknumber0pointstourl[u'image1.html']andimage[u'image1_thumb.jpg']Linknumber1pointstourl[u'image2.html']andimage[u'image2_thumb.jpg']Linknumber2pointstourl[u'image3.html']andimage[u'image3_thumb.jpg']Linknumber3pointstourl[u'image4.html']andimage[u'image4_thumb.jpg']Linknumber4pointstourl[u'image5.html']andimage[u'image5_thumb.jpg']选择器selector有一个.re()方法用来使用正则表达式获取数据,该方法返回一个unicode字符串的列表。>>>response.xpath('//a[contains(@href,"image")]/text()').re(r'Name:\s*(.*)') [u'Myimage1',u'Myimage2',u'Myimage3',u'Myimage4',u'Myimage5']6.3.2Spider Spider类是定义如何对某个站点(或一组站点)进行抓取的类,包括如何执行抓取(即跟踪链接)以及如何从其页面中提取结构化数据(即抓取项)。换句话说,spider是为爬取和解析页面特定站点(或者在某些情况下是一组站点)的自定义行为的地方。对于Spider来说,一个抓取周期的具体过程如下。首先生成初始请求来抓取第一个url,然后指定一个回调函数,使用从这些请求下载的响应来调用该回调函数。要执行的第一个请求是通过调用start_requests()方法获得的,该方法(默认设置)为start_urls中指定的url生成请求,并将解析方法作为请求的回调函数。在回调函数中,解析响应(web页面)并返回带有提取的数据、Item对象、请求对象的dicts或可迭代的对象。这些请求还将包含一个回调(可能是相同的),然后由Scrapy下载,之后由指定的回调函数处理它们的响应。在回调函数中,您解析页面内容,通常使用选择器Selectors(但是您也可以使用BeautifulSoup、lxml或您喜欢的任何机制)并使用解析后的数据生成项目Items。最后从爬虫返回的item通常会持久化到数据库(在某个项管道中ItemPipeline),或者使用Feedexports将其写入文件。这是一个最简单的Spider周期,也是所有其他Spider都必须继承的Spider(包括与Scrapy捆绑在一起的Spider,以及你自己编写的Spider)。它不提供任何特殊功能。它只是提供了一个默认的start_requests()实现,该实现从start_urlsspider属性发送请求,并为每个结果响应调用爬行器的方法解析。Spider中包含一些重要的属性如下。1.name定义此爬虫名称的字符串。爬虫名称是Scrapy定位(和实例化)爬虫的方式,因此它必须是惟一的。这是最重要的Spider属性,也是必需的。2.allowed_domains一个可选的字符串列表,其中包含允许爬虫爬取的域。如果启用OffsiteMiddleware,那么对不属于此列表中指定的域名(或其子域名)的url的请求将不会被跟踪。3.start_urls当指定非特定url时,爬虫将从其中开始爬取的url列表。因此,下载的第一个页面将在这里列出。后续请求将从开始的url中获得连续的生成数据。4.custom_settings运行此爬虫时将从项目wideconfiguration中重写的设置字典。它必须定义为classattribute,因为在实例化之前会更新设置。在运行Spider的时候,一个字典类型的设置将被从整个项目的配置范围内重写。它必须被定义为一个类属性,因为在实例化之前会更新设置。5.crawler这个属性是在初始化类之后由from_crawler()类方法设置的,并链接到这个爬虫实例绑定到的crawler对象。6.settings运行此爬虫的配置。这是一个实例。7.logger用爬虫的名称创建的Python日志记录器。您可以使用它发送日志消息。8.from_crawler(crawler,*args,**kwargs)这是Scrapy用来创建爬虫的类方法。您可能不需要直接重写它,因为它默认作为__init__()方法的代理,通过使用给定参数args和命名参数kwargs调用它。尽管如此,该方法在新实例中设置spider和settings属性,以便稍后可以在spider的代码中访问它们。9.start_requests()实例【6-2】这个方法必须返回一个可迭代的,并带有第一个请求来爬取的爬虫。当spider被打开时,它被称为Scrapy。Scrapy只调用它一次,所以将start_requests()实现为生成器是安全的。classMySpider(scrapy.Spider):name='myspider'defstart_requests(self):return[scrapy.FormRequest("http://www.example/login",formdata={'user':'john','pass':'secret'},callback=self.logged_in)]deflogged_in(self,response):#在这里,您将提取链接以跟踪它们,并使用另一个回调返回每个链接的请求
pass10.parse(response)
当请求没有指定的回调函数时,这是Scrapy用来处理下载后的响应数据的默认回调函数。解析方法负责处理响应,并返回收集的数据或更多url。其他请求回调具有与Spider类相同的要求。此方法以及任何其他请求回调函数都必须返回可迭代的请求,dicts或Item对象。11.closed(reason)当spider关闭时。这个方法为spider_closed信号提供了一个快捷方式。实例【6-3】下面的实例是从一个回调中返回多个请求和项目。importscrapyclassMySpider(scrapy.Spider):name='example'allowed_domains=['example']
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年政工职称考试题库含完整答案(名校卷)
- 2026年演出经纪人之演出经纪实务考试题库(能力提升)
- 咨询服务合同(2025年市场预测)
- 智能照明控制系统采购合同(办公楼)2025年
- 远程教师2025年合同协议
- 英语介绍别人课件
- 中小学生中秋节习俗介绍班会
- 安全课件小知识
- 医美服务终止合同2025年
- 年会抽奖模板0转盘抽奖游戏
- 智慧产业园仓储项目可行性研究报告-商业计划书
- 四川省森林资源规划设计调查技术细则
- 广东省建筑装饰装修工程质量评价标准
- 银行外包服务管理应急预案
- 楼板回顶施工方案
- DB13T 5885-2024地表基质调查规范(1∶50 000)
- 2025年度演出合同知识产权保护范本
- 区块链智能合约开发实战教程
- 2025年校长考试题库及答案
- 《煤矿开采基本概念》课件
- 口腔进修申请书
评论
0/150
提交评论