如何在当前页面离开之前拦截Puppeteer中的请求?

时间:2017-11-02 08:12:06

标签: puppeteer

USECASE:

我们需要从页面捕获所有出站路线。其中一些可能无法使用链接元素<a src="...">实现,而是通过一些JavaScript代码或GET / POST形式实现。

PhantomJS:

在Phantom中,我们使用onNavigationRequested回调来完成此操作。我们只需单击某个选择器定义的所有元素,并使用onNavigationRequested在表单的情况下捕获目标URL和可能的方法或POST数据,然后取消该导航事件。

木偶:

我尝试过请求拦截但是当前请求被截获,当前页面已经丢失,所以我不得不回去。

当浏览器仍在触发事件的页面并停止时,有没有办法捕获导航事件?

谢谢。

4 个答案:

答案 0 :(得分:2)

您可以执行以下操作。

await page.setRequestInterception(true);
page.on('request', request => {
  if (request.resourceType() === 'image')
    request.abort();
  else
    request.continue();
});

此处示例:

https://github.com/GoogleChrome/puppeteer/blob/master/examples/block-images.js

此处列出了可用的资源类型:

https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#requestresourcetype

答案 1 :(得分:2)

我遇到了同样的问题。Puppeteer现在不支持该功能,实际上是不支持该功能的chrome devtool。但是我发现了另一种解决方法,使用 chrome扩展。相关问题:https://github.com/GoogleChrome/puppeteer/issues/823

问题的作者分享了一个解决方案  这里。 https://gist.github.com/GuilloOme/2bd651e5154407d2d2165278d5cd7cdb

正如doc所说,我们可以使用chrome.webRequest.onBeforeRequest.addListener拦截页面中的所有请求,并在需要时将其阻止。

不要忘记将以下命令添加到操纵p的启动选项中:

--load-extension=./your_ext/ --disable-extensions-except=./your_ext/

答案 2 :(得分:1)

page.setRequestInterception(true);文档中有一个非常全面的示例:https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagesetrequestinterceptionvalue。 确保在示例(及以下)中添加一些逻辑,以避免图像请求。您将捕获它然后中止每个请求。

page.on('request', interceptedRequest => {
     if (interceptedRequest.url.endsWith('.png') || 
                              interceptedRequest.url.endsWith('.jpg'))
         interceptedRequest.abort();
     else
         interceptedRequest.continue();
});

答案 3 :(得分:0)

因此,我终于找到了不需要浏览器扩展的解决方案,因此可以在无头模式下工作:

对此人表示感谢:https://github.com/GoogleChrome/puppeteer/issues/823#issuecomment-467408640

page.on('request', req => {
  if (req.isNavigationRequest() && req.frame() === page.mainFrame() && req.url() !== url) {
    // no redirect chain means the navigation is caused by setting `location.href`
    req.respond(req.redirectChain().length
      ? { body: '' } // prevent 301/302 redirect
      : { status: 204 } // prevent navigation by js
    )
  } else {
    req.continue()
  }
})