【Python爬虫Scrapy框架】三、Scrapy框架介绍及Spider、中间件、Item Ppeline的用法介绍
【摘要】
文章目录
一、前情回顾二、框架介绍三、Spider的用法四、Downloader Middleware的用法1、介绍2、激活3、主要方法
五、Spider Middleware的用法...
一、前情回顾
前面两篇,用了一个小实例初步入门Scrapy,这篇来详细讲一下Scrapy框架,理论较多,可能有些无聊。
二、框架介绍
可以分为以下几个部分:
(其中需要常需要手写的有Spider
和Item Pipeline
)
-
Engine(引擎):处理整个系统的数据流处理、触发事务,是整个框架的核心。
-
Item(项目):它定义了爬取结果的数据结构,爬取的数据会被赋值成该Item对象。
-
Scheduler(调度器):接受引擎发过来的请求并将其加入队列中,在引擎再次请求的时候将请求提供给引擎。
-
Downloader(下载器):下载网页内容,并将网页内容返回给蜘蛛。
-
Spiders(蜘蛛):它定义了爬取的逻辑和网页的解析规则,它主要负责解析响应并生成提取结果和新的请求。
-
Item Pipeline(项目管道):负责处理由蜘蛛从网页中抽取的项目,主要任务是清洗、验证和存储数据。
-
Downloader Middlewares(下载器中间件):位于引擎和下载器之间的钩子框架,主要处理引擎与下载器之间的请求及响应。
-
Spider Middlewares(蜘蛛中间件):位于引擎和蜘蛛之间的钩子框架,主要处理向蜘蛛输入的响应和输出的结果及新的请求。
数据流过程如下:
三、Spider的用法
实现一个Scrapy爬虫项目,Spider要做的事,就两件:
- 定义爬取网站的动作
- 分析爬取下来的网页
Spider类提供了start_requests()方法,读取并请求start_urls属性,根据返回的结果调用parse()方法解析结果。
Spider类提供的方法:
- start_requests():用于生成初始请求,默认使用start_urls里面的url来构造Request,且使用的是Request的GET请求方式,如果想使用POST的请求方式,需要重写这个方法。
- parse():它负责处理Response,处理返回结果,并从中提取出想要的数据和下一步请求,然后返回。该方法返回一个包含Request或Item的可迭代对象。当Response没有指定回调函数时,该方法会默认调用。
- closed():当Spider关闭时,该方法会被调用,在这里一般会定义释放资源的一些操作或其它收尾操作。
Spider类的属性:
- name:定义Spider名字的字符串,它必须是唯一的。
- allowed_domains:允许爬取的域名。不在此域名范围内的链接会被过滤掉。
- start_urls:起始的URL列表,当没有实现start_requests()方法时,默认从这个列表开始抓取。
- custom_settings:专属于此Spider的配置,会覆盖项目的全局设置。
- crawler:包含很多的项目组件,利用它可以获取项目的一些配置信息。
- settings:利用它可以直接获取项目的全局设置变量。
四、Downloader Middleware的用法
1、介绍
Downloader Middleware是下载器中间件,它处于Scrapy的Request和Response之间的处理模块。
从数据流过程看,Downloader Middleware在整个架构中起到作用的位置有两个:
- 在Scheduler调度出队列的Request发送给Downloader下载之前
- 在下载后生成的Response发送给Spider之前
Downloader Middleware的功能十分强大,可以修改User-Agent、处理重定向、设置代理、失败重试、设置Cookies等。
scrapy对Downloader Middleware进行了默认设置,通常情况下是不能被修改的,但是我们可以进行激活自定义了,但这个时候需要参考scrapy的默认设置,因为这个顺序会影响scrapy的执行。默认设置DOWNLOADER_MIDDLEWARES_BASE内容如下:
{
'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 100,
'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware': 300,
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350,
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 400,
'scrapy.downloadermiddlewares.retry.RetryMiddleware': 500,
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware': 550,
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware': 580,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 590,
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600,
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700,
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,
'scrapy.downloadermiddlewares.chunked.ChunkedTransferMiddleware': 830,
'scrapy.downloadermiddlewares.stats.DownloaderStats': 850,
'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware': 900,
}
显然,我们可以看到这是一个字典格式的内容,字典的键名是Scrapy内置的Downloader Middleware的名称,键值代表了调用的优先级。键值越大代表越靠近Downloader,越小则代表越靠近Scrapy引擎。
2、激活
需要修改settings.py文件中第54行,将注释取消。
DOWNLOADER_MIDDLEWARES = {
'firstpro.middlewares.FirstproDownloaderMiddleware': 543,
}
DOWNLOADER_MIDDLEWARES 设置会与Scrapy定义的 DOWNLOADER_MIDDLEWARES_BASE 设置是合并
(但不是覆盖), 而后根据顺序(order)进行排序,最后得到启用中间件的有序列表。
3、主要方法
在middlewares.py文件中,可以找到找到Downloader Middleware的类。主要方法有以下三个:
①、process_request(request, spider)
当每个request通过下载中间件时,该方法被调用。
- 参数:
- request(Request 对象)–处理的request
- spider(Spider 对象)–该request对应的spider
process_request() 必须返回其中之一: 返回 None 、返回一个 Response 对象、返回一个 Request 对象或抛出异常。
- 返回值
-
如果其返回 None ,Scrapy将继续处理该request,执行其他的中间件的相应方法,直到合适的下载器处理函数(download handler)被调用, 该request被执行(其response被下载)。
-
如果其返回 Response 对象,Scrapy将不会调用 任何 其他的 process_request() 或 process_exception() 方法,或相应地下载函数; 其将返回该response。 已安装的中间件的 process_response() 方法则会在每个response返回时被调用。
-
如果其返回 Request 对象,Scrapy则停止调用process_request方法并重新调度返回的request。当新返回的request被执行后, 相应地中间件将会根据下载的response被调用。
-
如果抛出异常,则安装的下载中间件的 process_exception() 方法会被调用。如果没有任何一个方法处理该异常, 则request的errback(Request.errback)方法会被调用。如果没有代码处理抛出的异常, 则该异常被忽略且不记录(不同于其他异常那样)。
-
②、process_response(request, response, spider)
- 参数:
- request (Request 对象) – response所对应的request
- response (Response 对象) – 被处理的response
- spider (Spider 对象) – response所对应的spider
process_request() 必须返回以下之一: 返回一个 Response 对象、 返回一个 Request 对象或抛出异常。
- 返回值:
- 如果其返回一个 Response (可以与传入的response相同,也可以是全新的对象), 该response会被在链中的其他中间件的 process_response() 方法处理。
- 如果其返回一个 Request 对象,则中间件链停止, 返回的request会被重新调度下载。处理类似于 process_request() 返回request所做的那样。
- 如果其抛出异常,则调用requesterrback(Request.errback)。 如果没有代码处理抛出的异常,则该异常被忽略且不记录(不同于其他异常那样)。
③、process_exception(request, exception, spider)
当下载处理器(download handler)或 process_request() (下载中间件)抛出异常(包括IgnoreRequest异常)时,Scrapy调用 process_exception() 。
- 参数:
- request (是 Request 对象) – 产生异常的request
- exception (Exception 对象) – 抛出的异常
- spider (Spider 对象) – request对应的spider
process_exception() 应该返回以下之一: 返回 None 、 一个 Response 对象、或者一个 Request 对象。
- 返回值:
- 如果其返回 None ,Scrapy将会继续处理该异常,接着调用已安装的其他中间件的 process_exception() 方法,直到所有中间件都被调用完毕,则调用默认的异常处理。
- 如果其返回一个 Response 对象,则已安装的中间件链的 process_response() 方法被调用。Scrapy将不会调用任何其他中间件的 process_exception() 方法。
- 如果其返回一个 Request 对象, 则返回的request将会被重新调用下载。这将停止中间件的 process_exception() 方法执行,就如返回一个response的那样。
五、Spider Middleware的用法
1、介绍
Spider Middleware是介于Scrapy的Spider处理机制的钩子框架。
从数据流过程看,Spider Middleware在整个架构中起到作用的位置有三个:
- 在Downloader生成的Response发送给Spider之前
- 在Spider生成的Request发送给Scheduler之前
- 在Spider生成的Item发送给Item Pipeline之前
和Downloader Middleware一样,Scrapy对Spider Middleware进行了默认设置。默认设置SPIDER_MIDDLEWARES_BASE内容如下:
{
'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': 50,
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': 500,
'scrapy.spidermiddlewares.referer.RefererMiddleware': 700,
'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware': 800,
'scrapy.spidermiddlewares.depth.DepthMiddleware': 900,
}
和Downloader Middleware类似,键值越大,越靠近Spider Middleware,键值越小,越靠近Scrapy引擎。
2、激活
修改settings.py文件第48行,取消注释
SPIDER_MIDDLEWARES = {
'firstpro.middlewares.FirstproSpiderMiddleware': 543,
}
SPIDER_MIDDLEWARES设置会与Scrapy定义的 SPIDER_MIDDLEWARES_BASE 设置是合并
(但不是覆盖), 而后根据顺序(order)进行排序,最后得到启用中间件的有序列表。
3、主要用法
①、process_spider_input(response, spider)
当Response被Spider Middleware处理时,该方法被调用。
- 参数:
- response—被处理的Response
- spider—该Response对应的Spider
process_spider_input()应返回None或者抛出异常。
- 返回值:
- 返回None,Scrapy将会继续处理该Response,调用所有其他的Spider Middleware,直到Spider处理该Response。
- 抛出异常,Scrapy调用Request的errback()方法。errback()的输出将会被重新输入到中间件中,使用process_spider_output()方法来处理,当其抛出异常时,则调用process_spider_exception()来处理。
②、process_spider_output(response, result, spider)
当Spider处理Response返回结果时,该方法被调用。
-
参数:
- response—生成该输出的Response
- result—包含Request或Item对象的可迭代对象
- spider—结果对应的Spider
process_spider_output()必须返回包含Request或Item对象的可迭代对象。
③、process_spider_exception(response, exception, spider)
当process_spider_input()方法抛出异常时,该方法被调用。
-
参数:
- response—异常被抛出时被处理的Response
- exception—被抛出的异常
- spider—抛出该异常的Spider
process_spider_exception()必须返回None或者一个包含Request或Item对象的可迭代对象。
-
返回值:
- 返回None,Scrapy将继续处理该异常,调用其他Spider Middleware中的process_spider_exception()方法,直到所有Spider Middleware都被调用。
- 返回一个可迭代对象,则其他Spider Middleware的process_spider_output()方法被调用,其他的process_spider_exception()不会被调用。
④、process_start_requests(start_requests, spider)
-
参数:
- start_requests—包含Request的可迭代对象
- spider—Start Requests所属的Spider
process_start_requests()必须返回另一个包含Request对象的可迭代对象
六、Item Pipeline的用法
1、介绍
当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。
每个item pipeline组件(有时称之为“Item Pipeline”)是实现了简单方法的Python类。他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。
以下是item pipeline的一些典型应用:
- 清理HTML数据
- 验证爬取的数据(检查item包含某些字段)
- 查重(并丢弃)
- 将爬取结果保存到数据库或者文件中
2、主要方法
①、process_item(self, item, spider)
每个item pipeline组件都需要调用该方法,这个方法必须返回一个具有数据的dict,或是 Item (或任何继承类)对象, 或是抛出 DropItem 异常,被丢弃的item将不会被之后的pipeline组件所处理。
-
参数:
- item (Item 对象或者一个dict) – 被爬取的item
- spider (Spider 对象) – 爬取该item的spider
-
返回值:
- 返回Item对象那么此Item会被低优先级的Item Pipeline的process_item()方法处理,直到所有的方法被调用完毕。
- 抛出异常,那么此Item会被丢弃,不再进行处理。
②、open_spider(self, spider)
当spider被开启时,这个方法被调用。
-
参数:
- spider (Spider 对象) – 被开启的spider
③、close_spider(self, spider)
当spider被关闭时,这个方法被调用。
- 参数:
spider (Spider 对象) – 被关闭的spider
④、from_crawler(cls, crawler)
from_crawler()方法是一个类方法,用@classmethod标识,是一种依赖注入的方式。如果给出,这个类方法将会被调用从Crawler创建一个pipeline实例,它必须返回一个pipeline的新的实例,Crawler对象提供了调用scrapy所有的核心组件的权限,比如你可以调用settings里面的设置项。
七、未来可期
文章到这里就要结束了,但故事还没有结局
如果本文对你有帮助,记得点个赞👍哟,也是对作者最大的鼓励🙇♂️。
如有不足之处可以在评论区👇多多指正,我会在看到的第一时间进行修正
作者:爱打瞌睡的CV君
CSDN:https://blog.csdn.net/qq_44921056
本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。
文章来源: luckystar.blog.csdn.net,作者:爱打瞌睡的CV君,版权归原作者所有,如需转载,请联系作者。
原文链接:luckystar.blog.csdn.net/article/details/123479683
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)