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 相关文章推荐
模仿百度三维地图的js数据分享
May 12 Javascript
jquery模拟按下回车实现代码
Sep 20 Javascript
javascript获取元素CSS样式代码示例
Nov 28 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
May 18 Javascript
javascript设计模式之对象工厂函数与构造函数详解
Jul 30 Javascript
微信小程序 富文本转文本实例详解
Oct 24 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
Oct 29 Javascript
AngularJS自定义控件实例详解
Dec 13 Javascript
小程序开发实战:实现九宫格界面的导航的代码实现
Jan 19 Javascript
angular框架实现全选与单选chekbox的自定义
Jul 06 Javascript
vue使用canvas实现移动端手写签名
Sep 22 Javascript
vue.js+element 默认提示中英文操作
Nov 11 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
Syphon 虹吸式咖啡壶冲煮–拨动法
2021/03/03 冲泡冲煮
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
php获取后台Job管理的实现代码
2011/06/10 PHP
php 获取百度的热词数据的代码
2012/02/18 PHP
php分页函数完整实例代码
2014/09/22 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
2015/03/27 PHP
php可变长参数处理函数详解
2017/02/22 PHP
PHP CURL使用详解
2019/03/21 PHP
Javascript 类与静态类的实现
2010/04/01 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
最好用的Bootstrap fileinput.js文件上传组件
2016/12/12 Javascript
微信小程序开发入门基础教程
2017/04/19 Javascript
windows下vue-cli及webpack搭建安装环境
2017/04/25 Javascript
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
2018/02/06 Javascript
webpack4实现不同的导出类型
2019/04/09 Javascript
[29:59]完美世界DOTA2联赛PWL S3 Forest vs access 第二场 12.11
2020/12/13 DOTA
Python实现 多进程导入CSV数据到 MySQL
2017/02/26 Python
Python中动态创建类实例的方法
2017/03/24 Python
Python 通过pip安装Django详细介绍
2017/04/28 Python
Python中标准库OS的常用方法总结大全
2017/07/19 Python
pandas每次多Sheet写入文件的方法
2018/12/10 Python
Python GUI编程完整示例
2019/04/04 Python
python实现五子棋人机对战游戏
2020/03/25 Python
Python 如何提高元组的可读性
2019/08/26 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
2019/09/23 Python
python中urllib.request和requests的使用及区别详解
2020/05/05 Python
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
年度献血先进个人事迹材料
2014/02/14 职场文书
搞笑的获奖感言
2014/08/16 职场文书
2014年英语教师工作总结
2014/12/03 职场文书
2014年便民服务中心工作总结
2014/12/20 职场文书
酒店厨房管理制度
2015/08/06 职场文书
志愿者工作心得体会
2016/01/15 职场文书
tensorflow中的数据类型dtype用法说明
2021/05/26 Python
Python一些基本的图像操作和处理总结
2021/06/23 Python
使用CSS实现六边形的图片效果
2022/08/05 HTML / CSS