虚拟专用服务器上Puppeteer运行异常,Instagram抓取API故障求助
Instagram媒体抓取API部署VPS后返回“Media not found.”的排查方案
核心原因分析与解决办法
1. 反爬机制触发
Instagram会针对无头浏览器、异常IP环境(VPS IP多被标记为爬虫源)进行页面内容限制,导致本地能正常加载的媒体元素在VPS上无法获取。
- 调整Puppeteer启动参数,模拟真实浏览器环境:
async function getInstagramMediaLink(postURL) { // 启用无头模式并添加必要参数,适配VPS环境 const browser = await puppeteer.launch({ headless: "new", args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-blink-features=AutomationControlled' ], defaultViewport: { width: 1920, height: 1080 } }); const page = await browser.newPage(); // 设置真实用户代理 await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'); // 禁用自动化检测特征 await page.evaluateOnNewDocument(() => { Object.defineProperty(navigator, 'webdriver', { get: () => undefined, }); }); await page.goto(postURL, { waitUntil: 'domcontentloaded' }); // 显式等待媒体元素加载,延长超时时间 await page.waitForSelector('article img, article video', { timeout: 15000 }); const mediaElement = await page.$('article img, article video'); if (mediaElement) { const mediaSrc = await page.evaluate(element => element.getAttribute('src'), mediaElement); await browser.close(); return mediaSrc; } await browser.close(); return null; }
2. VPS网络与页面加载问题
VPS网络延迟或Instagram对该IP的资源加载限制,会导致networkidle0等待完成时,媒体元素尚未渲染。
- 调整页面等待策略:将
waitUntil: 'networkidle0'改为domcontentloaded,并添加显式等待媒体元素的代码(如上例中的waitForSelector)。 - 测试VPS网络连通性:执行
curl -L -I "你的Instagram帖子URL",检查返回状态码是否为200,若为403/429则说明IP被限制,需更换IP或使用代理。
3. 页面结构差异
Instagram会根据访问地区、设备类型返回不同DOM结构,VPS的IP地区与本地不同,导致选择器失效。
- 在VPS上打印页面源码,排查实际DOM结构:
// 在page.goto后添加 const pageHTML = await page.content(); console.log(pageHTML); - 根据实际输出调整选择器,例如部分地区的页面媒体元素可能位于
div._aagu img或div._aagv video这类容器中。
4. Puppeteer系统依赖缺失
VPS默认缺少Chrome运行所需的系统库,导致页面渲染不完全。
- 以Ubuntu/Debian为例,安装依赖:
sudo apt update && sudo apt install -y libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxrandr2 libgbm1 libasound2 libpangocairo-1.0-0 libgtk-3-0 - 若问题仍存在,可改用
puppeteer-core配合系统已安装的Chrome,减少依赖冲突。
内容的提问来源于stack exchange,提问作者Atalay
相关产品推荐
相关产品推荐

