使用Cheerio结合Google Apps Script爬取网页无法获取目标元素如何解决
问题根因
代码拿不到返回值是两个核心问题导致的:
UrlFetchApp请求拿到的只是PageSpeed页面的初始静态HTML,页面展示的性能分数是页面加载完成后,前端JS动态计算、渲染生成的,初始返回的HTML源码里根本没有class为lh-gauge__percentage的元素- Cheerio只是静态HTML解析工具,没有浏览器运行环境,没法执行页面里的JS代码,自然选不到动态生成的节点,拿不到对应内容。
解决方法
别爬前端渲染的PageSpeed页面,直接调用官方的PageSpeed数据接口就行,不用解析DOM,稳定性比爬页面高很多:
- 不需要额外引入Cheerio依赖,接口直接返回结构化JSON数据
- 可以通过参数指定要获取移动端还是桌面端的检测结果
- 直接从返回结构里取性能分数即可,分数是和页面展示一致的0-100百分制数值
参考实现代码:
function getPageSpeedPerformanceScore() { // 对要检测的目标地址做URL编码 const targetPage = encodeURIComponent("http://www.juicecoldpressed.com/"); // 组装请求地址,strategy参数传mobile获取移动端结果,传desktop获取桌面端结果 const requestUrl = `https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=${targetPage}&strategy=mobile`; const fetchRes = UrlFetchApp.fetch(requestUrl); const resData = JSON.parse(fetchRes.getContentText()); // 接口返回的分数是0-1区间的小数,乘100取整就是页面展示的百分制分数 const score = Math.round(resData.lighthouseResult.categories.performance.score * 100); Logger.log(score); return score; }
注意事项
- 如果调用频次比较高,建议申请官方接口的调用密钥拼接到请求参数里,避免触发匿名调用的配额限制
- 不要继续用爬前端DOM的方案,PageSpeed前端的类名、渲染逻辑随时可能调整,这类方案非常容易失效
内容的提问来源于stack exchange,提问作者user12736831
相关产品推荐
相关产品推荐

