1. 程式人生 > >scrapy框架中介軟體,請求頭,IP代理

scrapy框架中介軟體,請求頭,IP代理

什麼下載器中介軟體?

    引擎與下載器之間的一個元件,一個爬蟲可以有很多下載器中介軟體

為什麼要使用下載器中介軟體,功能

    全域性修改Scrapy request和response

scrapy 下載器中介軟體:

編輯檔案middleware.py檔案

編寫處理方法

    處理請求        process_request(self, request, spider)
    新增:使用者頭   新增IP代理等功能

配置settings

    在settings檔案中配置DOWNLOADER_MIDDLEWARES引數

為什麼模擬使用者頭、IP代理?

    一句話:為了反反爬

(一)隨機請求自己構建請求ua池

from Douban.settings import USER_AGENT_LIST
import random

class RandomUserAgent(object):
    # 定義一箇中間鍵類
    # 使用者代理
    def process_request(self, request, spider):
        # 檢驗一下請求頭
        # print(request.headers['User-Agent'])
        # 獲取一個請求頭
        ua = random.choice(USER_AGENT_LIST)
        # 設定請求頭代理
request.headers['User-Agent'] = ua

setting配置

DOWNLOADER_MIDDLEWARES = {
   # 'Douban.middlewares.MyCustomDownloaderMiddleware': 543,
   #註冊請求頭使用者代理
   'Douban.middlewares.RandomUserAgent': 543,
}
#自定義請求頭,使用者代理(自定)
USER_AGENT_LIST =[
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; HCI0449; .NET CLR 1.0.3705) "
, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; i-NavFourF; .NET CLR 1.1.4322) ", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Maxthon; " ]

解釋

請求頭(使用者)代理 隨機)
定一箇中間鍵類,重寫process_request(self,request, spider)方法,
對request的處理進行相應的配置,並把配置好以後,
並把響應的類註冊到setting檔案中。

引數[request,spider],並檢驗請求頭。Print(request.headers[‘User-Agent’])。
需要在setting中DOWNLOADER_MIDDLEWARES(自定義中間鍵)配置

`檢視使用者是用哪個代理請求頭,在爬蟲中parse_item方法下這裡`
print(response.request.headers[‘User-Agent’]

(二)隨機切換User-Agent的庫

安裝:pip install fake-useragent

class RandomUserAgentMiddleware(object):

    def __init__(self,crawler):
        super(RandomUserAgentMiddleware, self).__init__()
        self.ua = UserAgent()
        self.ua_type = crawler.settings.get('RANDOM_UA_TYPE','random')

    @classmethod
    def from_crawler(cls,crawler):
        return cls(crawler)

    def process_request(self,request,spider):

        def get_ua():
            return getattr(self.ua,self.ua_type)
        request.headers.setdefault('User-Agent',get_ua()

setting配置

DOWNLOADER_MIDDLEWARES = {
   'liebiao.middlewares.MyCustomDownloaderMiddleware': 543,
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
}

RANDOM_UA_TYPE= 'random'
  1. 通過crawler.settings.get來獲取配置檔案中的配置,如果沒有配置則預設是random,如果配置了ie或者chrome等就會獲取到相應的配置
  2. 在process_request方法中我們嵌套了一個get_ua方法,get_ua其實就是為了執行ua.ua_type
  3. 但是這裡無法使用self.ua.self.us_type,所以利用了getattr方法來直接獲取,最後通過request.heasers.setdefault來設定User-Agent

(三)隨機切換IP代理

from scrapy import signals
import random
import base64
from Douban.settings import PROXY_LIST

class RandomProxy(object):
    def process_request(self, request, spider):
        # 隨機取出一個代理ip
        proxy = random.choice(PROXY_LIST)

        # 判斷是否為人民幣玩家
        if 'user_passwd' in proxy:
            #把賬號密碼轉換為b64編碼格式(字串先變成bytes型別)必須字串轉為bytes
            b64_data = base64.b64encode(proxy['user_passwd'].encode())
            # 設定賬號密碼認證                     認證方式   編碼之後的賬號密碼
            request.headers['Proxy-Authorization'] = 'Basic ' + b64_data.decode()
            # 設定代理

        else:
            # 免費代理不用認證
            request.meta['proxy'] = proxy['ip_port']

settings中設定

DOWNLOADER_MIDDLEWARES = {
   # 'Douban.middlewares.MyCustomDownloaderMiddleware': 543,
   #註冊ip代理
    # 'Douban.middlewares.RandomProxy': 544,
}
ip代理(自定)
 PROXY_LIST = [
     {'ip_port': '121.232.148.85:9000'},
     {'ip_port': '115.223.235.157:9000'},
        #收費的ip, 埠    使用者名稱   密碼
     {"ip_port": "ip:port", "user_passwd": "user:passwd"}
]
在setting中定義代理,
並將其匯入到middlewares中
隨機獲取一個隨機使用者代理random.choice(),
設定一個使用者頭代理request.headers[‘User-Agent’] = 隨機獲取的代理,