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 相关文章推荐
基于jquery的$.ajax async使用
Oct 19 Javascript
IE与Firefox在JavaScript上的7个不同句法分享
Oct 30 Javascript
JQuery的$和其它JS发生冲突的快速解决方法
Jan 24 Javascript
AngularJS基础知识
Dec 21 Javascript
Javascript中this关键字的一些小知识
Mar 15 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
Nov 23 Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
Feb 15 Javascript
微信小程序 解析网页内容详解及实例
Feb 22 Javascript
jQuery实现标签子元素的添加和赋值方法
Feb 24 jQuery
vue.js实现会动的简历(包含底部导航功能,编辑功能)
Apr 08 Javascript
VUE 实现element upload上传图片到阿里云
Aug 12 Javascript
Javascript中Microtask和Macrotask鲜为人知的知识点
Apr 02 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
PHP中new static() 和 new self() 的区别介绍
2015/01/09 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
2015/12/30 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
thinkphp查询,3.X 5.0方法(亲试可行)
2017/06/17 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
PHP写API输出的时用echo的原因详解
2019/04/28 PHP
Yii框架通过请求组件处理get,post请求的方法分析
2019/09/03 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
2019/10/30 PHP
js验证表单大全
2006/11/25 Javascript
Mootools 1.2教程 排序类和方法简介
2009/09/15 Javascript
js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差别介绍
2012/05/16 Javascript
各种常用的JS函数整理
2013/10/25 Javascript
js离开或刷新页面检测(且兼容FF,IE,Chrome)
2014/03/05 Javascript
基于jQuery实现的图片切换焦点图整理
2014/12/07 Javascript
详解微信小程序开发之——wx.showToast(OBJECT)的使用
2017/01/18 Javascript
Angular简单验证功能示例
2017/12/22 Javascript
分享ES6的7个实用技巧
2018/01/18 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
2018/02/21 Javascript
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
2018/11/29 Javascript
javascript中undefined的本质解析
2019/07/31 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
微信小程序 this.triggerEvent()的具体使用
2019/12/10 Javascript
浅谈Vue 函数式组件的使用技巧
2020/06/16 Javascript
关于不懂Chromedriver如何配置环境变量问题解决方法
2019/06/12 Python
如何基于windows实现python定时爬虫
2020/05/01 Python
提高python代码运行效率的一些建议
2020/09/29 Python
Python中常用的os操作汇总
2020/11/05 Python
纯CSS3实现3D旋转书本效果
2016/03/21 HTML / CSS
正规的求职信范文分享
2013/12/11 职场文书
会计辞职信范文
2014/01/15 职场文书
酒吧创业计划书
2014/01/18 职场文书
商超业务员岗位职责
2014/03/12 职场文书
工作年限证明模板
2015/06/15 职场文书
漫画「请问您今天要来点兔子吗?」最新杂志彩页公开
2022/03/24 日漫