經過scrapy官網最新的架構圖來理解:html
這個圖較以前的圖順序更加清晰,從圖中咱們能夠看出,在spiders和ENGINE說起ENGINE和DOWNLOADER之間均可以設置中間件,二者是雙向的,而且是能夠設置多層.git
關於Downloader Middleware我在http://www.cnblogs.com/zhaof/p/7198407.html 這篇博客中已經寫了詳細的使用介紹。github
這裏要作的是經過本身在Downlaoder Middleware中定義一個類來實現隨機更換User-Agent,可是咱們須要知道的是scrapy其實自己提供了一個user-agent這個咱們在源碼中能夠看到以下圖:chrome
from scrapy import signals class UserAgentMiddleware(object): """This middleware allows spiders to override the user_agent""" def __init__(self, user_agent='Scrapy'): self.user_agent = user_agent @classmethod def from_crawler(cls, crawler): o = cls(crawler.settings['USER_AGENT']) crawler.signals.connect(o.spider_opened, signal=signals.spider_opened) return o def spider_opened(self, spider): self.user_agent = getattr(spider, 'user_agent', self.user_agent) def process_request(self, request, spider): if self.user_agent: request.headers.setdefault(b'User-Agent', self.user_agent)
從源代碼中能夠知道,默認scrapy的user_agent=‘Scrapy’,而且這裏在這個類裏有一個類方法from_crawler會從settings裏獲取USER_AGENT這個配置,若是settings配置文件中沒有配置,則會採用默認的Scrapy,process_request方法會在請求頭中設置User-Agent.架構
github地址爲:https://github.com/hellysmile/fake-useragent
安裝:pip install fake-useragentdom
基本的使用例子:scrapy
from fake_useragent import UserAgent ua = UserAgent() print(ua.ie) print(ua.chrome) print(ua.Firefox) print(ua.random) print(ua.random) print(ua.random)
這裏能夠獲取咱們想要的經常使用的User-Agent,而且這裏提供了一個random方法能夠直接隨機獲取,上述代碼的結果爲:ide
這裏我找了一個以前寫好的爬蟲,而後實現隨機更換User-Agent,在settings配置文件以下:spa
DOWNLOADER_MIDDLEWARES = { 'jobboleSpider.middlewares.RandomUserAgentMiddleware': 543, 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, } RANDOM_UA_TYPE= 'random'
這裏咱們要將系統的UserAgent中間件設置爲None,這樣就不會啓用,不然默認系統的這個中間會被啓用
定義RANDOM_UA_TYPE這個是設置一個默認的值,若是這裏不設置咱們會在代碼中進行設置,在middleares.py中添加以下代碼:code
class RandomUserAgentMiddleware(object): ''' 隨機更換User-Agent ''' 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())
上述代碼的一個簡單分析描述:
1. 經過crawler.settings.get來獲取配置文件中的配置,若是沒有配置則默認是random,若是配置了ie或者chrome等就會獲取到相應的配置
2. 在process_request方法中咱們嵌套了一個get_ua方法,get_ua其實就是爲了執行ua.ua_type,可是這裏沒法使用self.ua.self.us_type,因此利用了getattr方法來直接獲取,最後經過request.heasers.setdefault來設置User-Agent
經過上面的配置咱們就實現了每次請求隨機更換User-Agent