大数据采集与预处理课件:Scrapy各组件的用法 -2_第1页
大数据采集与预处理课件:Scrapy各组件的用法 -2_第2页
大数据采集与预处理课件:Scrapy各组件的用法 -2_第3页
大数据采集与预处理课件:Scrapy各组件的用法 -2_第4页
大数据采集与预处理课件:Scrapy各组件的用法 -2_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用Scrapy爬虫框架采集数据——爬取汽车之家数据 本章学习目标了解Scrapy爬虫框架的工作原理了解Scrapy爬虫框架的安装过程以及各组件的基本含义和用法掌握Scrapy爬虫框架采集数据的实例6.3.3DownloaderMiddleware DownloaderMiddleware是一个挂钩到Scrapy的请求/响应处理的框架。这是一个轻型、低层次的系统,用于全局地修改Scrapy的请求和响应。要激活DownloaderMiddleware组件,请将其添加到downloader_middleware设置中,该设置是一个dict,其键是中间件类路径,其值是中间件顺序值(按照优先级排序的值,值越小越靠近Scrapy引擎,优先级越高;值越大越靠近DownloaderMiddleware。)。DOWNLOADER_MIDDLEWARES={'myproject.middlewares.CustomDownloaderMiddleware':543,}DOWNLOADER_MIDDLEWARES设置与DOWNLOADER_MIDDLEWARES_BASE设置一起合并设置定义Scrapy(而不是要覆盖),然后按顺序排序,得到最终的中间件使用的分类列表):第一个中间件是更接近接近引擎的,最后一个中间件是更接近于下载器的。换句话说,将以递增的中间件顺序(100、200、300、…)调用每个中间件的process_request()方法,并以递减的顺序调用每个中间件的process_response()方法。每个DownloaderMiddleware组件都是一个Python类,该类定义了以下一种或多种方法。1.process_request(request,spider)通过下载中间件的每个请求都会调用的方法。process_request()应该是返回None、返回响应对象、返回请求对象或引发IgnoreRequest。如果返回None,Scrapy将继续处理这个请求,执行所有其他中间件,直到最后调用适当的下载器处理程序来调用执行的请求(以及下载的响应)。如果返回响应对象,Scrapy不会调用任何其他process_request(),process_exception()方法或适当的下载函数;它会返回那个响应对象。在每个响应对象上总是调用已安装中间件的process_response()方法。如果返回请求对象,Scrapy将停止调用process_request方法并重新调度返回的请求。一旦执行了新返回的请求,将在下载的响应上调用适当的中间件链。如果返回IgnoreRequest,将调用已安装的下载程序中间件的process_exception()方法。如果它们都不处理异常,则调用请求的errback函数(request.errback)。如果没有代码处理引发的异常,则会忽略它,并且不记录它。2.process_response(request,response,spider)process_response()应该返回一个响应对象,返回一个请求对象,或者引发一个IgnoreRequest异常。如果它返回一个响应对象(可以是相同的给定响应,也可以是一个全新的响应),那么该响应将继续使用链中下一个中间件的process_response()进行处理。如果它返回一个请求对象,中间件链将被停止,返回的请求将被重新安排,以便在将来下载。这与从process_request()返回请求的行为相同。如果它引发了IgnoreRequest异常,就会调用请求的errback函数(request.errback)。如果没有代码处理引发的异常,它将被忽略,并且不会被记录。3.process_exception(request,exception,spider)当下载处理程序或process_request()(来自下载器中间件)引发异常(包括IgnoreRequest异常)时,Scrapy调用process_exception()。process_exception()应该返回None、响应对象或请求对象。如果它不返回任何异常,Scrapy将继续处理这个异常,执行已安装中间件的任何其他process_exception()方法,直到没有任何中间件留下,并启用默认异常处理。如果它返回一个响应对象,则启动已安装中间件的process_response()方法链,Scrapy不会费心调用中间件的任何其他process_exception()方法。如果它返回一个请求对象,返回的请求将被重新安排,以便在将来下载。就像返回响应一样,这将停止中间件的process_exception()方法的执行.4.from_crawler(cls,crawler)如果存在,则调用此类方法从爬虫创建中间件实例。它必须返回中间件的一个新实例。爬虫对象提供对Scrapy所有的核心组件的访问,如设置和信号;它是中间件访问它们并将其功能与Scrapy挂钩的一种方法。6.3.4ItemPipeline 在一个Item被爬虫爬去之后,它被发送到项目管道ItemPipeline,该管道通过顺序执行的几个组件处理它。每个项目管道组件(有时简称为“项目管道”)是一个Python类,它实现了一个简单的方法。它们接收到一个Item并对其执行一个操作,还可以决定该项目是继续通过管道,还是删除,不再处理。项目管道的典型用途有:清理HTML数据,验证爬取的数据(检查项目是否包含某些字段),检查是否有副本(并删除它们),是否将爬取的项目存储在数据库中。每个项目管道组件都是Python类,必须实现以下方法。1.process_item(self,item,spider)对每个项目管道组件调用此方法。process_item()必须返回一个带有数据的dict,返回一个Item(或任何子类)对象,返回一个TwistedDeferred或raiseDropItem异常。已删除的Item不再由其他管道组件处理。2.open_spider(self,spider)当启动爬行器时调用此方法。3.close_spider(self,spider)当关闭爬行器时调用此方法。4.from_crawler(cls,crawler)如果存在,则调用此类方法从爬虫创建管道实例。它必须返回管道的新实例。爬虫对象提供对Scrapy所有的核心组件的访问,如设置和信号;这是一种管道访问它们并将其功能连接到Scrapy的方法。【实例6-4】看看下面这个假想的管道,它调整不包含VAT(price_excludedes_vat属性)的条目的price属性,并删除不包含price的条目。fromscrapy.exceptionsimportDropItemclassPricePipeline(object):vat_factor=1.15defprocess_item(self,item,spider):ifitem['price']:ifitem['price_excludes_vat']:item['price']=item['price']*self.vat_factorreturnitemelse:raiseDropItem("没有价格in%s"%item)【实例6-5】下面的管道将所有来自爬虫的Items存储到单个Items.jl文件,每行包含一个JSON格式序列化的项目。importjsonclassJsonWriterPipeline(object):defopen_spider(self,spider):self.file=open('items.jl','w')defclose_spider(self,spider):self.file.close()defprocess_item(self,item,spider):line=json.dumps(dict(item))+"\n"self.file.write(line)returnitem要激活项目管道组件,必须将其类添加到item_pipeline设置。ITEM_PIPELINES={'myproject.pipelines.PricePipeline':300,'myproject.pipelines.JsonWriterPipeline':800,}在这个设置中,您为类分配的整数值决定了它们运行的顺序:项目从低值类到高值类。通常在0-1000范围内定义这些数字。下面将实现连接MySQL,并将数据插入到指定数据库中。【实例6-6】首先确保已经正确安装了MySQL,然后创建一个数据库file123,并在该数据库中创建一个表table123。其中,表tables123的SQL生成语句为:CREATETABLEtable123(titleVARCHAR(255)NULL,contentVARCHAR(255)NULL)接着实现一个类MysqlPipeline,代码如下:classMysqlPipeline():def_init_(self,host,database,user,password,port):self.host=hostself.database=databaseself.user=userself.password=passwordself.port=portdeffrom_crawler(cls,crawler):returncls(host=crawler.settings.get(‘MYSQL_HOST’),database=crawler.settings.get(‘MYSQL_DATABASE’),user=crawler.settings.get(‘MYSQL_USER’),password=crawler.settings.get(‘MYSQL_PASSWORD’),port=crawler.settings.get(‘MYSQL_PORT’),)defopen_spider(self,spider):self.db=pymysql.connect(self.host,self.user,self.password,self.database,charset=’utf-8’,port=self.port)self.cursor=self.db.cursor()defclose_spider(self,spider):self.db.close()defprocess_item(self,item,spider):data=dict(item)keys=‘,’.join(data.keys())values=‘,’.join([‘%s’]*len(data))sql=‘insertinto%s(%s)values(%s)’%(item.table,keys,values)self.cursor.execute(sql,tuple(data.values()))self.dbmit()returnitem最后,需要在settings.py里面配置MySQL的几个变量,代码如下:MYSQL_HOST=‘localhost’MYSQL_DATABASE=‘file123’MYSQL_USER=‘root’MYSQL_PASSWORD=‘123456’MYSQL_PORT=‘3306’

