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

Scrapy爬取otto.de时无法定位指定script标签求助

问题分析与解决办法

可能的原因

  • 动态内容渲染:otto.de大概率用JavaScript动态生成了product_data_json标签。Scrapy默认只会下载服务器返回的原始HTML,不会执行页面中的JS,导致你在浏览器里能看到的标签,Scrapy爬回的HTML里根本不存在。
  • 反爬拦截:网站可能识别出请求来自爬虫,返回了精简版或伪造的HTML内容,自然找不到目标标签。
  • 选择器细节错误:虽然XPath Helper能定位到标签,但代码里可能漏了关键部分(比如没取标签内的文本),或是语法、引号使用有误。

解决步骤

1. 先确认原始HTML中是否存在目标标签

在爬虫代码里添加print(response.text),然后搜索product_data_json:

  • 如果搜索不到,说明是动态渲染或反爬问题;
  • 如果能搜到,再检查选择器写法。

2. 处理动态渲染场景

如果是JS动态加载的标签,有两种高效方案:

  • 用浏览器渲染工具:比如scrapy-playwright,它能模拟浏览器执行JS,获取渲染后的完整HTML。安装后在settings.py启用对应中间件,请求时添加meta={"playwright": True}即可。
  • 直接抓取API接口:打开浏览器开发者工具(F12)切换到Network标签,刷新页面后找XHR/fetch类型的请求,通常能找到返回产品JSON数据的接口。直接爬接口比解析页面更高效,还不用处理JS渲染。

3. 应对反爬拦截

在settings.py里设置真实的浏览器请求头,模拟正常用户访问:

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'

也可以在爬虫的start_requests方法里补充更多请求头:

headers = {
    'Accept-Language': 'en-US,en;q=0.9',
    'Referer': 'https://www.otto.de/'
}
yield scrapy.Request(url=your_url, headers=headers)

4. 修正选择器写法

确保选择器正确获取标签内的文本内容:

  • CSS选择器正确写法:
script_content = response.css('script#product_data_json::text').get()
  • XPath正确写法:
script_content = response.xpath('//script[@id="product_data_json"]/text()').get()

注意必须加::text(CSS)或/text()(XPath),否则只会返回标签对象,无法拿到里面的JSON内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:59:54