Puppeteer中page.evaluate()内函数未执行无法获取超链接问题
问题根因
- 调用
page.evaluate()时错误使用了this.page:你在函数内定义的页面对象是局部常量page,并没有挂载到当前执行上下文的this上,这行代码会直接抛出引用错误,自然无法拿到返回的链接列表。 - 未等待动态元素渲染完成:
.jss2是JSS方案生成的动态类名,这类元素通常在页面初始HTML加载完成后,才会由前端JS运行时挂载到DOM上。page.goto()默认仅等待load事件触发,此时动态元素大概率还未生成,直接执行选择器查询会得到空集合。 - 取值逻辑隐患:如果挂载
.jss2类的元素本身不是<a>超链接标签,直接读取element.href会得到undefined,需要根据实际DOM结构调整选择器。
修复后可运行代码
async function testing() { const browser = await puppeteer.launch({headless: false}); const page = await browser.newPage(); await page.setViewport({width: 1200, height: 800}); // 配置等待条件,等页面网络请求基本空闲再继续,适配动态渲染站点 await page.goto(url, { waitUntil: 'networkidle2' }); // 显式等待目标类名元素渲染到页面,可根据实际情况调整超时时长 await page.waitForSelector('.jss2', { timeout: 5000 }); const link_list = await page.evaluate(() => { // 如果jss2类名不在a标签上,请将选择器改为 ".jss2 a" 查询内部超链接 const elements = Array.from(document.querySelectorAll(".jss2")); // 过滤掉空的href值 return elements.map(element => element.href).filter(Boolean); }); console.log(link_list); // 操作完成后记得关闭浏览器实例,避免后台进程残留 // await browser.close(); }
额外排查方向
- 如果执行后仍拿不到结果,可以在
evaluate内部打印document.body.innerHTML,确认当前DOM里目标元素的类名是否和预期一致,部分站点会动态变更类名做反爬。 - 提前确认传入
page.goto()的url变量已经正确赋值,不要漏写地址前缀。
内容的提问来源于stack exchange,提问作者sj443
相关产品推荐
相关产品推荐

