要获取某站点评论数据,访问API后发现会返回登陆页面,即不登陆拿不到足够的信息。
因此打算使用puppeteer登陆获取cookie的方式解决问题。
遇到的问题有2个:
navigater.webdriver
网上教程多是使用
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined,
})
或者
const brower = await puppeteer.launch({
//config
ignoreDefaultArgs:['--enable-automation']
});
【javascript|puppeteer 登陆处理】经验证都无法解决问题,//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
效果如图
文章图片
当时还没解决webdriver问题,所以即使处理了滑块,也还是会报错。
推荐阅读
- 前端|瞎几把总结一波
- 前端_面试
- 距离年底还有多少天(前端猴子的自我警示)
- javascript|vue-cli3 使用子目录部署问题
- 一个setTimeout问题小探索
- java系列|Vue —— axios、插槽
- 明道云在网络服务行业中的应用场景
- Vue技术|关于Vue你不知道的那点事儿,Vue知识总结大全,让你彻底搞懂Vue
- javascript|事件循环、宏任务与微任务、Promise与 Async/Await以及常见面试题