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

