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 相关文章推荐
制作特殊字的脚本
Jun 26 Javascript
Array.slice()与Array.splice()的返回值类型
Oct 09 Javascript
jquery 实现窗口的最大化不论什么情况
Sep 03 Javascript
Knockout数组(observable)使用详解示例
Nov 15 Javascript
a标签click和href执行顺序探讨
Jun 23 Javascript
基于javascript实现右下角浮动广告效果
Jan 08 Javascript
利用JS实现简单的瀑布流加载图片效果
Apr 22 Javascript
JS正则表达式验证中文字符
May 08 Javascript
w3c编程挑战_初级脚本算法实战篇
Jun 23 Javascript
基于JavaScript实现一个简单的Vue
Sep 26 Javascript
使用 UniApp 实现小程序的微信登录功能
Jun 09 Javascript
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
Nov 18 Vue.js
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
php入门学习知识点一 PHP与MYSql连接与查询
2011/07/14 PHP
PHP高级对象构建 工厂模式的使用
2012/02/05 PHP
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
2015/10/21 PHP
PHP编写daemon process详解及实例代码
2016/09/30 PHP
解析jQuery与其它js(Prototype)库兼容共存
2013/07/04 Javascript
图片动画横条广告带上下滚动可自定义图片、链接等等
2013/10/20 Javascript
jQuery进行组件开发完整实例
2015/12/15 Javascript
AngularJS基础 ng-non-bindable 指令详细介绍
2016/08/02 Javascript
jQuery实现页面顶部下拉广告
2016/12/30 Javascript
微信小程序技巧之show内容展示,上传文件编码问题
2017/01/23 Javascript
javascript常用的设计模式
2017/02/09 Javascript
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
angular动态表单制作
2018/02/23 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
使用ESLint禁止项目导入特定模块的方法步骤
2019/03/04 Javascript
关于Vue中axios的封装实例详解
2019/10/20 Javascript
原生js+canvas实现贪吃蛇效果
2020/08/02 Javascript
详解flask入门模板引擎
2018/07/18 Python
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
2020/04/10 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
通过代码简单了解django model序列化作用
2020/11/12 Python
机电专业个人自荐信格式模板
2013/09/23 职场文书
毕业生机械建模求职信
2013/10/14 职场文书
市场营销专业个人求职信范文
2013/12/14 职场文书
幼儿园中班新学期寄语
2014/01/18 职场文书
学生打架检讨书大全
2014/01/23 职场文书
妇女儿童发展规划实施方案
2014/03/16 职场文书
《苏珊的帽子》教学反思
2014/04/07 职场文书
同居协议书范本
2014/04/23 职场文书
个人主要事迹材料
2014/08/26 职场文书
安全员岗位职责范本
2015/04/11 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书
CSS3新特性详解(五):多列columns column-count和flex布局
2021/04/30 HTML / CSS
python异常中else的实例用法
2021/06/15 Python