(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;
Code Example:
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();