puppeteer 解决服务器认证的方法
- 问题描述:
- 问题分析:
- 解决方法:
- 总结
问题描述:
当使用 goto
函数去登录路由器时,会一直提示错误,原因是登录超时。
原本以为 goto
之后,再用键盘操作就可以登录进去,但根本就没有登录进去,所以所有针对page的操作,都是无效的。
问题分析:
一直拿不到页面,就一直无法进行下一步操作,首先分析是应该在goto
之前定义好,否则是永远无法登录的。
解决方法:
先打开 wireshark 抓包软件去抓包,看浏览器到底向服务器发送了什么:
抓包结果是在http报文中,有一个认证,我们用puppeteer给服务器发请求时,时没有发过去的。所以应该有一个函数可以为http请求,添加这段认证报文。
我们去puppeteer函数库里面找一下是否有这个函数。
找到了这个认证,确实是可以提供,于是修改代码,可以正常登录,获取page了。具体代码如下:
const puppeteer = require('puppeteer')const sleep = time => new Promise(resolve => {
setTimeout(resolve, time);
});(async ()=>{
const browser = await puppeteer.launch({
'headless':false,'slowMo': 250,}).catch(()=>{
console.log('wrong in creating browser')})const page = await browser.newPage()await page.authenticate({
'username':'admin','password':'admin1234'})await page.goto('http://222.111.111.61/home.asp').catch(()=>{
console.log('wrong in goto the web')})await sleep(5000)await browser.close()
})()
总结
爬虫无非是模拟人去控制浏览器,浏览器也不过是一个发送和解析报文的工具,如果遇到问题,首先尝试抓报文看看,或许就有思路了。