Scrapy随机更改User-Agent

User-Agent:

  User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

  实际中他是这个样子的:

  User-Agent:Mozilla/5.0 (Macintosh; Intel …) Gecko/20100101 Firefox/57.0 或☟

  User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36

  因为如果快速的使用同一个User-Agent访问网址,很容易就被封掉(IP也同样如此)
  在spider通过引擎requests之前,会通过中间件对将要进行访问headers的User-Agent进行设置,
  [ python3.5/site-packages/scrapy/downloadermiddlewares/defaultheaders.py]中我们可以看到Header的中间件,然后我们通过这个设置User-Agent.

class DefaultHeadersMiddleware(object):

    def __init__(self, headers):
        self._headers = headers

    @classmethod
    def from_crawler(cls, crawler):
        headers = without_none_values(crawler.settings['DEFAULT_REQUEST_HEADERS'])
        return cls(headers.items())

    def process_request(self, request, spider):
        for k, v in self._headers:
            request.headers.setdefault(k, v)

  可以看到在初始化的时候,会将settings中的DEFAULT_REQUEST_HEADERS设置的headers加载到当前的headers中,我们可以在setting创建headers列表来随机切换headers中的User-Agent
....此处略过NNN+

  在我们思考如何能够动态的添加User-Agent的时候,万能的GitHub上已经有人贡献了关于User-Agent的代码->直接搜索fake-useragent,打开ReadMe直接开整吧
fake-useragent
  而且,在这个fake-useragent中是找不到User-Agent列表的,因为他是通过一个网址动态维护这个User-Agent的↓↓↓
  https://fake-useragent.herokuapp.com/browsers/0.1.4 如有需要可直接通过url进行筛选,需要注意的是最后的数字代表的是版本号。
  有了这个fake-useragent 我们就可以直接在middlewares.py中直接填写,也省去了在settings中维护一个usergent的list了

middlewares.py

from fake_useragent import UserAgent
class ArticlespiderMiddleware(object):
    def __init__(self,crawler):
        super(ArticlespiderMiddleware, self).__init__()
        self.ua = UserAgent()
        self.ua_type = crawler.settings.get('RANDOM_UA_TPYE','random')

    @classmethod
    def from_crawler(cls,crawler):
        '''在初始化是调用'''
        return cls(crawler)

    def process_requests(self,request,spider):

        def get_ua():
            return getattr(self.ua,self.ua_type)

        request.headers.setdefault('User-Agent',get_ua())

  可以看到在初始化的时候,会将settings中的DEFAULT_REQUEST_HEADERS设置的headers加载到当前的headers中,我们可以在setting创建headers列表来随机切换headers中的User-Agent
在settings.py中设置:

DOWNLOADER_MIDDLEWARES = {
   # 'ArticleSpider.middlewares.MyCustomDownloaderMiddleware': 543,
    'ArticleSpider.middlewares.ArticlespiderMiddleware':3,
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,
}

 

 

posted @ 2017-11-30 10:32  LeeeetMe  阅读(887)  评论(0编辑  收藏  举报