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
相关产品推荐
相关产品推荐

