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

无法从baseball-reference.com爬取MLB球队击球数据求助

问题原因与解决建议:Scrapy爬虫无法定位页面表格但Shell可正常获取

常见原因及对应解决方案:

1. 反爬机制识别了爬虫请求

网站可能通过User-Agent字段区分普通请求和爬虫请求:Scrapy Shell默认的UA和爬虫默认UA不同,Shell的请求被网站判定为合法,而爬虫的请求被限制返回完整内容。

  • 解决方法:
    • 查看Scrapy Shell的UA:在Shell里执行response.request.headers['User-Agent']获取当前UA值
    • 在爬虫项目的settings.py中修改USER_AGENT为Shell的UA,或者使用浏览器的UA:
      USER_AGENT = 'Scrapy/2.8.0 (+https://scrapy.org)'  # 替换为Shell里的实际UA值
      

2. 表格内容通过JavaScript动态渲染

虽然返回200状态码,但爬虫拿到的是未渲染的原始HTML,表格内容可能被放在JS代码中、通过AJAX加载,或是被注释包裹(比如<!--和-->之间)。

  • 解决方法:
    • 检查爬虫获取的response.text,搜索team_batting确认是否被注释,若是则通过字符串处理提取内容:
      import re
      html_content = response.text
      table_html = re.findall(r'<!--(.*?team_batting.*?)-->', html_content, re.DOTALL)[0]
      # 用Selector解析提取出的表格HTML
      from scrapy.selector import Selector
      table_selector = Selector(text=table_html)
      
    • 使用JS渲染工具:比如scrapy-splash或playwright,让爬虫获取渲染后的完整页面内容。

3. 请求头缺失必要字段

网站可能校验Accept、Accept-Language、Referer等字段,爬虫默认请求头不完整,导致返回内容被裁剪。

  • 解决方法:
    • 在settings.py中补充完整请求头:
      DEFAULT_REQUEST_HEADERS = {
          'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
          'Accept-Language': 'en-US,en;q=0.5',
          'Referer': 'https://www.baseball-reference.com/'
      }
      

4. 爬虫选择器与Shell中使用的不一致

确认爬虫代码中定位team_batting表格的XPath/CSS选择器,和你在Shell中测试的完全一致,避免因拼写错误、路径错误导致无法定位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 05:45:20