为何Python Requests与Scrapy请求结果不同?如何解决Scrapy 301问题?
Scrapy爬取返回301但Requests正常的问题分析与解决
一、请求差异分析
两者请求的核心差异在于请求头内容,具体表现为两点:
- User-Agent(UA)标识:Scrapy默认使用带有
Scrapy字样的UA(如Scrapy/2.8.0 (+https://scrapy.org)),而Requests默认使用带有python-requests字样的UA。Depop服务器可能针对Scrapy这类爬虫UA做了拦截,返回301重定向。 - 请求头完整性:Requests会自动填充
Accept-Encoding、Accept等常用浏览器请求头,而Scrapy的默认请求头更精简,服务器可能因此判定为非合法浏览器请求,触发重定向。
二、解决方法
1. 替换User-Agent
在Scrapy项目的settings.py中配置浏览器UA:
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'
若在Scrapy Shell中临时测试,可添加headers参数:
fetch('https://www.depop.com/products/saltybrasi-perte-dego-white-lace-shirt/', headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'})
2. 补充完整请求头
模拟真实浏览器的请求头集合,进一步降低被识别为爬虫的概率:
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive' } fetch('https://www.depop.com/products/saltybrasi-perte-dego-white-lace-shirt/', headers=headers)
3. (备选)调整重定向设置
Scrapy默认自动处理301重定向,若服务器重定向地址无效,可在settings.py中关闭自动重定向,手动处理跳转:
REDIRECT_ENABLED = False
内容的提问来源于stack exchange,提问作者JBJ
相关产品推荐
相关产品推荐

