前端爬虫框架-puppeteer的入门使用(1)

甲戌神展子江
• 阅读 6013

Puppeteer

前言

开始学习这门技术的起因是因为之前想要去做一个类似于人人影视的电影资源网站,因此想要通过学习爬虫获取到相关的电影资源以供自己下载使用。

之前了解爬虫大多数都是听到使用python来实现,而因为平时工作比较忙,也没太多时间去学习新的语言,于是自己就去网上搜索看有没有前端使用的爬虫框架。

而网上大多推荐的是node库--puppeteer

什么是Puppeteer?

Puppeteer 是一个node库,他提供了一组用来操纵Chrome的API, 通俗来说就是一个 headless chrome浏览器 (当然你也可以配置成有UI的,默认是没有的)。既然是浏览器,那么我们手工可以在浏览器上做的事情 Puppeteer 都能胜任,比如用户的鼠标,键盘操作等。

Puppeteer能做些什么?

1. 可以生成网页截图以及生成PDF
2. 爬虫(常用的)可以爬取到异步加载内容的网页(基本上都可以爬取到)
3. 模拟用户操作(如:键鼠操作,提交表单,打开/关闭/登录网页)
4. 实现UI自动化测试,以帮助分析网站的性能问题

运行环境及安装

因为在puppeteer,大部分都是异步操作,所以你在看各类文档的时候都能看到async和await这样的ES7的语法。
官方目前的要求是:

在puppeteerv1.18.1之前需要NODE版本至少是v6.4.0。
从v1.18.1到v2.1.0的NODE版本至少不低于v8.9.0。
从v3.0.0开始,NODE的版本至少不低于v10.18.1
而如果要使用async/await,NODE版本至少不低于v7.6.0

你使用最新的chrome driver,这个在你通过npm安装puppeteer的时候就会自动检查你本地的driver版本,然后自动下载最新的chrome driver

通过npm/cnpm/yarn安装puppeteer
npm install puppeteer --save
cnpm install puppeteer --save
yarn add puppeteer (使用yarn安装可能出现安装不上的问题)

简单使用(截图操作)

当你完成好puppeteer的安装后,我们就可以写一个简单的例子。开启我们的学习之路

demo1
// 1. 首先引入puppeteer
const puppeteer = require("puppeteer");

// 2. 启动puppeteer,启动浏览器引擎
puppeteer
  .launch({
    ignoreHTTPSErrors: true,
    headless: false,
    slowMo: 250,
    defaultViewport: {
      width: 1920,
      height: 1080,
    },
    timeout: 0,
  })
  .then(async (browser) => {
    // 3. 新建一个浏览器页面
    let newPage = await browser.newPage();
    // 4. 给这个页面设置跳转的URL
    await newPage.goto("https://www.chapaofan.com/");
    // 5. 给这个页面截图
    await newPage.screenshot({
      type: "jpeg",
      path: "../index.jpg",
      fullPage: true,
    });
    // 6. 关闭浏览器
    await browser.close();
  });
demo结果

前端爬虫框架-puppeteer的入门使用(1)
在项目的上一级目录已经截好了我们需要的图片
前端爬虫框架-puppeteer的入门使用(1)

代码解析(根据上面源码)

1. puppeteer.launch(options)

该方法用以启动chrome浏览器,它返回一个Promise,使用then方法获取browser实例,就可以对该浏览器进行操作

参数options(这里举一些常用参数):
(1) ignoreHTTPSErrors <Boolean>:是否在导航期间忽略HTTPS错误,默认为false;
(2) headless <Boolean>:是否在无头模式下运行浏览器,默认为true。这里的无头模式通俗讲就是有无浏览器界面出现(以UI形式展示操作)
(3) slowMo <Number>:将puppeteer操作减少指定的毫秒数,这样你就可以看清每个操作都做了什么,这个非常有用
(4) defaultViewport <Object>:
        width:页面展示的宽度,默认为800
        height:页面展示的高度,默认为600
(5) timeout:等待 Chrome 实例启动的最长时间。默认为30000(30秒)。如果传入 0 的话则不限制时间

2. browser.newPage()

该方法返回一个promise,用以返回一个新的Page对象在浏览器中创建新的页面

3. newPage.goto(url,options)

此方法给新建的页面在地址栏设置URL值,并跳转到相应的地址。

参数options:
(1) url <String>:导航到相应的地址,地址应该带有http或者是https的协议,例如:https://
(2) options:
        timeout <Number>:跳转的等待时间,单位是毫秒,默认为30秒,设置0表示无限等待直到通过
        {...restOPtions}

4. newPage.screenshot(options)

此方法返回Promise,resolve后是截图的buffer,用以在打开的页面上进行截图操作

参数options:
    (1) path <String>:截图的保存路径,截图图片类型将从文件拓展名推断出来。如果是相对路径,则从相对路径进行解析(这里推荐使用相对路径)。如果没有指定路径,图片将不会被保存到硬盘
    (2) type <String>:指定的截图类型,jpeg | png,默认为png
    (3) quality <Number>:图片质量,可选0-100,png格式下不可用
    (4) fullPage <Boolean>:如果设置为true,则截取完整的页面(包括需要滚动的部分),默认为false
    (5) clip <Object>:
            x <Number>:裁剪区域相对于左上角(0, 0)的x坐标
            y <Number>:裁剪区域相对于左上角(0, 0)的y坐标
            width <Number>:裁剪宽度
            height <Number>:裁剪高度
    (6) omitBackground <Boolean>:默认隐藏白色背景,背景透明(对png格式挺有用的)
    (7) encoding:图像编码可以使base64或binary,默认为“二进制”,图片编码格式的转换对图片的上传下载有很大的作用

5. borwser.close()

关闭 Chromium 及其所有页面(如果页面被打开的话)。Browser 对象本身被认为是处理过的并不能再被使用。除非你自己重新新建一个browser
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Scapy 从入门到放弃
0x00前言最近闲的没事,抽空了解下地表最强的嗅探和收发包的工具:scapy。scapy是一个python模块,使用简单,并且能灵活地构造各种数据包,是进行网络安全审计的好帮手。0x01安装因为2020年python官方便不再支持python2,所以使用python3安装。!(https://oscimg.oschina.net/os
Wesley13 Wesley13
3年前
Java爬虫之JSoup使用教程
title:Java爬虫之JSoup使用教程date:201812248:00:000800update:201812248:00:000800author:mecover:https://imgblog.csdnimg.cn/20181224144920712(https://www.oschin
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0