要获取某站点评论数据,访问API后发现会返回登陆页面,即不登陆拿不到足够的信息。
因此打算使用puppeteer登陆获取cookie的方式解决问题。
遇到的问题有2个:
navigater.webdriver
网上教程多是使用
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined,
})
或者
const brower = await puppeteer.launch({
//config
ignoreDefaultArgs:['--enable-automation']
});
经验证都无法解决问题,//navigater.webdriver = true
后来看了最新的写法
await page.evaluateOnNewDocument(() => {
const newProto = navigator.__proto__;
delete newProto.webdriver;
navigator.__proto__ = newProto;
});
直接用evaluateOnNewDocument删除掉该属性可以解决问题
滑动验证
验证过navigater.webdriver后就基本没出现滑块了,但是前面试验的时候还是做了解决方案
//移动登陆容器到屏幕左侧,避免获取位置失败
let _block = await await page.$('#nc_1_n1z')
await page.evaluate(()=>{
let box = document.querySelector('.login-box-warp');
box.setAttribute('style','letf:1px;right:auto');
});
//获取目标位置
let track = await page.evaluate(()=>{
let step = 20;
let slider = document.querySelector('#nc_1__scale_text');
let block = document.querySelector('#nc_1_n1z');
let sBound = slider.getBoundingClientRect();
let bBound = block.getBoundingClientRect();
let track = [];
let xStart = parseFloat(sBound.x*1.0+bBound.width*0.5);
let xEnd = parseFloat(sBound.x*1.0+sBound.width*1.0);
let y = parseFloat(sBound.y*1.0+bBound.height*0.5);
let distance = (sBound.width*1.0)/(step-1);
track.push([xStart,y+1]);
for(let i = 0;i<step-2;i++){
track.push([xStart+i*distance,y]);
}
track.push([xEnd,y-2]);
return track;
});
//执行
for(let i =0;i<track.length;i++){
await page.mouse.move(...track[i]);
if(i==0){
await page.mouse.down();
}
else if(i==track.length){
await page.mouse.up();
}
}
效果如图
当时还没解决webdriver问题,所以即使处理了滑块,也还是会报错。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。