用Puppeteer实现一个自动化机器人

目录

  • 简介

    为铜官等地区用户提供了全套网页设计制作服务,及铜官网站建设行业解决方案。主营业务为网站建设、网站制作、铜官网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

  • Selenium vs Puppeteer

  • 安装

  • 一个简单的例子

  • 解释代码

  • 把项目容器化

  • 容器打包时的一些坑

    • 1. Puppeteer 安装 Chromium 时会缺少一些组件

    • 2. 页面焦点问题

    • 3. Page Crash 问题

    • 4. 时区问题

Puppeteer 是 Node.js 的一个函数库,可用来操控浏览器,是 Google 的项目,可以应用的范围包括:前端的自动化测试、爬虫、表单提交等。

Selenium vs Puppeteer

之前有过用 Python 配合 Selenium 的经验,不过如果是做爬虫、自动化操作用 Puppeteer 还是非常方便的,安装简单快速,API 也容易使用。美中不足的是它只支持 Chromium 以下是两者的比较,仅供参考:

由于 Puppeteer 是用 Node.js 写的,所以必须要先安装 Node。

  1. 可以至官网 下载

  2. 如果用 mac 可以使用  https://nodejs.org/en/

安装完后可以在 terminal 输入 node -v 检查是否安装成功

然后到要开发的项目路径下输入 npm init -y 初始化项目,接着 npm i puppeteer ,安装的时候会发现它会连同 Chromium 一同安装。

安装成功后就可以开始了。

一个简单的例子

新增一个文件 main.js ,并复制以下代码:

 
 
 
 
  1. const puppeteer = require('puppeteer'); 
  2.  
  3. (async () => { 
  4.  
  5.   // 开启 browser 
  6.   const browser = await puppeteer.launch({ 
  7.         headless: false 
  8.   }); 
  9.   // 新增分页 
  10.   const page = await browser.newPage(); 
  11.   // 到自己的博客网站 
  12.   await page.goto(`https://www.myblog.com/`); 
  13.   // 等待订阅按钮出现 
  14.   await page.waitForSelector("button[class='subscribe-button pill-button']"); 
  15.   // 点击订阅按钮 
  16.   await page.click("button[class='subscribe-button pill-button']"); 
  17. })(); 

接着到终端下输入 node main.js 执行。

解释代码

前面的代码先引入 Puppeteer,以便后续使用,接下来可以看到用 async 以及 () => , async 表示函数要用到异步操作, () => 则是 JS 的箭头函数。

 
 
 
 
  1. const puppeteer = require('puppeteer'); 

接下来是用 Puppeteer 打开一个浏览器 ( Chromium ),其中可以看到我们设了参数 headless : false ,如果是设定为 true ,会开启没有界面的无头浏览器,如果设定 false ,就会开一个浏览器窗口。

 
 
 
 
  1. const browser = await puppeteer.launch({ 
  2.     headless: false 
  3. }); 

这段就很简单了,它会帮你在浏览器开一个新的分页。

 
 
 
 
  1. const page = await browser.newPage(); 

这段也很容易,看到 goto 就可以猜到会帮你导向后方指定的网址。

 
 
 
 
  1. await page.goto(`https://b123105.blogspot.com/`); 

最后这段代码用到了 click 这个方法,它能够帮你点击后面指定的元素,可以看到我是指定 class = subscribe-button pill-button 的