如何用Python捕获浏览器新标签页的网页响应?
如何用伪浏览器捕获Instagram私密故事工具的新标签页JSON响应
我正在开发一款脚本,用于下载已关注的Instagram私密账号故事。目前使用的工具会利用浏览器会话获取内容,输入目标故事链接后,会在新标签页打开JSON格式的故事数据(示例结构如下)。现在希望替换手动处理HTML的方式,用伪浏览器模块直接捕获这个新标签页的JSON响应,实现自动化流程。
{ "data": { "reels_media": [ { "__typename": "GraphHighlightReel", "id": "some_id", "latest_reel_media": null, "owner": { "__typename": "GraphUser", "id": "some_id", "profile_pic_url": "some_url", "username": "some_username" }, "items": [ { "__typename": "GraphStoryVideo", "id": "some_id", "dimensions": { "height": 1136, "width": 640 }, "display_resources": [ { "src": "some_url", "config_width": 640, "config_height": 1136 }, { "src": "some_url", "config_width": 750, "config_height": 1331 } ] } ] } ] } }
解决方案:用Puppeteer/Playwright捕获新标签页响应
推荐使用Puppeteer(基于Chrome/Chromium)或Playwright(支持多浏览器)这类伪浏览器工具,它们可以监听新标签页创建事件,并捕获页面的网络响应。以下是基于Puppeteer的实现示例:
步骤1:安装依赖
npm install puppeteer
步骤2:核心代码实现
const puppeteer = require('puppeteer'); async function captureStoryJSON(storyLink) { // 启动浏览器,headless: false可开启可视化调试 const browser = await puppeteer.launch({ headless: false }); const mainPage = await browser.newPage(); // 导入已登录的Instagram会话cookie(需提前登录后导出) // const cookies = require('./instagram-cookies.json'); // await mainPage.setCookie(...cookies); // 导航到私密故事下载工具页面 await mainPage.goto('instafinsta私密下载器页面地址'); // 在输入框填入目标故事链接(需根据页面实际元素调整选择器) await mainPage.type('input[type="text"]', storyLink); // 监听新标签页创建事件 const newPagePromise = new Promise(resolve => { browser.once('targetcreated', target => resolve(target.page())); }); // 触发下载操作(点击提交按钮,选择器需适配页面) await mainPage.click('button[type="submit"]'); // 获取新打开的标签页 const jsonPage = await newPagePromise; // 捕获新标签页的JSON响应 let storyJSON = null; jsonPage.on('response', async (response) => { // 判断响应是否为JSON类型且请求成功 if (response.headers()['content-type']?.includes('application/json') && response.ok()) { storyJSON = await response.json(); console.log('成功捕获JSON数据'); // 直接处理媒体下载 downloadStoryMedia(storyJSON); } }); // 等待新标签页加载完成 await jsonPage.waitForNavigation(); // 清理资源 await jsonPage.close(); await browser.close(); return storyJSON; } // 处理JSON中的媒体链接,实现下载逻辑 function downloadStoryMedia(jsonData) { const reelItems = jsonData.data.reels_media[0].items; reelItems.forEach(item => { // 获取最高分辨率的媒体链接 const highestResSource = item.display_resources[item.display_resources.length - 1]; if (item.__typename === 'GraphStoryVideo') { console.log(`视频下载链接: ${highestResSource.src}`); // 这里可添加下载逻辑,比如用axios/fs模块保存文件 } else if (item.__typename === 'GraphStoryImage') { console.log(`图片下载链接: ${highestResSource.src}`); } }); } // 调用示例 captureStoryJSON('https://www.instagram.com/stories/highlights/1234567890/');
关键注意事项
- 会话保持:必须确保伪浏览器处于已登录Instagram的状态,可通过导入本地cookie实现(避免重复登录触发反爬)。
- 选择器适配:工具页面的输入框、按钮选择器可能会更新,需通过浏览器开发者工具确认最新选择器。
- 反爬规避:添加请求延迟、随机User-Agent,避免频繁操作被限制。
- 优化方案:若能分析工具调用的Instagram API接口,可直接模拟API请求,跳过工具页面,提升效率。
内容的提问来源于stack exchange,提问作者Yisus Christ
相关产品推荐
相关产品推荐

