問題描述:
當使用 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()
})()
總結
爬蟲無非是模擬人去控制瀏覽器,瀏覽器也不過是一個發送和解析報文的工具,如果遇到問題,首先嚐試抓報文看看,或許就有思路了。