第三百四十七節,Python分佈式爬蟲打造搜索引擎Scrapy精講—經過downloadmiddleware隨機更換user-agent瀏覽器用戶代理html
downloadmiddleware介紹
中間件是一個框架,能夠鏈接到請求/響應處理中。這是一種很輕的、低層次的系統,能夠改變Scrapy的請求和迴應。也就是在Requests請求和Response響應之間的中間件,能夠全局的修改Requests請求和Response響應python
UserAgentMiddleware()方法,默認中間件chrome
源碼裏downloadmiddleware裏的useragent.py下的UserAgentMiddleware()方法,默認中間件瀏覽器
咱們能夠從源碼看到當Requests請求時默認的User-Agent是Scrapy,這個很容易被網站識別而攔截爬蟲app
咱們能夠修改默認中間件UserAgentMiddleware()來隨機更換Requests請求頭信息的User-Agent瀏覽器用戶代理框架
第一步、在settings.py配置文件,開啓中間件註冊DOWNLOADER_MIDDLEWARES={ }dom
將默認的將默認的UserAgentMiddleware設置爲None,或者設置成最大就最後執行,這樣咱們自定義的中間件修改默認的user_agent就會先執行scrapy
settings.py配置文件分佈式
# Enable or disable downloader middlewares # See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html DOWNLOADER_MIDDLEWARES = { #開啓註冊中間件 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, #將默認的UserAgentMiddleware設置爲None }
第二步、安裝瀏覽器用戶代理模塊fake-useragent 0.1.7ide
fake-useragent 是一個專門用於爬蟲假裝瀏覽器User-Agent請求頭的模塊。此模塊在線維護了各個瀏覽器的各類版本庫,提供咱們使用
在線各類瀏覽器信息:http://fake-useragent.herokuapp.com/browsers/0.1.7 0.1.7版本,fake-useragent會隨機到這裏調用瀏覽器代理
首先安裝這個模塊
pip install fake-useragent
使用說明:
#!/usr/bin/env python # -*- coding:utf8 -*- from fake_useragent import UserAgent #導入瀏覽器代理模塊 ua = UserAgent() #實例化瀏覽器代理類 ua.ie #隨機獲取IE類型的代理 # Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US); ua.msie #隨機獲取msie類型的代理,下面的相同 # Mozilla/5.0 (compatible; MSIE 10.0; Macintosh; Intel Mac OS X 10_7_3; Trident/6.0)' ua['Internet Explorer'] # Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US) ua.opera # Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11 ua.chrome # Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2' ua.google # Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.13 (KHTML, like Gecko) Chrome/24.0.1290.1 Safari/537.13 ua['google chrome'] # Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11 ua.firefox # Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1 ua.ff # Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1 ua.safari # Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25 # and the best one, random via real world browser usage statistic ua.random #隨機獲取各類瀏覽器類型的代理,
更多使用 https://pypi.python.org/pypi/fake-useragent/0.1.7
第三步、自定義中間件來全局隨機更換Requests請求頭信息的User-Agent瀏覽器用戶代理
在middlewares.py文件裏,自定義中間件
# -*- coding: utf-8 -*- # Define here the models for your spider middleware # # See documentation in: # http://doc.scrapy.org/en/latest/topics/spider-middleware.html from scrapy import signals from fake_useragent import UserAgent #導入瀏覽器用戶代理模塊 class RequestsUserAgentmiddware(object): #自定義瀏覽器代理中間件 #隨機更換Requests請求頭信息的User-Agent瀏覽器用戶代理 def __init__(self,crawler): super(RequestsUserAgentmiddware, self).__init__() #獲取上一級父類基類的,__init__方法裏的對象封裝值 self.ua = UserAgent() #實例化瀏覽器用戶代理模塊類 self.ua_type = crawler.settings.get('RANDOM_UA_TYPE','random') #獲取settings.py配置文件裏的RANDOM_UA_TYPE配置的瀏覽器類型,若是沒有,默認random,隨機獲取各類瀏覽器類型 @classmethod #函數上面用上裝飾符@classmethod,函數裏有一個必寫形式參數cls用來接收當前類名稱 def from_crawler(cls, crawler): #重載from_crawler方法 return cls(crawler) #將crawler爬蟲返回給類 def process_request(self, request, spider): #重載process_request方法 def get_ua(): #自定義函數,返回瀏覽器代理對象裏指定類型的瀏覽器信息 return getattr(self.ua, self.ua_type) request.headers.setdefault('User-Agent', get_ua()) #將瀏覽器代理信息添加到Requests請求
第四步、將咱們自定義的中間件註冊到settings.py配置文件,的DOWNLOADER_MIDDLEWARES裏
注意一點要把默認的UserAgentMiddleware中間件設置爲None,使其咱們自定義的中間件生效
# Enable or disable downloader middlewares # See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html DOWNLOADER_MIDDLEWARES = { #開啓註冊中間件 'adc.middlewares.RequestsUserAgentmiddware': 543, 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, #將默認的UserAgentMiddleware設置爲None }
咱們能夠打斷點調試一下,看看是否生效
原理說明圖