当前位置: 首页 > news >正文

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();
});

这样一开始也是没有什么问题,但是偶尔会遇到这样情况:

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!',
});

相关文章:

  • vue--为什么data属性必须是一个函数
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • 【翻译】babel对TC39装饰器草案的实现
  • Fabric架构演变之路
  • CSS实用技巧干货
  • Objective-C 中关联引用的概念
  • 鱼骨图 - 如何绘制?
  • Centos安装gerrit
  • 模型微调
  • 专属程序员的西游记,不是程序员读不懂哦?
  • 第十八天-企业应用架构模式-基本模式
  • 人脸识别最新开发经验demo
  • 百度地图api文档实现任意两点之间的最短路线规划
  • 链表
  • Spark一些必须知道的概念
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 「面试题」如何实现一个圣杯布局?
  • Android 控件背景颜色处理
  • CSS 提示工具(Tooltip)
  • interface和setter,getter
  • JavaScript 基本功--面试宝典
  • Java基本数据类型之Number
  • js数组之filter
  • Laravel Telescope:优雅的应用调试工具
  • mysql 数据库四种事务隔离级别
  • 百度地图API标注+时间轴组件
  • 半理解系列--Promise的进化史
  • 构造函数(constructor)与原型链(prototype)关系
  • 关于for循环的简单归纳
  • 精彩代码 vue.js
  • 算法---两个栈实现一个队列
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​Linux·i2c驱动架构​
  • #pragma once
  • (10)STL算法之搜索(二) 二分查找
  • (C语言)共用体union的用法举例
  • (function(){})()的分步解析
  • (力扣)1314.矩阵区域和
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (区间dp) (经典例题) 石子合并
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (算法)求1到1亿间的质数或素数
  • (一) storm的集群安装与配置
  • (转)mysql使用Navicat 导出和导入数据库
  • (转载)OpenStack Hacker养成指南
  • ./configure,make,make install的作用(转)
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • /var/spool/postfix/maildrop 下有大量文件
  • @JsonSerialize注解的使用