如何使用puppeteer获取下载流(缓冲区)?

罗杰里奥·奥利维拉(RogérioOliveira)

我想获取下载内容(缓冲区),不久后,将数据存储在我的S3帐户中。到目前为止,我还无法找到解决方案...在网络上寻找一些示例时,我注意到有很多人遇到此问题。我尝试(未成功)使用page.on(“ response”)事件来检索原始响应内容,并遵循以下代码片段:

const bucket = [];
await page.on("response", async response => {
        const url = response.url();
        if (
          url ===
          "https://the.earth.li/~sgtatham/putty/0.71/w32/putty-0.71-installer.msi"
        ) {
          try {
            if (response.status() === 200) {
              bucket.push(await response.buffer());
              console.log(bucket);
              // I got the following: 'Protocol error (Network.getResponseBody): No resource with given identifier found' }
            }
          } catch (err) {
            console.error(err, "ERROR");
          }
        }
      });

使用上面的代码,我打算检测下载对话框的事件,然后以某种方式能够接收二进制内容。

我不确定这是否正确。我注意到有些人使用基于读取文件的解决方案,换句话说,下载完成后,他们会从磁盘读取存储的文件。https://github.com/GoogleChrome/puppeteer/issues/299上有类似的讨论

我的问题是:是否有某种方法(使用操纵符)来拦截下载流,而不必先将文件保存到磁盘上?

非常感谢你。

托马斯·唐多夫

问题是,一旦发生任何类型的导航请求,便会立即清除缓冲区。在您的情况下,这可能是重定向或页面重新加载。

要解决此问题,您需要确保只要您还没有完成资源下载,页面就不会发出任何导航请求。为此,我们可以使用page.setRequestInterception

有一个简单的解决方案可以使您入门,但可能并不总是有效,并且可以解决此问题。

简单的解决方案

此解决方案取消了初始请求后的所有导航请求。这意味着页面上的任何重新加载或导航都将无法进行。因此,不会清除资源的缓冲区。

const browser = await puppeteer.launch();
const [page] = await browser.pages();

let initialRequest = true;
await page.setRequestInterception(true);

page.on('request', request => {
    // cancel any navigation requests after the initial page.goto
    if (request.isNavigationRequest() && !initialRequest) {
        return request.abort();
    }
    initialRequest = false;
    request.continue();
});

page.on('response', async (response) => {
    if (response.url() === 'RESOURCE YOU WANT TO DOWNLOAD') {
        const buffer = await response.buffer();
        // handle buffer
    }
});

await page.goto('...');

先进的解决方案

以下代码将依次处理每个请求。如果您下载了缓冲区,它将等待直到缓冲区被下载,然后再处理下一个请求。

const browser = await puppeteer.launch();
const [page] = await browser.pages();

let paused = false;
let pausedRequests = [];

const nextRequest = () => { // continue the next request or "unpause"
    if (pausedRequests.length === 0) {
        paused = false;
    } else {
        // continue first request in "queue"
        (pausedRequests.shift())(); // calls the request.continue function
    }
};

await page.setRequestInterception(true);
page.on('request', request => {
    if (paused) {
        pausedRequests.push(() => request.continue());
    } else {
        paused = true; // pause, as we are processing a request now
        request.continue();
    }
});

page.on('requestfinished', async (request) => {
    const response = await request.response();
    if (response.url() === 'RESOURCE YOU WANT TO DOWNLOAD') {
        const buffer = await response.buffer();
        // handle buffer
    }
    nextRequest(); // continue with next request
});
page.on('requestfailed', nextRequest);

await page.goto('...');

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何获取数字指定的缓冲区的“文件类型”?

来自分类Dev

如何可移植地获取文件流的缓冲区大小?

来自分类Dev

如何使用流解析缓冲区中的行?

来自分类Dev

获取缓冲区的大小

来自分类Dev

线程安全的缓冲区包装流

来自分类Dev

如何从node.js缓冲区获取int

来自分类Dev

如何在Arcgis Android中获取Road的缓冲区?

来自分类Dev

使用OpenCL获取OpenGL缓冲区

来自分类Dev

流缓冲区(cin,getline等)

来自分类Dev

如何使用PortAudio将交错的缓冲区解析为不同的多通道缓冲区

来自分类Dev

使用pkgcloud从Rackspace下载获取缓冲区

来自分类Dev

如何从内存缓冲区加载张量流图

来自分类Dev

如何从缓冲区返回文件流?

来自分类Dev

如何使用JavaScript从S3缓冲区数据中获取HTML模板文件?

来自分类Dev

使用express.js下载文件的缓冲区

来自分类Dev

如何在流缓冲区C中添加参数

来自分类Dev

如何在Linux上获取相机缓冲区?

来自分类Dev

如何获取数字指定的缓冲区的“文件类型”?

来自分类Dev

流混乱,了解缓冲区

来自分类Dev

如何使用流解析缓冲区中的行?

来自分类Dev

如何从node.js缓冲区获取int

来自分类Dev

从url下载图像并放入缓冲区

来自分类Dev

如何获取缓冲区的文件路径?

来自分类Dev

流缓冲区中的默认内容

来自分类Dev

Android如何将int值写入缓冲区并使用计时器从缓冲区中获取值?

来自分类Dev

在 Flex 中使用多个缓冲区时,如何避免令牌在缓冲区之间拆分

来自分类Dev

如何在内存流中获取word文件,将其存储在缓冲区中并以PDF格式返回?

来自分类Dev

如何使用网络填充文件下载缓冲区 [android]

来自分类Dev

流和缓冲区的关系?

Related 相关文章

热门标签

归档