我们需要从页面捕获所有出站路线。其中一些可能无法使用链接元素<a src="...">
实现,而是通过一些JavaScript代码或GET
/ POST
形式实现。
在Phantom中,我们使用onNavigationRequested
回调来完成此操作。我们只需单击某个选择器定义的所有元素,并使用onNavigationRequested
在表单的情况下捕获目标URL和可能的方法或POST数据,然后取消该导航事件。
我尝试过请求拦截但是当前请求被截获,当前页面已经丢失,所以我不得不回去。
当浏览器仍在触发事件的页面并停止时,有没有办法捕获导航事件?
谢谢。
答案 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()
}
})