前言
做爬虫的都知道,模拟真实用户是很重要的,爬虫与反爬虫斗争的过程中,其实就是围绕伪装与鉴别,常见的反爬虫策略都会添加对 User Agent
的校验,会封掉常见的爬虫请求头,比如 Scrapy
默认的 User Agent
是什么呢?同过下面的方式试一下:
scrapy shell https://httpbin.org/user-agent
在结果中使用:
response.text
进行查看,结果为:
{
"user-agent":"Scrapy/1.2.1 (+http://scrapy.org)"
}
很显然,如果是这种默认的UA
,是很不利于我们爬虫工作的。
那么我们如何在 Scrapy
中为 Spider
设置随机的 User Agent
呢?为了实现这个功能,我们需要使用 Scrapy
的中间件 — Scrapy User Agent Middleware
步骤
首先 在 settings.py
中添加一批可用的 User Agent
列表
USER_AGENT_LIST = [
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1636.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML, like Gecko; Google Web Preview) Chrome/22.0.1229 Safari/537.4',
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36',
'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'
]
然后在 middlewares.py
中添加一个自定义的 中间件。
import random
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
class CustomizeUserAgentMiddleware(UserAgentMiddleware):
def __init__(self, user_agent):
self.user_agent = user_agent
@classmethod
def from_crawler(cls, crawler):
""" 从 settings.py 中读取 预设的 UA 列表 """
return cls(user_agent=crawler.settings.get('CUSTOMIZE_USER_AGENT_LIST'))
def process_request(self, request, spider):
""" 随机选择一个 UA 并设置到 Request 中 """
agent = random.choice(self.user_agent)
request.headers['User-Agent'] = agent
最后在 settings.py
中启用中间件
DOWNLOADER_MIDDLEWARES = {
# 不使用内置的 ua 中间件
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
'{your bot name}.middlewares.CustomizeUserAgentMiddleware': 200,
}
然后启动爬虫就可以了。