You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Scrapy爬取MarketWatch遇302重定向问题求助

解决Scrapy爬取MarketWatch金融数据时的302重定向问题

重定向的核心原因

  • 缺失浏览器特征请求头:MarketWatch的反爬机制会校验请求是否来自真实浏览器,缺少关键头信息会被判定为爬虫,强制重定向到搜索页。
  • 会话Cookie未建立:部分页面需要先通过访问首页/股票基础页获取会话Cookie,直接请求详情页会被拦截重定向。
  • 爬虫行为特征触发拦截:请求频率过高、请求顺序不符合正常用户路径,也可能触发重定向逻辑。

具体解决方案

1. 配置真实浏览器级请求头

在Scrapy的settings.py中设置全局默认请求头,模拟Chrome浏览器的请求特征:

DEFAULT_REQUEST_HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    'Accept-Encoding': 'gzip, deflate, br',
    'Referer': 'https://www.marketwatch.com/',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1'
}

若全局设置无效,可在单个Request中单独指定headers:

def start_requests(self):
    tickers = ['abbv']
    for ticker in tickers:
        url = f'https://www.marketwatch.com/investing/{ticker}/financials'
        yield scrapy.Request(
            url=url,
            callback=self.parse_financials,
            headers={
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
                'Referer': f'https://www.marketwatch.com/investing/{ticker}'
            }
        )

2. 先建立会话再请求详情页

先请求目标股票的基础页面(如https://www.marketwatch.com/investing/abbv)获取网站会话Cookie,再携带Cookie请求金融数据页:

def start_requests(self):
    tickers = ['abbv']
    for ticker in tickers:
        base_url = f'https://www.marketwatch.com/investing/{ticker}'
        yield scrapy.Request(
            url=base_url,
            callback=self.parse_base,
            meta={'ticker': ticker}
        )

def parse_base(self, response):
    ticker = response.meta['ticker']
    financials_url = f'https://www.marketwatch.com/investing/{ticker}/financials'
    # 复用基础页请求获取的Cookie
    yield scrapy.Request(
        url=financials_url,
        callback=self.parse_financials,
        cookies=response.cookies
    )

3. 调整Scrapy反爬相关设置

在settings.py中添加以下配置,降低被识别为爬虫的概率:

# 限制重定向次数,避免无限循环
REDIRECT_MAX_TIMES = 3
# 设置下载延迟,模拟用户浏览节奏
DOWNLOAD_DELAY = 2
# 启用自动限速扩展,动态调整请求间隔
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 1
AUTOTHROTTLE_MAX_DELAY = 5

4. 处理JavaScript动态渲染(若必要)

如果上述方法均无效,可能页面内容是通过JS动态加载的,可结合Scrapy-Playwright渲染页面:

  • 安装依赖:pip install scrapy-playwright
  • 在settings.py中启用扩展:
DOWNLOAD_HANDLERS = {
    "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
    "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
}
PLAYWRIGHT_LAUNCH_OPTIONS = {
    "headless": True,
    "args": ["--no-sandbox"],
}
  • 在Request中指定启用Playwright:
yield scrapy.Request(
    url=financials_url,
    callback=self.parse_financials,
    meta={'playwright': True}
)

内容的提问来源于stack exchange,提问作者Josep Cubedo Macian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:15:17