scrapy中的选择器下载中间价downloadmiddlewares

下载中间件

下载器中间件是介于Scrapy的request/response处理的钩子框架。 是用于全局修改Scrapy request和response的一个轻量、底层的系统。

1.激活下载中间件

要激活下载器中间件组件,将其加入到  DOWNLOADER_MIDDLEWARES  设置中。 该设置是一个字典(dict),键为中间件类的路径,值为其中间件的顺序(order)。

eg:

DOWNLOADER_MIDDLEWARES = {

‘myproject.middlewares.CustomDownloaderMiddleware‘: 543,

}

在几个设置中都可以进行设置。

DOWNLOADER_MIDDLEWARES 设置会与Scrapy定义的

DOWNLOADER_MIDDLEWARES_BASE 设置合并(但不是覆盖), 而后根据顺序(order)进行排序,最后得到启用中间件的有序列表: 第一个中间件是最靠近引擎的,最后一个中间件是最靠近下载器的。

2.下载件执行顺序

下载件在中有两个方法,

process_request(self,request,spider)用于处理请求的方法,此时请求由引擎发往下载器。

process_response(self,reuqest,response,spider)用于处理响应的方法,此时响应由下载器发往引擎。

order越小,距离downloader越远,process_request越先被执行,process_response越后被执行。

prcess_request1

prcess_request2

downloader

process_response2

process_response1

按照这个顺序来执行。

3.禁止内置中间件

如果您想禁止内置的(在 DOWNLOADER_MIDDLEWARES_BASE 中设置并默认启用的)中间件, 您必须在项目的 DOWNLOADER_MIDDLEWARES 设置中定义该中间件,并将其值赋为 None 。 例如,如果您想要关闭user-agent中间件:

DOWNLOADER_MIDDLEWARES = {

‘myproject.middlewares.CustomDownloaderMiddleware‘: 543,

‘scrapy.downloadermiddlewares.useragent.UserAgentMiddleware‘: None,

}

4.编写中间件

中间件一般都写在middlewares.py文件中,继承object类。

每个中间件组件须定义以下方法中至少一个:

process_request(request, spider)

当每个request通过下载中间件时,该方法被调用。

返回值:

process_request() 必须返回其中之一: 返回 None 、返回一个 Response 对象、返回一个 Request 对象或raise IgnoreRequest 。

返回 None Scrapy将继续处理该request,执行其他的中间件的相应方法,直到合适的下载器处理函数(download handler)被调用, 该request被执行(其response被下载)。

返回 Response 对象Scrapy将不会调用 任何 其他的 process_request() 或 process_exception() 方法,或相应地下载函数; 其将返回该response。 已安装的中间件的 process_response() 方法则会在每个response返回时被调用。

返回 Request 对象:Scrapy则停止调用 process_request方法并重新调度返回的request。当新返回的request被执行后, 相应地中间件链将会根据下载的response被调用。相当于返回一个新的request,还是再从第一个中间件开始执行。因此,这个返回的request需要加判断语句,什么时候需要返回,不然的话,请求就无法发送到下载器。

raise一个 IgnoreRequest 异常:安装的下载中间件的 process_exception() 方法会被调用。如果没有任何一个方法处理该异常, 则request的errback(Request.errback)方法会被调用。如果没有代码处理抛出的异常, 则该异常被忽略且不记录(不同于其他异常那样)。

参数

request需要被处理的请求

spider (Spider 对象) 该request对应的spider对象实例。

 

process_response(request, response, spider)

当响应通过该中间件时,此方法被调用。

返回值

process_request() 必须返回以下之一: 返回一个 Response 对象、 返回一个 Request 对象或raise一个 IgnoreRequest 异常。

返回 Response (可以与传入的response相同,也可以是全新的对象,可以通过scrapy.http.Response生成), 该response会被在链中的其他中间件的 process_response() 方法处理。

返回 Request 对象:中间件链停止, 返回的request会被重新调度下载。处理类似于 process_request() 返回request所做的那样。所得到的响应也被丢弃,重新执行新的request。

抛出 IgnoreRequest 异常:则调用request的errback(Request.errback)。 如果没有代码处理抛出的异常,则该异常被忽略且不记录(不同于其他异常那样)。

参数

request (Request 对象) – response所对应的request

response (Response 对象) – 被处理的response

spider (Spider 对象) – response所对应的spide

process_exception(requestexceptionspider)

当下载处理器(download handler)或 process_request() (下载中间件)抛出异常(包括 IgnoreRequest 异常)时, Scrapy调用 process_exception() 。

返回值:

process_exception() 应该返回以下之一: 返回 None 、 一个 Response 对象、或者一个 Request 对象。

返回 None Scrapy将会继续处理该异常,接着调用已安装的其他中间件的process_exception() 方法,直到所有中间件都被调用完毕,则调用默认的异常处理。

