1、因为下载资源是通过点击事件来ajax请求的,无法在页面看到a标签链接2、通过拦截器来拦截3、等待前端渲染完成后(类挂载后)获取数据await page.waitForSelector('选择器');4、监听请求事件是否完成page.on('requestfinished',function(req){console.log(req.url());xxx})5、在拦截器中,通过监听写入流是否关闭,来判断下载是否完成ws.on('close',function(){ws.end();console.log('下载完成');page.close();})6、获取已经打开的浏览器对象let arr=await broser.pages; 返回一个数组,包含已经打开的页面page=arr[2]; 改变page对象7、获取当前页面的urlawait page.url();

代码示例:

let puppeteer=require('puppeteer');
let axios =require('axios');
let Url=require('url');
let fs=require('fs');
let {fsRead,fsWrite}=require('./fsR.js');//C:/Users/10853/Desktop/爬虫电子书.txtlet http='https://sobooks.cc/';
async function run(){function wait(time){return new Promise(function(resolve,reject){setTimeout(function(){resolve('ok延迟')})},time)}let options={headless:false,slowMo:250,defaultViewport:{width:1000,height:800},//浏览器响应时间变成无限timeout:0}let browser=await puppeteer.launch(options);//获取文档存放的书籍链接等信息async function parseText(){let text=await fsRead('C:/Users/10853/Desktop/爬虫电子书.txt')//正则匹配let reg=/(.*?),(.*?)---/igs;let arr=[];while(end=reg.exec(text)){let bookTitle=end[1];let bookHref=end[2];let bookObj={title:bookTitle,href:bookHref}arr.push(bookObj);}return arr;}let arr=await parseText();let index=0;//根据链接信息去到下载页面async function downloadBook(){//根据索引值下载书if(index==arr.length){return 'ok'}let book=arr[index].href;index++;console.log(book);//打开页面下载书籍let page=await browser.newPage();await page.goto(book);//等待前端渲染完成后(类挂载后)获取数据await page.waitForSelector('#table_files tbody .even a');//获取页面a标签let eleA=await page.$('#table_files tbody .even a')//获取a链接href属性let eleAhref=await eleA.getProperty('href');eleAhref=eleAhref._remoteObject.value;bookLinkPage(eleAhref,arr[index].title);//关闭页面page.close();}downloadBook();//获取下载a链接async function bookLinkPage(linkUrl,title){//去掉换行符title=title.replace(/[\r\n]/g,'');let page= await browser.newPage();await page.goto(linkUrl);//获取下载按钮let btn=await page.$('.btn-outline-secondary:nth-child(3)')btn.click();//监听请求事件是否完成// page.on('requestfinished',function(req){//     console.log(req.url());// })//截取下载资源await page.setRequestInterception(true);//监听每一次请求,形参为请求对象page.on('request',(interceptedRequest)=>{//http://14804066.ch1.ctc.data.tv002.com/down///ite.url()获取请求url地址let urlObj=Url.parse(interceptedRequest.url());//如果是谷歌的广告if(urlObj.hostname=='14804066.ch1.ctc.data.tv002.com'){//拦截请求let ws=fs.createWriteStream('C:/Users/10853/Desktop/爬虫book/'+title+'.epub');interceptedRequest.abort();axios.get(urlObj.href,{responseType:'stream'}).then((res)=>{res.data.pipe(ws);ws.on('close',function(){ws.end();console.log(title+'下载完成');page.close();//递归调用下载downloadBook();})})}else{interceptedRequest.continue();}})}}run();

node 拦截器拦截请求下载电子书以及等待前端渲染操作、浏览器操作相关推荐

  1. 拦截器获取请求参数post_SpringBoot拦截器如何获取http请求参数

    1.1.获取http请求参数是一种刚需 我想有的小伙伴肯定有过获取http请求的需要,比如想 前置获取参数,统计请求数据 做服务的接口签名校验 敏感接口监控日志 敏感接口防重复提交 等等各式各样的场景 ...

  2. Aop做拦截器 获取请求头数据 修改请求数据拦截返回值修改返回值数据

    AOP 拦截器拦截请求头 修改请求参数 请求数据拦截 本页面 按住 ctrl 和 F 搜索 @Before("doPointcut()") 返回值数据拦截 本页面 按住 ctrl ...

  3. axios config里自定义属性,使用拦截器拦截,无法拿到自定义属性问题

    axios config里自定义属性,使用拦截器拦截,无法拿到自定义属性问题 最新版本axios限制了键,对键值做了白名单处理. 解决思路: 修改源码中的内容,添加一个键来报错额外属性. 或者:使用老 ...

  4. 在JSP中常见问题,防止SpringMVC拦截器拦截js等静态资源文件的解决方案

    在JSP中常见问题,防止SpringMVC拦截器拦截js等静态资源文件的解决方案 参考文章: (1)在JSP中常见问题,防止SpringMVC拦截器拦截js等静态资源文件的解决方案 (2)https: ...

  5. 【项目经验】拦截器拦截入参出参

    文章目录 拦截器拦截入参出参 入参 出参 拦截器拦截入参出参 入参 @Overridepublic boolean preHandle(HttpServletRequest request, Http ...

  6. spring拦截器 拦截和排除接口冲突

    以下为springboot案例: 场景:  某个规则下的绝大部分接口路径不需要经过拦截器, 但其中的某几个接口又需要经过拦截器. 例如: "/api/register/**" 模式 ...

  7. okhttp原理分析(持续更新),包含okio了解,拦截器以及断点下载的使用

    1. 原理 1. okio 最基本的接口只有两个:Sink(writer).Source(Read),大概相当于OutputStream和InputStream在原生接口中的地位.这两个接口中只定义了 ...

  8. vue拦截器及请求封装

    1.vue项目的src文件夹中创建request文件夹 (1)request文件夹中创建index.js (拦截器主要代码) /*** 请求封装*/import axios from 'axios'; ...

  9. 拦截器获取请求参数post_「SpringBoot WEB 系列」RestTemplate 之自定义请求头

    [WEB 系列]RestTemplate 之自定义请求头 上一篇介绍了 RestTemplate 的基本使用姿势,在文末提出了一些扩展的高级使用姿势,本篇将主要集中在如何携带自定义的请求头,如设置 U ...

最新文章

  1. Java学习总结:46(内存流)
  2. 三层交换机如何封装trunk_锐捷交换机常用配置命令汇总
  3. 北上广互联网创业者分布图!
  4. JESD204B的AXI4-Lite时序分析(对比SRIO的AXI4-Lite时序分析)
  5. VS2010 C++下编译调试MongoDB“.NET研究”源码
  6. 双向绑定v-bind
  7. 实例化vue之前赋值html元素导致事件失效
  8. 推荐一些可以将QQ截取的gif图片修改为循环播放的软件
  9. 赤峰中考计算机考试软件,2017赤峰中考信息技术与实验操作考试实施细则
  10. 【机器学习】CART决策树原理及python实现
  11. 09-10c语言试卷a,09C语言试卷A-B(试题).doc
  12. 可视化:小型有向网络HTML自动生成器
  13. 【环信IM集成指南】Web端常见问题整理
  14. layUIselect下拉菜单
  15. [机器学习] 深入理解 目标函数,损失函数和代价函数
  16. 我们终将泄露的人脸数据,后果到底有多可怕?
  17. 创新案例分享 | 临床研究数据信息互联互通,共创医疗新局面
  18. 将Java中的内容直接存储为二进制文件
  19. 卸载ncurses_Linux下程序库Ncurses显示中文乱码的解决方法
  20. AutoML-第二章-元学习

热门文章

  1. java微信多客服_怎么实现微信多公众号管理?有哪些多客服系统?
  2. 儿童定位手表、定位器、老人健康手表的工作原理
  3. ASUS AC88U 路由器开机自启方法
  4. Kuberneters企业级容器云平台落地实践之二
  5. 重学JavaWeb —— JSP,简单全面一发入魂
  6. 微信支付终于成功了(安卓,iOS),在此分享
  7. [转贴]一位营销总监的辞职信(非常经典)
  8. 实验八 Python文件处理
  9. 手Q游戏中心的个性化推荐实战 | CSDN博文精选
  10. 如何有效防止PHP木马对网站提权