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、获取当前页面的url
await page.url();
Ejemplo de código:
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/爬虫电子书.txt
let 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();