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 24 Javascript
用js格式化金额可设置保留的小数位数
May 09 Javascript
js判断文本框输入的内容是否为数字
Dec 23 Javascript
使用pcs api往免费的百度网盘上传下载文件的方法
Mar 17 Javascript
使用ajaxfileupload.js实现上传文件功能
Aug 13 Javascript
AngularJS包括详解及示例代码
Aug 17 Javascript
详解Vue.js动态绑定class
Dec 20 Javascript
jQuery基本筛选选择器实例代码
Feb 06 Javascript
微信小程序 动态绑定数据及动态事件处理
Mar 14 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
Mar 08 Javascript
Angularjs 根据一个select的值去设置另一个select的值方法
Aug 13 Javascript
详解js删除数组中的指定元素
Oct 31 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
SONY ICF-SW7600的电路分析
2021/03/02 无线电
PHP批斗大会之缺失的异常详解
2019/07/09 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
关于实现代码语法标亮 dp.SyntaxHighlighter
2007/02/02 Javascript
Tab页界面,用jQuery及Ajax技术实现
2009/09/21 Javascript
5个最佳的Javascript日期处理类库分享
2012/04/15 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
2013/04/26 Javascript
Javascript中设置默认参数值示例
2014/09/11 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记6)
2015/12/20 Javascript
Angularjs中$http以post请求通过消息体传递参数的实现方法
2016/08/05 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
javascript十六进制数字和ASCII字符之间的转换方法
2016/12/27 Javascript
Angular的$http的ajax的请求操作(推荐)
2017/01/10 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
vue todo-list组件发布到npm上的方法
2018/04/04 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
2018/04/17 Javascript
vue双向数据绑定知识点总结
2018/04/18 Javascript
浅谈微信页面入口文件被缓存解决方案
2018/09/29 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
2020/08/10 Javascript
[10:28]2018DOTA2国际邀请赛寻真——VGJ.S寻梦之路
2018/08/15 DOTA
详解Python中表达式i += x与i = i + x是否等价
2017/02/08 Python
Django中使用haystack+whoosh实现搜索功能
2019/10/08 Python
Pandas聚合运算和分组运算的实现示例
2019/10/17 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
Python小整数对象池和字符串intern实例解析
2020/03/21 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
2021/01/24 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
艺术学院毕业生自我评价
2014/03/02 职场文书
技能比武方案
2014/05/21 职场文书
公司合作意向书范文
2014/07/30 职场文书
高中美术教师事迹材料
2014/08/22 职场文书
死亡赔偿协议书
2015/01/28 职场文书
关于幸福的感言
2015/08/03 职场文书
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS