第三百四十七節,Python分佈式爬蟲打造搜索引擎Scrapy精講—經過downloadmiddleware中間件全局隨機更換user-agent瀏覽器用戶代理

第三百四十七節,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
}

咱們能夠打斷點調試一下,看看是否生效

 

原理說明圖

相關文章
相關標籤/搜索