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

如何通过Puppeteer下载Blob URL格式的Instagram Reel

解决Puppeteer下载Instagram Reel的Blob URL问题

Blob URL是浏览器上下文内的临时资源标识,无法直接在Node.js环境中用fetch请求,必须在生成该URL的页面上下文内读取Blob内容,再将数据传递到Node端保存。以下是具体实现方案:

核心解决步骤

  1. 在Puppeteer的page.evaluate中执行Blob读取操作(该方法运行在浏览器页面环境)
  2. 将Blob内容转为可序列化的格式(Base64或Uint8Array)传递回Node环境
  3. 在Node端将数据转为Buffer并写入本地文件

代码实现示例

方法1:通过Base64传递数据

const puppeteer = require('puppeteer');
const fs = require('fs');

(async () => {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();
  
  // 替换为你的导航逻辑:登录、进入目标账号页面等
  await page.goto(`https://www.instagram.com/${targetId}/`);
  await page.waitForSelector('video[src]', { visible: true }); // 等待视频元素加载完成

  // 在页面上下文内读取Blob并转为Base64
  const videoBase64 = await page.evaluate(async () => {
    const videoEl = document.querySelector('video');
    const blobRes = await fetch(videoEl.src);
    const blob = await blobRes.blob();
    
    return new Promise((resolve) => {
      const reader = new FileReader();
      reader.onloadend = () => resolve(reader.result.split(',')[1]); // 移除data URI前缀
      reader.readAsDataURL(blob);
    });
  });

  // 将Base64转为Buffer并保存
  const videoBuffer = Buffer.from(videoBase64, 'base64');
  fs.writeFileSync('instagram_reel.mp4', videoBuffer);

  await browser.close();
})();

方法2:通过Uint8Array传递数据(更高效)

const puppeteer = require('puppeteer');
const fs = require('fs');

(async () => {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();
  
  // 导航逻辑:登录、进入目标账号页面
  await page.goto(`https://www.instagram.com/${targetId}/`);
  await page.waitForSelector('video[src]', { visible: true });

  // 在页面上下文读取Blob转为Uint8Array
  const videoUint8Arr = await page.evaluate(async () => {
    const videoEl = document.querySelector('video');
    const res = await fetch(videoEl.src);
    const arrayBuffer = await res.arrayBuffer();
    return Array.from(new Uint8Array(arrayBuffer)); // 转为普通数组便于序列化传递
  });

  // 转为Buffer保存
  const videoBuffer = Buffer.from(videoUint8Arr);
  fs.writeFileSync('instagram_reel.mp4', videoBuffer);

  await browser.close();
})();

注意事项

  • 页面加载状态:必须确保视频元素的src属性已填充,可通过waitForSelector等待元素可见且有src值
  • 反爬机制:Instagram会检测自动化工具,建议设置真实的User-Agent,必要时模拟登录状态
  • 视频格式:Instagram Reel通常为MP4格式,直接保存为.mp4即可

内容的提问来源于stack exchange,提问作者dev.muhammad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 11:47:01