1. 程式人生 > >Scrapy中的Downloader Middleware基礎介紹

Scrapy中的Downloader Middleware基礎介紹

建立專案

scrapy startproject +專案名稱

cd + 專案名稱

scrapy genspider +爬蟲名+要爬取的域名

建立結果如下:

開啟spider檔案做詳細介紹:

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


class HttpbinSpider(scrapy.Spider):
    # 爬蟲名稱
    name = 'httpbin'
    # 允許爬取的域名
    allowed_domains = ['httpbin.org']
    # 起始url列表,預設從此列表抓取
    start_urls = ['http://httpbin.org/']

    def parse(self, response):
        pass

下載中介軟體Downloader Middleware

下載中介軟體是處於Scrapy的Request和Response之間的處理模組,在整個架構中起作用的位置是兩個:

1. 在Scheduler排程處佇列的Request傳送給Downloder下載之前。

                  可以在Request執行下載之前對其進行修改。

2.在下載後生成的Response傳送給Spider之前。

                 可以再生成的Response被Spider解析之前對其進行修改。

可以用來修改User-Agent、處理重定向、設定代理、失敗重試、設定cookies都需要藉助它來實現。

下面介紹一下Downloader Middleware的三個方法:

process_request(self, request, spider):

    請求被排程給Downloader之前,此方法就會呼叫,對Request進行處理。

    兩個引數分別為,Request物件,對應的Spider。

process_response(self, request, response, spider):

    Downloader執行Request下載之後,會得到對應的Response,引擎會將Response傳送給Spider進行解析,在傳送之前,都可以用此方法對Response進行處理。

    引數有三個:

           request:Response對應的Request

           response:被處理的Response

           spider: 對應的Spider

process_exception(self, request, exception, spider):

     丟擲異常時被呼叫。

     引數有三個:

           request:產生異常的Request.

           exception:丟擲的異常.

           spider:產生的異常對應的Spider.

 

設定User-Agent

1、在setting.py裡面加一行定義即可:

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'

2、設定隨機的需要藉助Downloader Middleware

class RandomUserAgentMiddleware():
    def __init__(self):
        self.user_agent = [
            'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
            'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)',
            'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)',
        ]
        
    def process_request(self,request,spider):
        request.headers["User-Agent"] = random.choice(self.user_agent)

要使之生效,需要在settings.py 檔案中呼叫這個Downloader Middleware

DOWNLOADER_MIDDLEWARES = {
    'scrapydownloadertest.middlewares.RandomUserAgentMiddleware': 543,
}

重新執行之後可以看到已經改變:

這樣,利用process_request()方法成功設定了隨機的User-Agent。

 

process_response()


  Downloader Middleware在執行下載之後會得到Response,隨後將Response傳送給Spider處理。

  可以修對Response進行處理。

在RandomUserAgentMiddleware新增如下程式碼:

class RandomUserAgentMiddleware():
    def __init__(self):
        self.user_agent = [
            'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
            'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)',
            'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)',
        ]

    def process_request(self,request,spider):
        request.headers["User-Agent"] = random.choice(self.user_agent)
        
    def process_response(self,request,response,spider):
        #修改狀態碼
        response.status = 201
        return response

process_response返回response給spider:

self.logger.debug('Status Code' + str(response.status))

在spider中輸出response.status即可看到結果,重新執行之後,觀察到的結果如下: