Python中Scrapy爬虫PC端访问却变成移动端地址问题如何解决
用 scrapy 爬取喜马拉雅,爬取 PC 端地址,入口链接的 response 没问题,但后面 response 看到的是移动端地址。。。。
spider 代码如下:
class SpxmlySpider(scrapy.Spider):
name = 'ximalaya'
allowed_domains = ["ximalaya.com"]
# 保存每页链接
start_urls = ['http://www.ximalaya.com/dq/all/{}'.format(num) for num in range(2, 3)] #先改为第二页试试
def parse(self, response):
# 取出专辑链接
print(response)
mainurls = response.xpath('//div[@class="albumfaceOutter"]/a/@href').extract()
# for url in mainurls:
# yield Request(url = url, callback=self.parse_details)
print(mainurls[0])
yield Request(url = mainurls[0], dont_filter=True, callback = self.parse_details)
TODO 为什么 PC 端访问会变成移动地址问题!!!!!!!!!!!!!!!!!
def parse_details(self, response):
item = XimalayaItem()
print(response)
......以下省略
控制台输出:

已经写了一个 middlewares.RotateUserAgentMiddleware,给 headers 设置 user-agent,是生效的,输出内容也可以看出来。
是不是触发什么反爬机制?
Python中Scrapy爬虫PC端访问却变成移动端地址问题如何解决
3 回复
这个问题通常是因为目标网站检测了User-Agent,然后做了重定向。Scrapy默认的User-Agent是Scrapy/版本号,有些网站会把这个识别为爬虫并跳转到移动版。
最简单的解决办法是在你的爬虫里设置一个桌面浏览器的User-Agent。在Scrapy项目里,有几种方式可以做到:
- 在settings.py里全局设置:
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
- 在爬虫类里设置:
import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
def start_requests(self):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
yield scrapy.Request(url='你的目标网址', headers=headers, callback=self.parse)
def parse(self, response):
# 你的解析逻辑
pass
- 使用中间件随机切换User-Agent(更推荐):
# 在middlewares.py里添加
import random
class RandomUserAgentMiddleware:
def __init__(self):
self.user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]
def process_request(self, request, spider):
request.headers['User-Agent'] = random.choice(self.user_agents)
# 然后在settings.py里启用
DOWNLOADER_MIDDLEWARES = {
'你的项目名.middlewares.RandomUserAgentMiddleware': 400,
}
如果设置了User-Agent还是被重定向,可能网站还检测了其他请求头,比如Accept-Language、Accept-Encoding等,可以一并设置。
总结:设置一个桌面浏览器的User-Agent就能解决。
可能是 User-Agent 太舊了, 改成 10.0 試試?
你把 RotateUserAgentMiddleware 去掉试试,我这什么都没设置是好的,返回的还是 pc 端的地址

