Scrapy爬虫因默认User-Agent暴露身份易被封,需替换为真实浏览器标识:1. 在settings.py设DEFAULT_REQUEST_HEADERS;2. 单个Request中传headers参数;3. 用下载中间件实现随机User-Agent。

Scrapy爬虫运行时被目标网站返回403或直接断连,大概率是因为请求头暴露了爬虫身份——默认的User-Agent: Scrapy/xxx (+scrapy)就像举着牌子说“我是爬虫”,必须替换成真实浏览器标识才能通过基础校验。
在settings.py中统一设置默认请求头
打开项目根目录下的settings.py文件,找到或添加DEFAULT_REQUEST_HEADERS配置项。
取消注释并填入你选好的浏览器头信息,例如:
DEFAULT_REQUEST_HEADERS = {<br> 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',<br> 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',<br> 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'<br>}
这个配置会作用于所有请求,但无法覆盖Request对象中显式传入的headers,也不影响后续中间件的修改。
在单个Request中动态设置请求头
进入爬虫文件(如spiders/example_spider.py),在parse或start_requests方法里构造Request时直接传入headers参数。
方法一:硬编码指定头信息
yield scrapy.Request(url='https://example.com', headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36'}, callback=self.parse_detail)
方法二:用字典变量复用
my_headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36', 'Referer': 'https://example.com/'}yield scrapy.Request(url, headers=my_headers, callback=self.parse)
注意:如果URL是相对路径,必须先用response.urljoin()转成绝对地址,否则请求会失败。
通过下载中间件实现随机User-Agent
这是应对反爬最实用的方式——避免固定UA被封IP。需要三步操作:
第一步:在middlewares.py中定义随机UA中间件
添加以下类(注意缩进和引号格式):
import random<br>class RandomUserAgentMiddleware:<br> def __init__(self):<br> self.user_agents = [<br> "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",<br> "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36",<br> "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36"<br> ]<br> def process_request(self, request, spider):<br> ua = random.choice(self.user_agents)<br> request.headers['User-Agent'] = ua
第二步:在settings.py中启用该中间件
取消DOWNLOADER_MIDDLEWARES配置项的注释,并加入你的中间件路径:
DOWNLOADER_MIDDLEWARES = {<br> 'myproject.middlewares.RandomUserAgentMiddleware': 543,<br>}
其中myproject要替换成你实际的项目名,数字543表示执行优先级——数值越小越早执行,确保它在默认UA设置之后、请求发出之前生效。
第三步:确认中间件类名与文件路径严格匹配,大小写不能错,否则启动时报ImportError。


















