众所周知,puppeteer是个爬虫利器,但是在遇到一些验证码很强大的网站时,你是不是在突破登录的限制的一步被弄得焦头烂额? 本文不会告诉你如何通过脚本突破验证码,而是提供一种另辟蹊径的方法。首先介绍下文本大题内容。本文提供的一个方案是先通过脚本启动浏览器,然后人工方式输入登录信息,然后再次通过脚本爬取页面内容。 用到的主要api分别是
browser.wsEndpoint()
puppeteer.connect()
复制代码
完整代码如下
// launch.js
const puppeteer=require('puppeteer');
const fs=require('fs');
const launchConfig={
headless:false
};
puppeteer.launch(launchConfig).then(browser=>{
const wsEPAddress=browser.wsEndpoint();
const w_data=new Buffer(wsEPAddress);
fs.writeFile(__dirname + '/wsa.txt', w_data, {flag: 'w+'}, function (err) {
if(err) {
console.error(err);
} else {
console.log('写入成功');
}
});
});
复制代码
// aciton.js
const puppeteer=require('puppeteer');
const fs=require('fs');
const getWSAddress=()=>new Promise(resolve => {
fs.readFile(__dirname + '/wsa.txt', {flag: 'r+', encoding: 'utf8'}, function (err, data) {
if(err) {
console.error(err);
return;
}
console.log(data);
resolve(data);
});
});
(async ()=>{
const wsa=await getWSAddress();
const browserConfig={
browserWSEndpoint :wsa
};
const browser= await puppeteer.connect(browserConfig);
const page=await browser.newPage();
// todo 你的脚本内容
})().catch(err=>{
console.log(err);
process.exit();
});
复制代码
代码简析,launch.js
主要负责启动浏览器,并记录浏览器的wsEndpoint地址,此处简单处理用fs直接写在本地目录(如果你有其他数据缓存方案,可以替代它);aciton.js
主要负责脚本任务,这个文件是用来写登录后的具体脚本命令的。 整体运行方案先node relativePathTo/launch.js
,手工在打开的浏览器完成登录操作,然后再node relativePathTo/aciton.js
完成具体脚本。注意,本文中两个文件是处在同一目录下的,因为用来传递browserWSEndpoint
的文件使用相对路径存放,如果想更改,也是可以的,但不是文章重点。 以上是一次使用puppeteer实践的记录~如果你有更好的方案实现,欢迎留言~