使用Google Sheets爬取Instagram粉丝时遭封禁的解决办法
解决Google Sheets批量爬取Instagram粉丝数被封禁的方案
这种情况我之前帮朋友处理过,本质就是Instagram的反爬机制检测到了Google Sheets服务器发起的批量请求,直接把这个IP段给限制了。下面几个方案亲测有效,你可以根据自己的需求选:
1. 给请求加随机延迟,分批处理
Google Sheets原生公式没法加延迟,但可以用Google Apps Script写自定义函数,实现分批、带间隔的请求,模拟真实用户的操作节奏:
- 先把所有要爬的Instagram账号整理到A列(比如A2:A1000)
- 打开「扩展程序」→「Apps脚本」,粘贴类似下面的代码:
function fetchFollowersBatch() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const dataRange = sheet.getRange("A2:A1000"); const usernames = dataRange.getValues(); const delayMin = 1000; // 最小延迟1秒 const delayMax = 3000; // 最大延迟3秒 for (let i = 0; i < usernames.length; i++) { const username = usernames[i][0]; const targetCell = sheet.getRange(i+2, 2); // 结果写到B列对应行 // 跳过已经爬过的单元格 if (targetCell.getValue() !== "") continue; if (!username) continue; try { // 随机延迟 Utilities.sleep(Math.random() * (delayMax - delayMin) + delayMin); // 模拟真实请求头 const options = { headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } }; const response = UrlFetchApp.fetch(`https://www.instagram.com/${username}/?__a=1`, options); const data = JSON.parse(response.getContentText()); targetCell.setValue(data.graphql.user.edge_followed_by.count); } catch (e) { targetCell.setValue("请求失败"); console.log(`处理${username}时出错: ${e.message}`); } } } - 保存脚本后,你可以手动点击运行,或者设置定时触发器(比如每5分钟运行一次,每次处理50行),避免短时间内请求量过大。
2. 改用Instagram官方Graph API(最稳定合规)
如果你的使用场景符合Instagram的服务条款,这是最靠谱的方法——官方API完全不会触发封禁,只要不超过请求限额就行:
- 先注册Facebook开发者账号,创建应用,申请「Instagram Graph API」的权限(需要验证你的身份,过程有点繁琐,但一次搞定终身省心)
- 拿到合法的
access token后,在Google Sheets里用自定义脚本调用API:function getOfficialFollowers(username) { const accessToken = "你的官方access token"; const response = UrlFetchApp.fetch(`https://graph.instagram.com/${username}?fields=followers_count&access_token=${accessToken}`); const data = JSON.parse(response.getContentText()); return data.followers_count || "无效账号"; } - 这个方法的好处是完全合规,数据准确,不会有被封禁的风险。
3. 优化现有公式,避免重复请求
如果不想写脚本,先检查你的现有公式:是不是每次刷新表格都会重新发起所有请求?
- 可以用
IF()函数做缓存逻辑,比如把公式改成:
这样只有空的B列单元格才会发起请求,已经获取到的粉丝数不会重复请求,能大大减少请求量。=IF(B2="", 你的爬取公式, B2)
4. 模拟真实用户请求头
Instagram会检测请求的User-Agent,Google Sheets默认的请求头很容易被识别成爬虫。如果用的是自定义公式,一定要在请求里加上真实的浏览器User-Agent,甚至可以随机切换不同的UA:
- 比如在UrlFetchApp的options里添加:
const userAgents = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Safari/605.1.15" ]; const randomUA = userAgents[Math.floor(Math.random() * userAgents.length)]; const options = { headers: { 'User-Agent': randomUA } };
最后提醒
不管用哪种方法,都要遵守Instagram的服务条款——不要过度爬取,不要用于商业用途(除非获得授权),否则即使绕过了当前封禁,也可能被永久限制访问。
内容的提问来源于stack exchange,提问作者Tom K
相关产品推荐
相关产品推荐

