日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

六、Scrapy中Download Middleware的用法

發(fā)布時(shí)間:2024/4/17 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 六、Scrapy中Download Middleware的用法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文轉(zhuǎn)載自:

https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/downloader-middleware.html

https://doc.scrapy.org/en/latest/topics/downloader-middleware.html

?

下載器中間件是介于Scrapy的request/response處理的鉤子框架。 是用于全局修改Scrapy request和response的一個(gè)輕量、底層的系統(tǒng)。

1、激活下載器中間件

要激活下載器中間件組件,將其加入到 DOWNLOADER_MIDDLEWARES 設(shè)置中。 該設(shè)置是一個(gè)字典(dict),鍵為中間件類的路徑,值為其中間件的順序(order)。
這里是一個(gè)例子:
DOWNLOADER_MIDDLEWARES = {
??? 'myproject.middlewares.CustomDownloaderMiddleware': 543,
}

DOWNLOADER_MIDDLEWARES 設(shè)置會(huì)與Scrapy定義的 DOWNLOADER_MIDDLEWARES_BASE 設(shè)置合并(但不是覆蓋),
而后根據(jù)順序(order)進(jìn)行排序,最后得到啟用中間件的有序列表: 第一個(gè)中間件是最靠近引擎的,最后一個(gè)中間件是最靠近下載器的

如果您想禁止內(nèi)置的(在 DOWNLOADER_MIDDLEWARES_BASE 中設(shè)置并默認(rèn)啟用的)中間件, 您必須在項(xiàng)目的 DOWNLOADER_MIDDLEWARES 設(shè)置中定義該中間件,并將其值賦為 None 。 例如,如果您想要關(guān)閉user-agent中間件:
DOWNLOADER_MIDDLEWARES = {
??? 'myproject.middlewares.CustomDownloaderMiddleware': 543,
??? 'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,
}

?

>scrapy settings --get=DOWNLOADER_MIDDLEWARES_BASE
{
??? "scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware": 100,
??? "scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware": 300,
??? "scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware": 350,
??? "scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware": 400,
??? "scrapy.downloadermiddlewares.useragent.UserAgentMiddleware": 500,
??? "scrapy.downloadermiddlewares.retry.RetryMiddleware": 550,
??? "scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware": 560,
??? "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.stats.DownloaderStats": 850,
??? "scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware": 900
}


2、編寫(xiě)您自己的下載器中間件
編寫(xiě)下載器中間件十分簡(jiǎn)單。每個(gè)中間件組件是一個(gè)定義了以下一個(gè)或多個(gè)方法的Python類:
class scrapy.contrib.downloadermiddleware.DownloaderMiddleware

process_request(request, spider)
??? 當(dāng)每個(gè)request通過(guò)下載中間件時(shí),該方法被調(diào)用。
??? process_request() 必須返回其中之一: 返回 None 、返回一個(gè) Response 對(duì)象、返回一個(gè) Request 對(duì)象或raise IgnoreRequest 。
??? 如果其返回 None ,Scrapy將繼續(xù)處理該request,執(zhí)行其他的中間件的相應(yīng)方法,直到合適的下載器處理函數(shù)(download handler)被調(diào)用, 該request被執(zhí)行(其response被下載)。
??? 如果其返回 Response 對(duì)象,Scrapy將不會(huì)調(diào)用 任何 其他的 process_request() 或 process_exception() 方法,或相應(yīng)地下載函數(shù); 其將返回該response。 已安裝的中間件的 process_response() 方法則會(huì)在每個(gè)response返回時(shí)被調(diào)用。
??? 如果其返回 Request 對(duì)象,Scrapy則停止調(diào)用 process_request方法并重新調(diào)度返回的request。當(dāng)新返回的request被執(zhí)行后, 相應(yīng)地中間件鏈將會(huì)根據(jù)下載的response被調(diào)用。
??? 如果其raise一個(gè) IgnoreRequest 異常,則安裝的下載中間件的 process_exception() 方法會(huì)被調(diào)用。如果沒(méi)有任何一個(gè)方法處理該異常, 則request的errback(Request.errback)方法會(huì)被調(diào)用。如果沒(méi)有代碼處理拋出的異常, 則該異常被忽略且不記錄(不同于其他異常那樣)。
??? 參數(shù):?? ?
??????? request (Request 對(duì)象) – 處理的request
??????? spider (Spider 對(duì)象) – 該request對(duì)應(yīng)的spider

process_response(request, response, spider)
??? process_request() 必須返回以下之一: 返回一個(gè) Response 對(duì)象、 返回一個(gè) Request 對(duì)象或raise一個(gè) IgnoreRequest 異常。
??? 如果其返回一個(gè) Response (可以與傳入的response相同,也可以是全新的對(duì)象), 該response會(huì)被在鏈中的其他中間件的 process_response() 方法處理。
??? 如果其返回一個(gè) Request 對(duì)象,則中間件鏈停止, 返回的request會(huì)被重新調(diào)度下載。處理類似于 process_request() 返回request所做的那樣。
??? 如果其拋出一個(gè) IgnoreRequest 異常,則調(diào)用request的errback(Request.errback)。 如果沒(méi)有代碼處理拋出的異常,則該異常被忽略且不記錄(不同于其他異常那樣)。
??? 參數(shù):?? ?
??????? request (Request 對(duì)象) – response所對(duì)應(yīng)的request
??????? response (Response 對(duì)象) – 被處理的response
??????? spider (Spider 對(duì)象) – response所對(duì)應(yīng)的spider

