Puppeteer无法选择同class第二个元素,Instagram爬取关注者遇阻
解决Instagram关注者抓取问题
问题分析
你当前的代码存在两个核心问题:
$$eval的回调函数运行在浏览器上下文,无法直接访问Node.js环境中的followerlist变量,所以push操作完全无效;同时你把匹配到的元素数组当成单个元素使用,数组本身没有textContent属性,自然返回undefined。- 循环调用
$$eval完全没必要,$$eval本身会一次性选中所有匹配的元素,重复调用只会重复获取相同内容,还浪费资源。
另外,Instagram的关注者列表是滚动加载的,仅一次获取只能拿到当前可见的少量数据,需要处理滚动加载逻辑才能拿到更多关注者。
正确实现代码
第一步:获取当前可见的所有关注者
先修正$$eval的用法,一次性获取当前页面中所有匹配元素的文本:
const followerList = await page.$$eval( "div[class=' _ab8y _ab94 _ab97 _ab9f _ab9k _ab9p _abcm']", elements => elements.map(el => el.textContent.trim()) ); console.log(followerList);
第二步:处理滚动加载,获取更多关注者
如果需要获取超过当前可见数量的关注者,需要模拟滚动容器加载新内容:
// 先定位关注者弹窗的滚动容器(class可能随Instagram更新变化,需自行验证) const scrollContainer = await page.$("div[class='_aano']"); const followerList = []; const targetCount = 10; // 目标获取的关注者数量 while (followerList.length < targetCount) { // 获取当前可见的所有关注者名称 const currentFollowers = await page.$$eval( "div[class=' _ab8y _ab94 _ab97 _ab9f _ab9k _ab9p _abcm']", elements => elements.map(el => el.textContent.trim()) ); // 去重,避免重复收集已加载的关注者 const uniqueFollowers = currentFollowers.filter(f => !followerList.includes(f)); followerList.push(...uniqueFollowers); // 滚动容器到底部,触发加载 await page.evaluate(container => { container.scrollTop = container.scrollHeight; }, scrollContainer); // 等待新内容加载(时间可根据网络情况调整) await page.waitForTimeout(1000); } // 截取到目标数量后输出 console.log(followerList.slice(0, targetCount));
关键注意事项
- Instagram的DOM元素class是动态生成的,可能会随时更新,若选择器失效,需要重新用浏览器开发者工具定位正确的元素选择器。
- 频繁操作可能触发Instagram的反爬机制,建议适当延长等待时间,避免被限制访问。
内容的提问来源于stack exchange,提问作者cai
相关产品推荐
相关产品推荐

