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)
    ......以下省略

控制台输出:

img

已经写了一个 middlewares.RotateUserAgentMiddleware,给 headers 设置 user-agent,是生效的,输出内容也可以看出来。

是不是触发什么反爬机制?


Python中Scrapy爬虫PC端访问却变成移动端地址问题如何解决

3 回复

这个问题通常是因为目标网站检测了User-Agent,然后做了重定向。Scrapy默认的User-Agent是Scrapy/版本号,有些网站会把这个识别为爬虫并跳转到移动版。

最简单的解决办法是在你的爬虫里设置一个桌面浏览器的User-Agent。在Scrapy项目里,有几种方式可以做到:

  1. 在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'
  1. 在爬虫类里设置
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
  1. 使用中间件随机切换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-LanguageAccept-Encoding等,可以一并设置。

总结:设置一个桌面浏览器的User-Agent就能解决。


可能是 User-Agent 太舊了, 改成 10.0 試試?

你把 RotateUserAgentMiddleware 去掉试试,我这什么都没设置是好的,返回的还是 pc 端的地址

回到顶部