久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

小白學 Python 爬蟲(36):爬蟲框架 Scrapy 入門基礎(四) Downloader Middleware

 易禪浮屠 2022-03-04

人生苦短,我用 Python

前文傳送門:

小白學 Python 爬蟲(1):開篇

小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝

小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門

小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門

小白學 Python 爬蟲(5):前置準備(四)數(shù)據(jù)庫基礎

小白學 Python 爬蟲(6):前置準備(五)爬蟲框架的安裝

小白學 Python 爬蟲(7):HTTP 基礎

小白學 Python 爬蟲(8):網(wǎng)頁基礎

小白學 Python 爬蟲(9):爬蟲基礎

小白學 Python 爬蟲(10):Session 和 Cookies

小白學 Python 爬蟲(11):urllib 基礎使用(一)

小白學 Python 爬蟲(12):urllib 基礎使用(二)

小白學 Python 爬蟲(13):urllib 基礎使用(三)

小白學 Python 爬蟲(14):urllib 基礎使用(四)

小白學 Python 爬蟲(15):urllib 基礎使用(五)

小白學 Python 爬蟲(16):urllib 實戰(zhàn)之爬取妹子圖

小白學 Python 爬蟲(17):Requests 基礎使用

小白學 Python 爬蟲(18):Requests 進階操作

小白學 Python 爬蟲(19):Xpath 基操

小白學 Python 爬蟲(20):Xpath 進階

小白學 Python 爬蟲(21):解析庫 Beautiful Soup(上)

小白學 Python 爬蟲(22):解析庫 Beautiful Soup(下)

小白學 Python 爬蟲(23):解析庫 pyquery 入門

小白學 Python 爬蟲(24):2019 豆瓣電影排行

小白學 Python 爬蟲(25):爬取股票信息

小白學 Python 爬蟲(26):為啥買不起上海二手房你都買不起

小白學 Python 爬蟲(27):自動化測試框架 Selenium 從入門到放棄(上)

小白學 Python 爬蟲(28):自動化測試框架 Selenium 從入門到放棄(下)

小白學 Python 爬蟲(29):Selenium 獲取某大型電商網(wǎng)站商品信息

小白學 Python 爬蟲(30):代理基礎

小白學 Python 爬蟲(31):自己構建一個簡單的代理池

小白學 Python 爬蟲(32):異步請求庫 AIOHTTP 基礎入門

小白學 Python 爬蟲(33):爬蟲框架 Scrapy 入門基礎(一)

小白學 Python 爬蟲(34):爬蟲框架 Scrapy 入門基礎(二)

小白學 Python 爬蟲(35):爬蟲框架 Scrapy 入門基礎(三) Selector 選擇器

引言

Downloader Middleware 直譯過來是下載器中間件,本文后續(xù)就叫它下載中間件了,。

下載器中間件主要用于 Scrapy 的 Request 和 Response 處理。

Downloader Middleware 的功能非常的強大,,可以修改 UA 頭,、處理重定向、設置代理,、設置超時時間,、失敗重試、設置 Cookies 等功能,。

內(nèi)置下載器中間件

Scrapy 已經(jīng)為我們提供相當多的內(nèi)置的下載器中間件,,用于各種功能,列表如下:

{
    '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,
}

這些列表定義在 DOWNLOADER_MIDDLEWARES_BASE 變量中,。

這些列表的數(shù)據(jù)結(jié)構是一個字典格式,,后面的值代表了優(yōu)先級,數(shù)字越小代表了越靠近 Scrapy 引擎,,數(shù)字越大越靠近下載器,,數(shù)字小的會被優(yōu)先調(diào)用。

自定義下載器中間件

如果要在項目自定義一個下載器中間件,,需要我們自己設置 DOWNLOADER_MIDDLEWARES 這個變量,,這個變量位于 settings.py ,默認是注釋狀態(tài),,當我們需要的時候直接打開這個注釋就可以了,,這里不僅可以自定義我們所需要的下載器中間件,還可以禁用 DOWNLOADER_MIDDLEWARES_BASE 中定義的下載器中間件,。

每個下載器中間件都是一個Python類,,該類定義了以下定義的一個或多個方法。

核心方法共有 4 個,,如下:

  • process_request(request, spider)
  • process_response(request, response, spider)
  • process_exception(request, exception, spider)
  • from_crawler(cls, crawler)

而我們至少只需要實現(xiàn)其中的一個方法就可以定義一個下載器中間件,。

process_request(request, spider)

參數(shù):

  • request(Request對象)–正在處理的請求
  • spider(Spider對象)–此請求所針對的蜘蛛

對于通過下載中間件的每個請求,都會調(diào)用此方法,。

process_request() 應該是:return None,,返回一個 Response 對象,,返回一個Request 對象或引發(fā) IgnoreRequest 異常。

如果返回 None ,,則 Scrapy 將繼續(xù)處理此請求,,執(zhí)行所有其他中間件,直到最終將適當?shù)南螺d程序處理程序稱為執(zhí)行的請求(并下載了其響應),。

如果它返回一個 Response 對象,, Scrapy 不會打擾調(diào)用任何其他 process_request() 或 process_exception() 方法,或相應的下載功能; 它將返回該響應,。 process_response() 總是在每個響應上調(diào)用已安裝中間件的方法,。

如果返回一個 Request 對象, Scrapy 將停止調(diào)用 process_request 方法并重新計劃返回的請求,。一旦執(zhí)行了新返回的請求,,就會在下載的響應上調(diào)用適當?shù)闹虚g件鏈。

