中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Scrapy框架設置下載中間件的方法

發布時間:2020-08-04 09:32:24 來源:億速云 閱讀:159 作者:清晨 欄目:編程語言

小編給大家分享一下Scrapy框架設置下載中間件的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家學習,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去學習方法吧!

設置下載中間件(Downloader Middlewares)

下載中間件是處于引擎(crawler.engine)和下載器(crawler.engine.download())之間的一層組件,可以有多個下載中間件被加載運行。

1.當引擎傳遞請求給下載器的過程中,下載中間件可以對請求進行處理 (例如增加http header信息,增加proxy信息等);

2.在下載器完成http請求,傳遞響應給引擎的過程中, 下載中間件可以對響應進行處理(例如進行gzip的解壓等)

要激活下載器中間件組件,將其加入到 DOWNLOADER_MIDDLEWARES 設置中。 該設置是一個字典(dict),鍵為中間件類的路徑,值為其中間件的順序(order)。

DOWNLOADER_MIDDLEWARES = {
    'mySpider.middlewares.MyDownloaderMiddleware': 543,
}

編寫下載器中間件十分簡單。每個中間件組件是一個定義了以下一個或多個方法的Python類:

class scrapy.contrib.downloadermiddleware.DownloaderMiddleware

process_request(self, request, spider)

1.當每個request通過下載中間件時,該方法被調用。

2.process_request() 必須返回以下其中之一:一個 None 、一個 Response 對象、一個 Request 對象或 raise IgnoreRequest:

(1)如果其返回 None ,Scrapy將繼續處理該request,執行其他的中間件的相應方法,直到合適的下載器處理函數(download handler)被調用, 該request被執行(其response被下載)。

(2)如果其返回 Response 對象,Scrapy將不會調用 任何 其他的 process_request() 或 process_exception() 方法,或相應地下載函數; 其將返回該response。 已安裝的中間件的 process_response() 方法則會在每個response返回時被調用。

(3)如果其返回 Request 對象,Scrapy則停止調用 process_request方法并重新調度返回的request。當新返回的request被執行后, 相應地中間件鏈將會根據下載的response被調用。

(4)如果其raise一個 IgnoreRequest 異常,則安裝的下載中間件的 process_exception() 方法會被調用。如果沒有任何一個方法處理該異常, 則request的errback(Request.errback)方法會被調用。如果沒有代碼處理拋出的異常, 則該異常被忽略且不記錄(不同于其他異常那樣)。

3.參數:

(1)request (Request 對象) – 處理的request

(2)spider (Spider 對象) – 該request對應的spider

process_response(self, request, response, spider)

1.當下載器完成http請求,傳遞響應給引擎的時候調用。

2.process_request() 必須返回以下其中之一: 返回一個 Response 對象、 返回一個 Request 對象或raise一個 IgnoreRequest 異常。

(1)如果其返回一個 Response (可以與傳入的response相同,也可以是全新的對象), 該response會被在鏈中的其他中間件的 process_response() 方法處理。

(2)如果其返回一個 Request 對象,則中間件鏈停止, 返回的request會被重新調度下載。處理類似于 process_request() 返回request所做的那樣。

(3)如果其拋出一個 IgnoreRequest 異常,則調用request的errback(Request.errback)。 如果沒有代碼處理拋出的異常,則該異常被忽略且不記錄(不同于其他異常那樣)。

3.參數:

(1)request (Request 對象) – response所對應的request

(2)response (Response 對象) – 被處理的response

(3)spider (Spider 對象) – response所對應的spider

實例

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import random
import base64
from settings import USER_AGENTS
from settings import PROXIES
# 隨機的User-Agent
class RandomUserAgent(object):
    def process_request(self, request, spider):
        useragent = random.choice(USER_AGENTS)
        request.headers.setdefault("User-Agent", useragent)
class RandomProxy(object):
    def process_request(self, request, spider):
        proxy = random.choice(PROXIES)
        if proxy['user_passwd'] is None:
            # 沒有代理賬戶驗證的代理使用方式
            request.meta['proxy'] = "http://" + proxy['ip_port']
        else:
            # 對賬戶密碼進行base64編碼轉換
            base64_userpasswd = base64.b64encode(proxy['user_passwd'])
            # 對應到代理服務器的信令格式里
            request.headers['Proxy-Authorization'] = 'Basic ' + base64_userpasswd
            request.meta['proxy'] = "http://" + proxy['ip_port']

為什么HTTP代理要使用base64編碼:

HTTP代理的原理很簡單,就是通過HTTP協議與代理服務器建立連接,協議信令中包含要連接到的遠程主機的IP和端口號,如果有需要身份驗證的話還需要加上授權信息,服務器收到信令后首先進行身份驗證,通過后便與遠程主機建立連接,連接成功之后會返回給客戶端200,表示驗證通過,就這么簡單,下面是具體的信令格式:

修改settings.py配置USER_AGENTS和PROXIES

添加USER_AGENTS:

 USER_AGENTS = [
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET 
    CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
    "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
    ]

添加代理IP設置PROXIES:

PROXIES = [
    {'ip_port': 'ip:port1', 'user_passwd': 'user1:pass1'},
    {'ip_port': 'ip2:port2', 'user_passwd': 'user2:pass2'},
    {'ip_port': 'ip3:port3', 'user_passwd': 'user3:pass3'},
]

除非特殊需要,禁用cookies,防止某些網站根據Cookie來封鎖爬蟲。

COOKIES_ENABLED = False

設置下載延遲

DOWNLOAD_DELAY = 3

最后添加自己寫的下載中間件類

DOWNLOADER_MIDDLEWARES = {
    'mySpider.middlewares.MyDownloaderMiddleware': 543,
}

以上是Scrapy框架設置下載中間件的方法的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

菏泽市| 宜黄县| 左权县| 抚州市| 阜城县| 盱眙县| 高平市| 噶尔县| 保靖县| 海城市| 阿坝县| 呼图壁县| 洪泽县| 军事| 乐山市| 锦屏县| 清水县| 治多县| 密山市| 浦县| 绥宁县| 合山市| 长海县| 大宁县| 虎林市| 鹿邑县| 凌源市| 罗江县| 怀集县| 肃宁县| 海丰县| 商丘市| 湾仔区| 中牟县| 大方县| 喀喇沁旗| 精河县| 乐清市| 若羌县| 綦江县| 高阳县|