返回Response 对象:则已安装的中间件链的 process_response() 方法被调用。Scrapy将不会调用任何其他中间件的 process_exception() 方法。

返回 Request 对象: 则返回的request将会被重新调用下载。这将停止中间件的process_exception() 方法执行,就如返回一个response的那样。

参数

request ( Request 对象) – 产生异常的request

exception (Exception 对象) – 抛出的异常

spider (Spider 对象) – request对应的spider

5.内置下载中间件

1.默认启用的下载中间件及禁止:

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_MIDDLEWARES 。在DOWNLOADER_MIDDLEWARES中对想要禁止的中间件的order赋值为None。

2. CookiesMiddleware

classscrapy.downloadermiddlewares.cookies.CookiesMiddleware

该中间件使得爬取需要cookie(例如使用session)的网站成为了可能。 其追踪了web server发送的cookie,并在之后的request中发送回去, 就如浏览器所做的那样。scrapy爬虫不用关心cookies,就是因为此中间件。

设置

以下设置可以用来配置cookie中间件:

COOKIES_ENABLED

COOKIES_DEBUG

1. 单spider多cookie session

Scrapy通过使用 cookiejar Request meta key来支持单spider追踪多cookie session。 默认情况下其使用一个cookiejar(是session),不过您可以传递一个标示符来使用多个。

eg:

for i, url in enumerate(urls):

yield scrapy.Request("http://www.example.com", meta={‘cookiejar‘: i},

callback=self.parse_page)

需要注意的是 cookiejar meta key不是”黏性的(sticky)”。 您需要在之后的request请求中接着传递。例如:

def parse_page(self, response):

# do some processing

return scrapy.Request("http://www.example.com/otherpage",

meta={‘cookiejar‘: response.meta[‘cookiejar‘]},

callback=self.parse_other_page)

2. COOKIES_ENABLED

默认: True

是否启用cookies middleware。如果关闭,cookies将不会发送给web server。

3. COOKIES_DEBUG

默认: False

如果启用,Scrapy将记录所有在request(Cookie 请求头)发送的cookies及response接收到的cookies(Set-Cookie 接收头)。

2011-04-06 14:35:10-0300 [scrapy] INFO: Spider opened

2011-04-06 14:35:10-0300 [scrapy] DEBUG: Sending cookies to: <GET http://www.diningcity.com/netherlands/index.html>

Cookie: clientlanguage_nl=en_EN

2011-04-06 14:35:14-0300 [scrapy] DEBUG: Received cookies from: <200 http://www.diningcity.com/netherlands/index.html>

Set-Cookie: JSESSIONID=B~FA4DC0C496C8762AE4F1A620EAB34F38; Path=/

Set-Cookie: ip_isocode=US

Set-Cookie: clientlanguage_nl=en_EN; Expires=Thu, 07-Apr-2011 21:21:34 GMT; Path=/

2011-04-06 14:49:50-0300 [scrapy] DEBUG: Crawled (200) <GET http://www.diningcity.com/netherlands/index.html> (referer: None)

[...]

3. DefaultHeadersMiddleware

该中间件设置 DEFAULT_REQUEST_HEADERS 指定的默认request header。

4. DownloadTimeoutMiddleware

该中间件设置 DOWNLOAD_TIMEOUT 指定的request下载超时时间.

5. HttpAuthMiddleware

该中间件完成某些使用 Basic access authentication (或者叫HTTP认证)的spider生成的请求的认证过程。

在spider中启用HTTP认证,请设置spider的 http_user 及 http_pass 属性。

eg:

from scrapy.spiders import CrawlSpider

class SomeIntranetSiteSpider(CrawlSpider):

http_user = ‘someuser‘

http_pass = ‘somepass‘

name = ‘intranet.example.com‘

# .. rest of the spider code omitted ...

6. HttpCacheMiddleware

该中间件为所有HTTP request及response提供了底层(low-level)缓存支持。 其由cache存储后端及cache策略组成。

https://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/downloader-middleware.html#scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware

7.HttpCompressionMiddleware

该中间件提供了对压缩(gzip, deflate)数据的支持。

设置

COMPRESSION_ENABLED

默认: True

Compression Middleware(压缩中间件)是否开启。

8. ChunkedTransferMiddleware

该中间件添加了对 chunked transfer encoding 的支持。

9. HttpProxyMiddleware

该中间件提供了对request设置HTTP代理的支持。您可以通过在 Request 对象中设置 proxy 元数据来开启代理。

使用request.meta[‘proxy’]来设置。

request.meta[‘proxy’]=’https//……..’

类似于Python标准库模块 urllib 及 urllib2 ,其使用了下列环境变量:

http_proxy

https_proxy

no_proxy

