Google Sheets IMPORTXML爬取bol.com数据遇N/A及不完整问题求助
bol.com商品信息爬取异常排查与修复方案
核心故障原因
你当前使用的IMPORTXML搭配绝对层级XPath的方案存在三个固有缺陷,直接导致约17%的爬取结果异常:
- bol.com的前端DOM结构不固定:不同品类、不同属性数量的商品页,属性列表所在的父级div序号会动态调整,你写死的
div[5]、div[4]这类层级定位,遇到结构偏移就会抓错内容块、漏字段。 - 触发平台限流:Google Sheets的请求出口为共享IP池,短时间批量发起30+请求时,bol.com会返回截断的轻量页面、或直接拦截请求,导致返回N/A,或EAN这类位置靠后的字段缺失。
- 定位范围过窄:第三方卖家商品、特殊品类商品的属性字段可能拆分到多个相邻dl容器中,仅抓取单个固定路径下的dl会漏掉部分字段。
排查步骤
按以下顺序定位可覆盖99%的异常场景:
- 取返回N/A/缺EAN的异常商品URL,手动打开页面后右键检查属性列表的实际DOM层级,和你当前写的XPath路径对比,确认是否存在div序号偏移——绝大多数字段缺失问题都是该原因导致。
- 将异常URL单独放到空白工作表单元格,单独运行你当前的
IMPORTXML公式:如果单次运行正常、批量运行才报错,可判定为触发限流。 - 右键异常商品页选择「查看网页源代码」(不要用F12开发者工具的元素检查),直接搜索目标EAN值:如果源码里搜不到,说明该字段为JS动态渲染,
IMPORTXML本身不支持执行JS,自然无法抓取。
修复方案
1. 替换XPath为相对定位,彻底解决DOM偏移问题
放弃从根节点数div序号的绝对路径写法,改用属性、文本特征定位,完全不依赖DOM层级:
- 全量属性抓取替换公式:
该写法会直接匹配页面上所有存商品参数的specs类dl列表,不管父级div序号怎么变都能抓到全部属性。=IMPORTXML(C27;"//dl[contains(@class,'specs')]//dt|//dl[contains(@class,'specs')]//dd") - 单字段精准抓取公式(以EAN为例,其余字段替换dt标签内的文本即可):
对应其余目标字段的定位文本替换为=IMPORTXML(C27;"//dt[normalize-space(text())='EAN']/following-sibling::dd[1]")Kleur、Materiaal、Maat、Reflecterend、Speciaal voor hardlopen、Type uitlaatriem、Verpakkingsinhoud即可,只要页面存在对应字段名就能精准匹配,不会漏抓。
2. 调整爬取节奏规避限流
- 批量爬取时每批最多处理20个URL,不要一次性下拉上百个公式触发频率阈值。
- 可通过Google Apps Script编写带随机延迟的自定义爬取函数,每次请求间隔2-5秒随机等待,大幅降低被拦截概率。
- 连续出现N/A时暂停爬取15-30分钟,等共享IP的临时限流冷却后再恢复。
3. 高稳定性方案(彻底解决动态渲染、字段缺失问题)
bol.com的商品页初始HTML中内嵌了全量商品数据的JSON对象,存储在window.__INITIAL_STATE__变量中,所有属性字段在初始返回的源码里就存在,不需要JS渲染。通过Apps Script写自定义函数直接解析该JSON块,爬取稳定性比抓DOM高100%,不会出现字段缺失、N/A问题。
注意:爬取频率不要超过1次/2秒,过高的请求频率会导致Google Sheets的共享出口IP被bol.com长期封禁。
内容的提问来源于stack exchange,提问作者Scraper2022
相关产品推荐
相关产品推荐

