node puppeteer(headless chrome)实现网站登录


Posted in Javascript onMay 09, 2018

puppeteer简介

puppeteer是Chrome团队开发的一个node库,可以通过api来控制浏览器的行为,比如点击,跳转,刷新,在控制台执行js脚本等等。有了这个神器,写个爬虫,自动签到,网页截图,生成pdf,自动化测试什么的,都不在话下。

puppeteer的简单例子

代码来自官网:

const puppeteer = require('puppeteer');
 
(async () => {
 const browser = await puppeteer.launch();//打开浏览器
 const page = await browser.newPage();//打开一个空白页
 await page.goto('https://example.com');//在地址栏输入网址并等待加载
 await page.screenshot({path: 'example.png'});//截个图
 
 await browser.close();//关掉浏览器
})();

阅读上述代码,我们可以发现,1,代码中每一步都是异步操作,2,每一步操作都对应实际使用浏览器的一个行为。理解这两点对使用这个库有很大帮助。另外,比较常用的两个对象就是browser和page对象,对象上有一堆用来操作两个对象的方法。接下来,我们就写一个登录网站的小demo。

没有验证码的网站

对于没有验证码的网站,基本上就是输入账号,输入密码,点击登录这三步,需要用到page对象的两个方法:type用来在输入框中输入信息,click用来点击登录。下面以登录豆瓣为例来举个例子:

const puppeteer = require('puppeteer');
const account = `123456@qq.com`;
const password = `123456`;
(async () => {
 const browser = await puppeteer.launch();//打开浏览器
 const page = await browser.newPage();//打开一个空白页
 await page.goto('https://www.douban.com/');//打开豆瓣网站
 await page.type('#form_email', account);  
 await page.type('#form_password', password);
 await page.click('.bn-submit');
 await page.waitForNavigation({
  waitUntil: 'load'
 });//等待页面加载出来,等同于window.onload
 await page.screenshot({path: 'example.png'});//截个图
 await browser.close();//关掉浏览器
})();

有人说,我怎么知道到底有没有登录成功呢,一种调试的办法就是使用screenshot,如果你看到的是一个验证码页面,说明没有登录成功,还有一种办法像下面这样:

const browser = await puppeteer.launch({headless: false});//打开有界面的浏览器

传入headless:false后会真的打开一个浏览器的界面,这样你就可以实时看到代码执行到什么地方了。接下来我们说说碰到验证码时怎么办。

有验证码的网站

node puppeteer(headless chrome)实现网站登录

碰到有验证码的网站,可以将headless设成false,借助界面输入验证码,同时监听页面加载事件,实现登录,代码如下:

...

 await page.waitForNavigation({
  waitUntil: 'load'
 });//等待页面加载出来,等同于window.onload


//代码中监听跳转事件
if(page.url() === 'https://www.douban.com/accounts/login'){ 
   //登录不成功
  console.log('需要输入验证码');
  //等待再一次跳转
  while(true){
    await page.waitForNavigation({
      waitUntil: 'load'
    })
    console.log(page.url())
    if(page.url() === 'https://www.douban.com/'){
      console.log('登录成功');
      break;
    }
  }
 }

整体思路就是写也个循环,不断监听页面跳转,直到浏览器登录成功后跳转到首页为止。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
学习JavaScript的最佳方法分享
Oct 21 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
Nov 14 Javascript
jquery 字符串切割函数substring的用法说明
Feb 11 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
Mar 08 Javascript
使用bat打开多个cmd窗口执行gulp、node
Feb 17 Javascript
vue表单绑定实现多选框和下拉列表的实例
Aug 12 Javascript
vue.js计算属性computed用法实例分析
Jul 06 Javascript
使用jQuery给Table动态增加行、清空table的方法
Sep 05 jQuery
详解ES6 Fetch API HTTP请求实用指南
Nov 14 Javascript
微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件
Nov 16 Javascript
Vue-input框checkbox强制刷新问题
Apr 18 Javascript
vue集成kindeditor富文本的实现示例代码
Jun 07 Javascript
JS中移除非数字最多保留一位小数
May 09 #Javascript
JS关于刷新页面的相关总结
May 09 #Javascript
Vue引入jquery实现平滑滚动到指定位置
May 09 #jQuery
webstorm中vue语法的支持详解
May 09 #Javascript
JavaScript DOM元素常见操作详解【添加、删除、修改等】
May 09 #Javascript
Vue中使用vee-validate表单验证的方法
May 09 #Javascript
VeeValidate在vue项目里表单校验应用案例
May 09 #Javascript
You might like
第三节--定义一个类
2006/11/16 PHP
解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
2013/06/18 PHP
解析php防止form重复提交的方法
2013/07/01 PHP
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
php通过排列组合实现1到9数字相加都等于20的方法
2015/08/03 PHP
PHP简单判断手机设备的方法
2016/08/23 PHP
JavaScript 获取当前时间戳的代码
2010/08/05 Javascript
jQuery中:enabled选择器用法实例
2015/01/04 Javascript
JQuery插件jcarousellite的参数中文说明
2015/05/11 Javascript
JS实现具备延时功能的滑动门菜单效果
2015/09/17 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
2016/02/19 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
jQuery查找节点并获取节点属性的方法
2016/09/09 Javascript
10分钟掌握XML、JSON及其解析
2020/12/06 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
webpack 代码分离优化快速指北
2019/05/18 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
[00:59]PWL开团时刻DAY7——我在赶
2020/11/06 DOTA
python实现的守护进程(Daemon)用法实例
2015/06/02 Python
python解决网站的反爬虫策略总结
2016/10/26 Python
使用Python对MySQL数据操作
2017/04/06 Python
python数据抓取分析的示例代码(python + mongodb)
2017/12/25 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
使用Python画出小人发射爱心的代码
2019/11/23 Python
在Django中自定义filter并在template中的使用详解
2020/05/19 Python
Python调用OpenCV实现图像平滑代码实例
2020/06/19 Python
荷兰DOD药房中文官网:DeOnlineDrogist
2020/12/27 全球购物
linux面试题参考答案(6)
2014/08/29 面试题
无犯罪记录证明
2014/09/19 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
2014年扶贫帮困工作总结
2014/12/09 职场文书
2015年会计工作总结范文
2015/05/26 职场文书
2015年中秋节主持词
2015/07/30 职场文书
《七律·长征》教学反思
2016/02/16 职场文书
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python