如果引發(fā) IgnoreRequest 異常,,則所有的下載器中間件的方法 process_exception() 會依次執(zhí)行,,如果沒有一個方法處理該異常,那么 Request 的 errback() 方法就會回調(diào),,如果該異常還沒處理,,那么就會忽略。

process_response(request, response, spider)

參數(shù):

  • request (是一個 Request 對象)–發(fā)起響應的請求
  • response (response 對象)–正在處理的響應
  • spider (spider 對象)–此響應預期用于的蜘蛛

process_response() 應該:返回響應對象,,返回請求對象或引發(fā) IgnoreRequest 異常,。

如果它返回一個 Response (它可以是相同的給定響應,也可以是全新的響應),,那么該響應將繼續(xù)使用鏈中下一個中間件的 process_response() 進行處理,。

如果它返回一個 Request 對象,則中間件鏈將暫停,,并將返回的請求重新安排為將來下載,。 這與從 process_request() 返回請求的行為相同。

如果引發(fā) IgnoreRequest 異常,,則調(diào)用請求的 errback 函數(shù)(Request.errback),。 如果沒有代碼處理引發(fā)的異常,則將其忽略并且不記錄(與其他異常不同),。

process_exception(request, exception, spider)

參數(shù):

  • request (是一個Request對象)–生成異常的請求
  • exception (Exception對象)–引發(fā)的異常
  • spider (spider對象)–此請求所針對的蜘蛛

當下載處理程序或 process_request() (從下載程序中間件中)引發(fā)異常(包括 IgnoreRequest 異常)時,, Scrapy 會調(diào)用 process_exception() 。

process_exception() 應該返回:無,,響應對象或請求對象,。

如果返回 None ,則 Scrapy 將繼續(xù)處理此異常,,執(zhí)行已安裝中間件的任何其他 process_exception() 方法,,直到?jīng)]有中間件為止,,并且默認異常處理開始。

如果返回 Response 對象,,則會啟動已安裝中間件的 process_response() 方法鏈,,并且 Scrapy 不會費心調(diào)用中間件的任何其他 process_exception() 方法。

如果它返回一個 Request 對象,,則將返回的請求重新安排為將來下載,。 這將停止執(zhí)行中間件的 process_exception() 方法,,就像返回響應一樣,。

from_crawler(cls, crawler)

參數(shù):

  • crawler(搜尋器對象)–使用此中間件的搜尋器

如果存在,則調(diào)用該類方法以從 Crawler 創(chuàng)建中間件實例,。 它必須返回中間件的新實例,。 搜尋器對象提供對所有 Scrapy 核心組件(如設置和信號)的訪問; 它是中間件訪問它們并將其功能連接到 Scrapy 中的一種方式,。

示例

首先,,我們還是在前面的 Scrapy 的項目上新建一個 Spider ,具體代碼如下:

# -*- coding: utf-8 -*-
import scrapy

class HttpbinSpider(scrapy.Spider):
    name = 'httpbin'
    allowed_domains = ['']
    start_urls = ['https:///get']

    def parse(self, response):
        self.logger.debug(response.text)

使用如下命令運行一下:

scrapy crawl httpbin

結(jié)果部分截取如下:

{
  "args": {},
  "headers": {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Encoding": "gzip,deflate,br",
    "Accept-Language": "en",
    "Host": "",
    "User-Agent": "Scrapy/1.8.0 (+https://)"
  },
  "origin": "183.195.68.215, 183.195.68.215",
  "url": "https:///get"
}

可以看到,,這里的 UA 頭是 Scrapy/1.8.0 (+https://) ,,這個其實是由 Scrapy 內(nèi)置的 UserAgentMiddleware 設置的。

這里我們通過修改一下 UA 頭,,當然修改 UA 頭可以通過 settings 中的 USER_AGENT 進行設置,,這里我們要演示下載器中間件嘛,所以就使用下載器中間件設置一下,。

首先我們在 middlewares.py 中新增一個 UaDownLoaderMiddleware ,,示例代碼如下:

class UaDownLoaderMiddleware(object):
    
    def process_request(self, request, spider):

        request.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'

新增完成后,還需要在配置文件 settings 中開啟這個下載器中間件,,找到 DOWNLOADER_MIDDLEWARES ,,將注釋去掉,修改為:

DOWNLOADER_MIDDLEWARES = {
   'first_scrapy.middlewares.UaDownLoaderMiddleware': 543,
}

到這里,,我們的修改就完成了,,可以重新運行這只爬蟲:

scrapy crawl httpbin

結(jié)果部分截取如下:

{
  "args": {},
  "headers": {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Encoding": "gzip,deflate,br",
    "Accept-Language": "en",
    "Host": "",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
  },
  "origin": "183.195.68.215, 183.195.68.215",
  "url": "https:///get"
}

可以看到,這里響應的 UA 已經(jīng)變成了我們剛才設置的 UA 頭,,證明我們的修改是成功的,。

本篇就先到這里了,希望各位同學可以自己動手試一下,。

示例代碼

本系列的所有代碼小編都會放在代碼管理倉庫 Github 和 Gitee 上,,方便大家取用。

示例代碼-Github

示例代碼-Gitee

參考

https://docs./en/latest/topics/settings.html#std:setting-DOWNLOADER_MIDDLEWARES_BASE

https://docs./en/latest/topics/downloader-middleware.html

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多