赞
踩
(1)拦截谷歌请求: (1)拦截谷歌请求,使用后会激活会激活 request.abort, request.continue 和 request.respond 方法。 await page.setRequestInterception(true); (2)监听request事件,对请求做出操作 一旦启用请求拦截,每个请求都将停止,除非它继续,响应或中止 page.on('request',回调函数(request形参,包含上述方法) 如拦截谷歌广告: //截取谷歌请求 await page.setRequestInterception(true); //监听每一次请求,形参为请求对象 page.on('request',(interceptedRequest)=>{ //ite.url()获取请求url地址 let urlObj=Url.parse(interceptedRequest.url()); //如果是谷歌的广告 if(urlObj.hostname=='googleads.g.doubleclick.net'或者urlObj.hostname.indexOf('google')!=-1){ //拦截请求 interceptedRequest.abort(); }else{ interceptedRequest.continue(); } }) (2)如果爬取时间超时导致失败: (1)通过延迟函数,将延迟时间增长 (2)使用page.setDefaultNavigationTimeout(0); 将浏览器响应时间改为无限长,默认为30秒 (3)在配置信息中设置,timeout=0; 效果和(2)一样 (3)获取资源后关闭页面,减小性能消耗 page.close(); (4)通过page.$/$$()返回的ElementHandle 获取元素属性 let xx=await page.$('选择器') let xxx=await xx.getProperty('属性'); let xxxx=xxx._remoteObject.value;
代码示例:
let puppeteer=require('puppeteer'); let axios =require('axios'); let Url=require('url'); let fs=require('fs'); 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 } } let browser=await puppeteer.launch(options); //获取所有页数 async function getAllNum(){ let page=await browser.newPage(); //截取谷歌广告请求 await page.setRequestInterception(true); //监听每一次请求,形参为请求对象 page.on('request',(interceptedRequest)=>{ //ite.url()获取请求url地址 let urlObj=Url.parse(interceptedRequest.url()); if(urlObj.hostname=='googleads.g.doubleclick.net'){ //拦截请求 interceptedRequest.abort(); }else{ interceptedRequest.continue(); } }) await page.goto(http); let pageNum=await page.$eval('.pagination li:last-child span',(ele)=>{ //获得页数 let num=ele.innerText.substring(2,length-2); return num.trim(); }) //返回内容后关掉当前页面,节省空间 page.close(); return pageNum; } let pageNum=await getAllNum(); //获取指定页的所有书籍链接 async function pageList(num){ let listUrl='https://sobooks.cc/page/'+num; let page=await browser.newPage(); //设置浏览器响应时间为无限制等待,默认为30秒 page.setDefaultNavigationTimeout(0); //截取谷歌请求 await page.setRequestInterception(true); //监听每一次请求,形参为请求对象 page.on('request',(interceptedRequest)=>{ //ite.url()获取请求url地址 let urlObj=Url.parse(interceptedRequest.url()); if(urlObj.hostname=='googleads.g.doubleclick.net'){ //拦截请求 interceptedRequest.abort(); }else{ interceptedRequest.continue(); } }) await page.goto(listUrl); let arr= await page.$$eval('.card .card-item .thumb-img>a',(ele)=>{ let arr=[]; ele.forEach(function(item,index){ let obj={ href:item.getAttribute('href'), title:item.getAttribute('title') }; arr.push(obj); }) // console.log(arr); return arr; }) //获取结束后关闭页面 page.close(); //遍历内容,去到书籍的详情页面,获取网盘链接 arr.forEach(async (item,index)=>{ //延迟函数,延迟打开 await wait(300*index); getPageInfo(item); }) } //根据书籍地址,去获取网盘链接 async function getPageInfo(pageObj){ let page=await browser.newPage(); //截取谷歌请求 await page.setRequestInterception(true); //监听每一次请求,形参为请求对象 page.on('request',(interceptedRequest)=>{ //ite.url()获取请求url地址 let urlObj=Url.parse(interceptedRequest.url()); if(urlObj.hostname=='googleads.g.doubleclick.net'){ //拦截请求 interceptedRequest.abort(); }else{ interceptedRequest.continue(); } }) await page.goto(pageObj.href); let eleA=await page.$('.dltable tr:nth-child(3) a:last-child') //page.$()方式,获取元素属性的方法 let url=await eleA.getProperty('href'); url=url._remoteObject.value; //解析地址,获取网盘链接 url=url.split('?url=')[1]+'\n'; let content={ title:pageObj.title, url:url } //存放地址 console.log(pageObj.title); fs.writeFile("C:/Users/10853/Desktop/爬虫电子书.txt",content.title+','+content.url,{flag:'a'},function(err){ console.log('ok'); }) } pageList(1); } run();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。