process_exception(request, exception, spider)
??? 當(dāng)下載處理器(download handler)或 process_request() (下載中間件)拋出異常(包括 IgnoreRequest 異常)時(shí), Scrapy調(diào)用 process_exception() 。
??? process_exception() 應(yīng)該返回以下之一: 返回 None 、 一個(gè) Response 對(duì)象、或者一個(gè) Request 對(duì)象。
??? 如果其返回 None ,Scrapy將會(huì)繼續(xù)處理該異常,接著調(diào)用已安裝的其他中間件的 process_exception() 方法,直到所有中間件都被調(diào)用完畢,則調(diào)用默認(rèn)的異常處理。
??? 如果其返回一個(gè) Response 對(duì)象,則已安裝的中間件鏈的 process_response() 方法被調(diào)用。Scrapy將不會(huì)調(diào)用任何其他中間件的 process_exception() 方法。
??? 如果其返回一個(gè) Request 對(duì)象, 則返回的request將會(huì)被重新調(diào)用下載。這將停止中間件的 process_exception() 方法執(zhí)行,就如返回一個(gè)response的那樣。
??? 參數(shù):?? ?
??????? request (是 Request 對(duì)象) – 產(chǎn)生異常的request
??????? exception (Exception 對(duì)象) – 拋出的異常
??????? spider (Spider 對(duì)象) – request對(duì)應(yīng)的spider

3、內(nèi)置下載中間件參考手冊(cè)

1.CookiesMiddleware
class scrapy.contrib.downloadermiddleware.cookies.CookiesMiddleware

該中間件使得爬取需要cookie(例如使用session)的網(wǎng)站成為了可能。
其追蹤了web server發(fā)送的cookie,并在之后的request中發(fā)送回去, 就如瀏覽器所做的那樣。
以下設(shè)置可以用來(lái)配置cookie中間件:
??? COOKIES_ENABLED
??? COOKIES_DEBUG
?? ?
2.單spider多cookie session
Scrapy通過(guò)使用 cookiejar Request meta key來(lái)支持單spider追蹤多cookie session。
默認(rèn)情況下其使用一個(gè)cookie jar(session),不過(guò)您可以傳遞一個(gè)標(biāo)示符來(lái)使用多個(gè)。

例如:
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請(qǐng)求中接著傳遞。例如:
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)

3.COOKIES_ENABLED
默認(rèn): True
是否啟用cookies middleware。如果關(guān)閉,cookies將不會(huì)發(fā)送給web server。

4.COOKIES_DEBUG
默認(rèn): False
如果啟用,Scrapy將記錄所有在request(Cookie 請(qǐng)求頭)發(fā)送的cookies及response接收到的cookies(Set-Cookie 接收頭)。

5.DefaultHeadersMiddleware
class scrapy.contrib.downloadermiddleware.defaultheaders.DefaultHeadersMiddleware
該中間件設(shè)置 DEFAULT_REQUEST_HEADERS 指定的默認(rèn)request header。

6.DownloadTimeoutMiddleware
class scrapy.contrib.downloadermiddleware.downloadtimeout.DownloadTimeoutMiddleware
??? 該中間件設(shè)置 DOWNLOAD_TIMEOUT 或 spider的 download_timeout 屬性指定的request下載超時(shí)時(shí)間.
注解:
您也可以使用 download_timeout Request.meta key 來(lái)對(duì)每個(gè)請(qǐng)求設(shè)置下載超時(shí)時(shí)間. 這種方式在 DownloadTimeoutMiddleware 被關(guān)閉時(shí)仍然有效.

7.HttpAuthMiddleware
class scrapy.contrib.downloadermiddleware.httpauth.HttpAuthMiddleware

??? 該中間件完成某些使用 Basic access authentication (或者叫HTTP認(rèn)證)的spider生成的請(qǐng)求的認(rèn)證過(guò)程。
??? 在spider中啟用HTTP認(rèn)證,請(qǐng)?jiān)O(shè)置spider的 http_user 及 http_pass 屬性。
??? 樣例:

??? from scrapy.contrib.spiders import CrawlSpider

??? class SomeIntranetSiteSpider(CrawlSpider):

??????? http_user = 'someuser'
??????? http_pass = 'somepass'
??????? name = 'intranet.example.com'

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


轉(zhuǎn)載于:https://www.cnblogs.com/sanduzxcvbnm/p/10299895.html

總結(jié)

以上是生活随笔為你收集整理的六、Scrapy中Download Middleware的用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。