您也可以针对每个请求设置 proxy 元数据, 其形式类似于 http://some_proxy_server:port.

10. RedirectMiddleware

该中间件根据response的状态处理重定向的request。

通过该中间件的(被重定向的)request的url可以通过 Request.meta 的 redirect_urls 键找到。

RedirectMiddleware 可以通过下列设置进行配置(更多内容请参考设置文档):

REDIRECT_ENABLED

REDIRECT_MAX_TIMES

如果 Request.meta 包含 dont_redirect 键,则该request将会被此中间件忽略。

设置

REDIRECT_ENABLED

0.13 新版功能.

默认: True

是否启用Redirect中间件。

REDIRECT_MAX_TIMES

默认: 20

单个request被重定向的最大次数。

11. MetaRefreshMiddleware

该中间件根据meta-refresh html标签处理request重定向。

MetaRefreshMiddleware 可以通过以下设定进行配置 (更多内容请参考设置文档)。

设置

METAREFRESH_ENABLED

METAREFRESH_MAXDELAY

该中间件遵循 RedirectMiddleware 描述的 REDIRECT_MAX_TIMES 设定,dont_redirect 及 redirect_urlsmeta key。

METAREFRESH_ENABLED

默认: True

Meta Refresh中间件是否启用。

REDIRECT_MAX_METAREFRESH_DELAY

默认: 100

跟进重定向的最大 meta-refresh 延迟(单位:秒)。

12. RetryMiddleware

该中间件将重试可能由于临时的问题,例如连接超时或者HTTP 500错误导致失败的页面。

爬取进程会收集失败的页面并在最后,spider爬取完所有正常(不失败)的页面后重新调度。 一旦没有更多需要重试的失败页面,该中间件将会发送一个信号(retry_complete), 其他插件可以监听该信号。

RetryMiddleware 可以通过下列设定进行配置 (更多内容请参考设置文档):

RETRY_ENABLED

RETRY_TIMES

RETRY_HTTP_CODES

关于HTTP错误的考虑:

如果根据HTTP协议,您可能想要在设定 RETRY_HTTP_CODES 中移除400错误。 该错误被默认包括是由于这个代码经常被用来指示服务器过载(overload)了。而在这种情况下,我们想进行重试。

如果 Request.meta 包含 dont_retry 键, 该request将会被本中间件忽略。

设置

RETRY_ENABLED

默认: True

Retry Middleware是否启用。

RETRY_TIMES

默认: 2

包括第一次下载,最多的重试次数

RETRY_HTTP_CODES

默认: [500, 502, 503, 504, 400, 408]

重试的response 返回值(code)。其他错误(DNS查找问题、连接失败及其他)则一定会进行重试。

13.RobotsTxtMiddleware

该中间件过滤所有robots.txt eclusion standard中禁止的request。

确认该中间件及 ROBOTSTXT_OBEY 设置被启用以确保Scrapy尊重robots.txt。

警告

记住, 如果您在一个网站中使用了多个并发请求, Scrapy仍然可能下载一些被禁止的页面。这是由于这些页面是在robots.txt被下载前被请求的。 这是当前robots.txt中间件已知的限制,并将在未来进行修复。

14. DownloaderStats

保存所有通过的request、response及exception的中间件。

您必须启用 DOWNLOADER_STATS 来启用该中间件。

15. UserAgentMiddleware

用于覆盖spider的默认user agent的中间件。

要使得spider能覆盖默认的user agent,其 user_agent 属性必须被设置。

class RandomUserAgent(UserAgentMiddleware):

def process_request(self, request, spider):

#从列表中随机抽选出一个ua值

ua =
random.choice(user_agent_list)

#ua值进行当前拦截到请求的ua的写入操作

request.headers.setdefault(‘User-Agent‘,ua)

通过中间件设置ua池。

16.AjaxCrawlMiddleware

根据meta-fragment html标签查找 ‘AJAX可爬取’ 页面的中间件。查看https://developers.google.com/webmasters/ajax-crawling/docs/getting-started 来获得更多内容。

即使没有启用该中间件,Scrapy仍能查找类似于 ‘http://example.com/!#foo=bar‘ 这样的’AJAX可爬取’页面。
AjaxCrawlMiddleware是针对不具有 ‘!#‘ 的URL,通常发生在’index’或者’main’页面中。

设置

AJAXCRAWL_ENABLED

默认: False

AjaxCrawlMiddleware是否启用。您可能需要针对 通用爬虫 启用该中间件。

原文地址:https://www.cnblogs.com/ohahastudy/p/10204532.html

时间: 2024-11-09 17:50:13

scrapy中的选择器下载中间价downloadmiddlewares的相关文章

web爬虫,scrapy模块标签选择器下载图片,以及正则匹配标签

