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

Scrapy爬取生成的nba.json为空,求技术排查帮助

问题排查与修复方案

核心问题分析

生成空JSON文件的原因是当前代码无法从目标页面提取到任何数据,主要有两个关键点:

  • 硬编码的绝对XPath路径已失效,无法定位到球员数据行
  • 分页逻辑完全无效(next_page的XPath为空字符串)

具体修复步骤

1. 修正数据提取的XPath

ESPn页面结构可能已更新,原绝对路径过于脆弱。改用更稳定的相对路径定位数据:

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "nba"
    start_urls = ["https://www.espn.com/nba/stats/_/season/2020/seasontype/2"]
    
    def parse(self, response):
        # 改用相对路径定位球员数据表格行,适配页面结构变化
        for content in response.xpath("//div[contains(@class, 'ResponsiveTable')]//table/tbody/tr"):
            # 调整字段XPath,匹配当前页面的元素位置
            yield {
                "name": content.xpath(".//td[2]/a/text()").get(),
                "team": content.xpath(".//td[2]/span[2]/text()").get(),
                "ppg": content.xpath(".//td[3]/text()").get()
            }

        # 修复分页链接的XPath,定位"下一页"按钮
        next_page = response.xpath("//a[@title='Next Page']/@href").get()
        if next_page is not None:
            yield response.follow(next_page, callback=self.parse)

2. 验证页面是否需要动态渲染

如果修改XPath后仍无数据,说明页面是通过JavaScript动态加载内容。此时需要:

  • 使用Scrapy结合Playwright/Splash等工具渲染页面
  • 或者直接抓包找到数据接口(ESPn通常有API接口返回JSON格式的统计数据,效率更高)

3. 快速测试方法

在终端运行scrapy shell https://www.espn.com/nba/stats/_/season/2020/seasontype/2,然后执行以下命令验证XPath有效性:

# 检查是否能拿到数据行
response.xpath("//div[contains(@class, 'ResponsiveTable')]//table/tbody/tr")
# 检查单个字段提取
response.xpath("//div[contains(@class, 'ResponsiveTable')]//table/tbody/tr[1]//td[2]/a/text()").get()

内容的提问来源于stack exchange,提问作者Macros

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:00:59