You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Puppeteer无法选择同class第二个元素,Instagram爬取关注者遇阻

解决Instagram关注者抓取问题

问题分析

你当前的代码存在两个核心问题:

  1. $$eval的回调函数运行在浏览器上下文,无法直接访问Node.js环境中的followerlist变量,所以push操作完全无效;同时你把匹配到的元素数组当成单个元素使用,数组本身没有textContent属性,自然返回undefined。
  2. 循环调用$$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:47:24