标签选择器对象 HtmlXPathSelector()创建标签选择器对象,参数接收response回调的html对象需要导入模块:from scrapy.selector import HtmlXPathSelector select()标签选择器方法,是HtmlXPathSelector里的一个方法,参数接收选择器规则,返回列表元素是一个标签对象 extract()获取到选择器过滤后的内容,返回列表元素是内容 选择器规则 //x 表示向下查找n层指定标签,如://div 表示查找所有div标签

在Scrapy中如何利用Xpath选择器从HTML中提取目标信息(两种方式)

前一阵子我们介绍了如何启动Scrapy项目以及关于Scrapy爬虫的一些小技巧介绍,没来得及上车的小伙伴可以戳这些文章: 手把手教你如何新建scrapy爬虫框架的第一个项目(上) 手把手教你如何新建scrapy爬虫框架的第一个项目(下) 关于Scrapy爬虫项目运行和调试的小技巧(上篇) 关于Scrapy爬虫项目运行和调试的小技巧(下篇) 今天我们将介绍在Scrapy中如何利用Xpath选择器从HTML中提取目标信息.在Scrapy中,其提供了两种数据提取的方式,一种是Xpath选择器,一种是C

scrapy 中如何自定义 pipeline 下载图片

这里以一个很简单的小爬虫为例,爬取 壹心理 网站的阅读页面第一页的所有文章及其对应的图片,文章页面如下: 创建项目 首先新建一个 scrapy 项目,安装好相关依赖(步骤可参考:scrapy 安装及新建爬虫项目并运行). 新建一个爬虫: scrapy genspider xinli001 'www.xinli001.com/info' 此时项目工程目录与新建的爬虫如下: 爬取信息并编写图片自动下载逻辑 本次主要是记录自定义 pipeline 来爬取图片,所以只是简单的选取一些信息来爬取,包括文章

scrapy中下载文件和图片

下载文件是一种很常见的需求,例如当你在使用爬虫爬取网站中的图片.视频.word.pdf.压缩包等的时候 scrapy中提供了FilesPipeline和ImagesPipeline,专门用来下载文件和图片: 我们其实可以把这两个item pipeline看成是特殊的下载器,用户使用的时候只需要通过item的一个特殊的字段就可以将要下载的文件或者图片的url传递给它们,它们会自动将文件或者图片下载到本地,并将下载的结果信息存入到item的另一个特殊的字段,方便用户在导出文件的时候查阅 FilesP

HTML5移动开发之路(34)——jQuery中的选择器

本文为 兄弟连IT教育 机构官方 HTML5培训 教程,主要介绍:HTML5移动开发之路(34)--jQuery中的选择器 一.jQuery是什么? jQuery是由美国人John Resig创建,至今吸引了来自世界各地的众多JavaScript高手加入其中. jQuery的创始人和技术领袖,目前在Mozilla担任JavaScript工具开发工程师.著有<Pro JavaScript Techniques>(即<精通JavaScript>)等经典JavaScript书籍. jQu

抓取scrapy中文文档 第一个Scrapy项目实现

使用Scrapy这个python的网络爬虫框架抓取Scrapy中文文档 开发第一步:新建项目scrapy startproject myfirst 目录结构: myfirst │ scrapy.cfg Scrapy项目配置文件 │ └─myfirst Scrapy项目代码存放目录 │ items.py 存储从抓取的网页中需要保存的数据,再其中指定要存储的域 │ pipelines.py 管道文件,用于存储从抓取的网页中解析出的其他页面的url,相当于任务队列 │ settings.py 爬虫配置

scrapy 中 settings.py 中字段的意思

# -*- coding: utf-8 -*- # Scrapy settings for fenbushi project## For simplicity, this file contains only settings considered important or# commonly used. You can find more settings consulting the documentation:## https://doc.scrapy.org/en/latest/topi

scrapy中selenium的应用

引子: 在通过scrapy框架进行某些网站数据爬取的时候,旺旺会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据,但是通过观察我们会发现,通过浏览器进行url请求发送则会加载出对应的动态加载出的数据.那么如果我们想要在scrapy也获取动态加载出的数据,则必须使用selenium穿件浏览器对象,然后通过该浏览器对象进行请求发送,获取动态加载的数据值. 1.案例分析: - 需求:爬取网易新闻的国内板块下的新闻数据 - 需求分析: 当点

scrapy中的selenium

引入 在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值.但是通过观察我们会发现,通过浏览器进行url请求发送则会加载出对应的动态加载出的数据.那么如果我们想要在scrapy也获取动态加载出的数据,则必须使用selenium创建浏览器对象,然后通过该浏览器对象进行请求发送,获取动态加载的数据值. 1.案例分析: - 需求:爬取网易新闻的国内板块下的新闻数据 - 需求分析:当点击