intercepta nodo interceptores la solicitud y esperar a que el libro electrónico operación de descarga de representación, el funcionamiento del navegador front-end

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();
Publicados 550 artículos originales · ganado elogios 3 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/weixin_43294560/article/details/104900324
Recomendado
Clasificación