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即可看到結果,重新執行之後,觀察到的結果如下: