puppeteer中如何复用启动中的浏览器

众所周知,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实践的记录~如果你有更好的方案实现,欢迎留言~

转载于:https://juejin.im/post/5c613fe7e51d45098b607724

你可能感兴趣的:(puppeteer中如何复用启动中的浏览器)