这样,就分别定义了MySQL的主机,数据库,用户名,密码和端口,从而实现了MySQLPipeline。Scrapy提供了可重用的项目管道,用于下载附加到特定项目的文件(例如,当您提取产品并希望在本地下载它们的图像时)。这些管道共享一些功能和结构(我们将它们称为媒体管道),但是通常您要么使用文件管道,要么使用图像管道。

管道还保留那些正在计划下载的媒体url的内部队列,并将包含相同媒体的响应连接到该队列。这样,当多个项目共享同一媒体时,就可以避免多次下载该媒体。1.在使用FilesPipeline时(1)在爬虫中,您提取一个item,并将所需的url放入file_urls字段中。(2)item从爬虫返回并进入项目管道。(3)当item到达FilesPipeline时,file_urls字段中的url将被安排使用标准的Scrapy调度器和下载加载器(这意味着调度器和下载加载器中间件被重用)进行下载,但是具有更高的优先级,在其他页面被清理之前对它们进行处理。在文件下载完成(或由于某种原因失败)之前,该项目在特定的管道阶段保持“锁定”状态。(4)当下载文件时,将用结果填充另一个字段(文件)。该字段将包含关于下载文件的信息的dicts列表,例如下载的路径、原始爬取的url(从file_urls字段中获取)和文件校验和。文件字段列表中的文件将保持原始file_urls字段的顺序。如果某些文件下载失败,将记录一个错误,文件将不会出现在files字段中。2.在使用ImagesPipeline时(1)使用ImagesPipeline与使用FilesPipeline非常相似,不同之处是使用的默认字段名不同:您将image_urls用于item的图像url,它将填充一个images字段,用于下载图像的信息。(2)使用ImagesPipeline处理图像文件的优点是,您可以配置一些额外的函数,如生成缩略图和根据图像的大小过滤图像。(3)ImagesPipeline使用Pillow将图像固定并规范化为JPEG/RGB格式,因此您需要安装这个库才能使用它。PythonImagingLibrary(PIL)在大多数情况下也可以工作,但众所周知,它会在一些设置中带来麻烦,所以我们建议使用Pillow而不是PIL。要启用媒体管道,必须首先将其添加到项目item_pipeline设置中。对于图像管道,使用:ITEM_PIPELINES={'scrapy.pipelines.images.ImagesPipeline':1}对于文件管道,使用:ITEM_PIPELINES={'scrapy.pipelines.files.FilesPipeline':1}然后,将目标存储设置配置为用于存储下载图像的有效值。否则,管道将保持禁用状态,即使在item_pipeline设置中包含管道。对于文件管道,设置FILES_STORE设置:FILES_STORE='/path/to/valid/dir'对于图像管道,设置IMAGES_STORE设置:IMAGES_STORE='/path/to/valid/dir'3.在自定义文件管道中重写的方法(1)get_media_requests(item,info)。正如在工作流中看到的,管道将从item中获得要下载的图像的url。为了做到这一点,可以覆盖get_media_requests()方法,并为每个文件URL返回一个请求:defget_media_requests(self,item,info):forfile_urlinitem['file_urls']:yieldscrapy.Request(file_url)这些请求将由管道处理,当它们完成下载后,结果将作为一个包含2个元素的元组列表发送到item_completed()方法。每个元组将包含(success,file_info_or_error)。success是一个布尔值,如果下载成功,则为True;如果由于某种原因失败,则为False。file_info_or_error是一个包含以下键的字典(如果success是True),或者是一个有问题的Twisted失败。url:下载文件的url。这是get_media_requests()方法返回的请求的url。path:存储文件的路径(相对于FILES_STORE)。checksum图像内容的MD5散列item_completed()接收的元组列表保证保持从get_media_requests()方法返回的请求的相同顺序。默认情况下,get_media_requests()方法不返回任何值,这意味着该项目没有要下载的文件。(2)item_completed(results,

item,

info)。

当对单个项目的所有文件请求都已完成(要么完成下载,要么由于某种原因失败)时,调用FilesPipeline.item_completed()方法。item_completed()方法必须返回将发送到后续项目管道阶段的输出,因此必须像在任何管道中一样返回(或删除)项目。默认情况下,item_completed()方法返回item。4.在自定义图像管道中重写的方法ImagesPipeline是FilesPipeline的扩展,用于自定义字段名并为图像添加自定义行为。(1)get_media_requests(item,

info)。方法的工作方式与FilesPipeline.get_me

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论