puppeteer|puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
在官方文档(puppeteer/api.md at master · GoogleChrome/puppeteer · GitHub)中,中断 redirect 的标准做法是这样的:
const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
await page.setRequestInterception(true);
page.on('request', interceptedRequest => {
if (interceptedRequest.url().endsWith('.png') || interceptedRequest.url().endsWith('.jpg'))
interceptedRequest.abort();
else
interceptedRequest.continue();
});
await page.goto('https://example.com');
await browser.close();
});
【puppeteer|puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决】这样一开始也是没有什么问题,但是偶尔会遇到这样情况:
Error: net::ERR_FAILED at http://xxx.com/yyy
Google 了一轮,发现相关的 issue 很少,只找到了这么一个:
Page.setRequestInterception Redirection Issue · Issue #3421 · GoogleChrome/puppeteer · GitHub
官方已经把它定义为一个 Bug 了,也有一些相关的解决方案:umbrella Fix Request Interception · Issue #3471 · GoogleChrome/puppeteer · GitHub
不过其他人遇到的情况是 abort() 之后无法结束的问题,而我是抛出异常的问题,所以我自己摸索了一下,总结出一个比较合适的办法:
就是用 respond 代替 abort。
比如:
// request.abort();
request.respond({
status: 404,
contentType: 'text/plain',
body: 'Not Found!',
});
推荐阅读
- http://note.youdao.com/yws/public/redirect/share?id=8e5a812e5778216a0752f838e6b9ae37&type=false
- stopPropagation和stopImmediatePropagation的区别
- 使用puppeteer提取网页中的视频地址
- puppeteer-recorder
- puppeteer调研--生成页面的屏幕截图和PDF
- puppeteer 简单使用和一个简单的case
- laravel框架|使用node将HTML生成PDF或图片(采用 puppeteer)
- 【J2EE笔记】Servlet里sendRedirect中文乱码问题的解决
- java-web|forward(转发)与redirect(重定向)的区别
- URL重定向漏洞(URL Redirection to Untrusted Site)-Python