Scrapy随机更改User-Agent
User-Agent:
User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
实际中他是这个样子的:
User-Agent:Mozilla/5.0 (Macintosh; Intel …) Gecko/20100101 Firefox/57.0 或☟
因为如果快速的使用同一个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, }