前端爬虫Puppeteer 介绍

更新日期: 2024-02-29阅读: 206标签: 爬虫

前言

最近在研究前端爬虫,刚好看到Puppeteer,就想着分享给大家,于是有了这篇。


爬虫(web crawler/web scraping)

爬虫主要的目标是自动地做些什么事情,包含资料搜集、测试、执行任务…等等,借此提高工作效率。

网路爬虫的主要优势和需求主要体现在以下几个方面:

  • 自动化测试(automated testing)
    • 模拟使用者操作、提交表单等
    • 可以为应用程式开发、软体测试和网站管理等提供重要的支援
    • 减少人力成本,建立工作模式(SOP)。
  • 资料收集(data collecting)
    • 缩短了手动收集和处理资讯的时间,提升了工作效率
    • 可以对资讯进行解析,并且有结构性的储存,便于后续的使用或分析
  • 自动化执行任务(automated tasks)
    • 包含以上内容。

在使用过程中也需要注意尊重网站拥有者的权益,遵守机器人排除协定(Robots Exclusion Protocol)和各种相关法规,避免对被爬取的网站造成不必要的负担或侵犯。


爬虫套件的比较差异

常见的网页爬虫套件这三个套件(Puppeteer、Cheerio 和Selenium)在前端爬虫中扮演不同的角色,各自有其优缺点和特点。

Puppeteer

  • 优点:
    • 提供了完整的浏览器控制能力,可模拟使用者的操作浏览器行为,支援JavaScript、htmlcss 的渲染和交互。
    • 可以用来进行网页自动化能力,包括页面导航、表单填写、截图、PDF 生成等工作。
    • 具有丰富的API 可以直接操作网页上的元素和事件。
    • Puppeteer 是一个由Google 开发的Node.js 库,专门用于Chrome 浏览器的控制和操作。
    • Puppeteer 使用真实的浏览器进行操作,因此能够处理JavaScript 渲染的页面,适用于单页应用程序(SPA)和动态网站的爬取。
    • 可以模拟用户交互,使其在网站上执行各种操作,如点击、滚动等。
  • 缺点:
    • 需要较多的系统资源,因为它启动了一个完整的浏览器进程用于模拟了完整的浏览器,。
    • 相对于其他轻量级的爬虫工具,Puppeteer 比较慢且耗时。
    • 如果只是需要解析静态网页内容,可能显得过于庞大。
    • 需要更多的学习成本,因为它使用了一套复杂的API。

Cheerio

  • 优点:
    • 非常轻量级,适用于解析静态HTML 内容。
    • 语法简单易懂,使用jquery 风格的API,方便选择、操作和提取dom 元素。
    • 适合处理大量数据,效率较高。
    • Cheerio 是一个基于Node.js 的HTML 解析库,用于解析和操作HTML 文档。它非常适静态网页的爬取,尤其是当你只需要从页面中提取数据而不需要进行交互时。
    • 轻量级且简单易用,适合快速开发小型爬虫。
  • 缺点:
    • Cheerio 只能处理静态内容,无法执行JavaScript,因此无法处理需要JavaScript 动态生成的内容。
    • 不支援浏览器渲染,无法模拟浏览器行为。
    • Cheerio 无法处理JavaScript 渲染的页面,因此对于SPA 和动态网站可能不太适用。
    • 不能模拟用户交互,无法执行类似点击和提交表单的操作。

Selenium

  • 优点:
    • 跨平台性强,支援多种浏览器(Chrome、Firefox 等)。
    • 可以模拟人工操作,支援JavaScript 执行。
    • 可以用多种语言进行控制,如Python、Java、JavaScript 等。
    • Selenium 是一个跨浏览器的自动化测试工具,可以模拟用户在浏览器中的操作。它支持多种编程语言,并且可以用于爬取需要用户交互的网站。
    • 能够处理JavaScript 渲染的页面,适用于SPA 和动态网站。
  • 缺点:
    • 相较于Puppeteer,Selenium 在性能和速度上可能稍微较慢。
    • 安装和配置有一定复杂度,需要下载驱动器以及设定环境变数等。
    • Selenium 需要下载和配置浏览器驱动程序,而且通常比其他两种库更慢,因为它模拟了真实的浏览器行为。
    • 对于简单的静态网页爬取任务,Selenium 可能会显得过于复杂。

结论:

  • 如果你需要模拟完整的浏览器行为且操作较多互动性的内容,Puppeteer 和Selenium 可能更适合你。
  • 如果你只需要简单地解析静态HTML 页面,Cheerio 是一个轻量级的选择。
  • 每个套件都有其独特的优势和限制,根据你的具体需求选择合适的工具。


Puppeteer 介绍

Puppeteer 是由Google 开发的Node.js 函式库,提供方便的API 来进行网页测试、屏幕截图和网页爬虫等应用,但仅限于使用Chromium 浏览器引擎的浏览器,例如:Google Chrome 或Microsoft Edge。

  • Chromium 浏览器!== Chrome 浏览器
    • Chromium是一个由Google 主导的开源浏览器项目,它提供了一个开放的、可自由使用的浏览器引擎,供开发人员使用。
    • Chromium 虽然和Chrome 九成像,但它其实是Chrome, Edge 的基础版本。
    • Chromium 提供了Chrome 的基本架构和核心功能,而Chrome 在这个基础上增加功能,成为一个提供给使用者的完整产品。
    • Chromium 就像是汽车引擎,而Chrome 就像是整台汽车
  • Puppeteer 的许多用途包括:
    • 产生页面的截图和PDF
    • 爬取SPA(单一页面应用程式)并产生预渲染内容(即"SSR"(伺服器端渲染))
    • UI 自动化测试,模拟表单提交,键盘输入,点击等行为
    • 建立一个最新的自动化测试环境。
      • 使用最新的JavaScript 和最新的Chrome 浏览器执行测试案例
    • 捕获网站的timeline trace(时间轴跟踪),用来帮助分析效能问题
    • 测试Chrome 扩充功能

Puppeteer 预设是以headless(无头)模式运行。headless 模式是指在爬虫过程中不显示浏览器视窗画面,虽然看不到画面但仍然会执行画面的渲染过程,也就是说HTML 的解析、CSS 的套用和JavaScript 都会正常执行,这样才能确保画面内容是正确且完整的。

因为无头模式少了显示结果的处理不会做屏幕绘制,所以相较于有头模式,更能节省资源;但是在开发上有头模式会方便许多,因为浏览器会将渲染好的页面展示出来,包含了:

  • 处理用户的交互
  • 应用动画效果
  • 重新绘制页面元素
  • 任何有关图像输出至浏览器的过程…等

无论在无头模式或有头模式下,一定要做关闭浏览器的动作,无头模式虽然看不到浏览器画面,实际上背景仍然会有一个浏览器真的在跑。所以如果爬虫完没有确实地关闭浏览器,那么整个程式就仍然还在运行中,需要手动Ctrl + C 停止执行。在写脚本的时候,一定要记得在结束或是发生错误的地方把浏览器关闭,才能好好地释放资源。

如果希望变更为一般模式,可以藉由设定选项变更为有头模式,如下:

// 一般模式(有頭模式)
const browser = await puppeteer.launch({
  headless: false,
});

// 無頭模式(Puputeer 預設模式)
const browser = await puppeteer.launch({
  headless: 'new',
});

// 關閉瀏覽器
browser.Close()


Puppeteer 安装

Puppeteer 会下载最新版本的Chromium(~170MB Mac,~282MB Linux,~280MB Win),以保证可以使用API。

# 使用 npm
npm i puppeteer
# 使用 yarn
yarn add puppeteer

puppeteer-core

# 使用npm
npm i puppeteer-core
# 使用yarn
yarn add puppeteer-core

自1.7.0 版本以来,官方维护团队都会发布一个puppeteer-core 函式库,是一个的轻量级的Puppeteer 版本,用于启动现有浏览器安装或连接到远程安装。


Puppeteer程式码语法

起手式

const puppeteer = require("puppeteer");

(async () => {
  // 啟動瀏覽器並開啟一個新的空白頁面
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // 將頁面導航至 URL
  await page.goto("https://developer.chrome.com/");

	// 關閉
  await page.close();
  await browser.close();
})();

常用语法

const puppeteer = require("puppeteer");

(async () => {
  // 啟動瀏覽器並開啟一個新的空白頁面
  const browser = await puppeteer.launch({
    headless: false,
    defaultViewport: { width: 1400, height: 900 },
  });
  const page = await browser.newPage();

  // 前往指定 URL
  await page.goto("https://developer.chrome.com/");

  // 設定瀏覽器尺寸
  await page.setViewport({ width: 1080, height: 1024 });

  // 在欄位,輸入文字 "js-text"
  await page.type(".devsite-search-field", "js-text");
  // 操控鍵盤 "Enter"
  await page.keyboard.press("Enter");

  // 等待元素,出現在頁面中
  const searchResultSelector = "a.gs-title";
  await page.waitForSelector(searchResultSelector);

  // 點擊元素
  await page.click(searchResultSelector);

  const textSelector = await page.waitForSelector(".devsite-page-title");
  // 在瀏覽器執行 JavaScript,取得元素資訊
  const fullTitle = await textSelector?.evaluate((el) => el.textContent);

  // 取得頁面尺寸資訊
  const dimensions = await page.evaluate(() => {
    return {
      width: document.documentElement.clientWidth,
      height: document.documentElement.clientHeight,
      deviceScaleFactor: window.devicePixelRatio,
    };
  });

  // 列印結果
  console.log('The title of this blog post is "%s".', fullTitle);
  console.log("Dimensions:", dimensions);

  // 畫面截圖
  await page.screenshot({ path: "example.png" });

  await page.goBack(); // 回到上一頁
  await page.goForward(); // 前往下一頁
  await page.reload(); // 重新整理
  await page.close();
  await browser.close();
})();

链接: https://www.fly63.com/article/detial/12672

web爬虫抓取技术的门道,对于网络爬虫技术的攻与防

从爬虫的攻防角度来讲,最简单的爬虫,是几乎所有服务端、客户端编程语言都支持的http请求,只要向目标页面的url发起一个http get请求,即可获得到浏览器加载这个页面时的完整html文档,这被我们称之为“同步页”。

大话爬虫的实践技巧

数据收集的一种是方式是通过上报API进行自身平台用户交互情况的捕获,还有一种手段是通过开发爬虫程序,爬取竞品平台的数据,后面就重点说下爬虫的应用场景和实践中会遇到的问题和反反爬虫的一些套路与技巧。

网络爬虫_基于各种语言的开源网络爬虫总汇

网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。是互联网爬虫,蜘蛛,数据采集器,网页解析器的汇总,下面介绍各语言实现网络爬虫的开源框架

爬虫最终杀手锏 --- PhantomJS 详解(附案例)

PhantomJS无界面的浏览器:认识PhantomJS、网站模拟登录豆瓣网、动态页面模拟点击(unittest -python测试模块)、执行JavaScript代码、模拟最新无界面浏览器...

什么是网络爬虫,网络爬虫有什么用?

网络爬虫在数据采集方面有好的优势,比如采集速度快,比人来操作可能要快一千倍一万倍都不止;方便将获取的数据进行相关的清洗加工以及储存工作;代码可重复使用,或者说是一劳永逸。

爬虫解决网页重定向问题

每个网站主页是网站资源的入口,当重定向发生在网站主页时,如果不能正确处理就很有可能会错失这整个网站的内容。 笔者编写的爬虫在爬取网页时遇到了三种重定向的情况。

爬虫 解决网页ip限制的问题的八种方法

之前由于公司项目需要,采集过google地图数据,还有一些大型网站数据。 有小部分网站的防范措施比较弱,可以伪装下IP,修改X-Forwarded-for(貌似这么拼。。。)即可绕过。ser agent 伪装和轮换 ,使用代理 ip 和轮换

到百度云加速,网页内容爬不到的快速解决

在爬网站时,发现网站做了百度云加速,每次访问首页时要求输入验证码,才能打开网站首页。经过分析网站,发现如果你拿到一个当期可用的Cooikes后,你就可以一直爬数据,且并不会触发百度验证输入

反爬经验与理论基础

完整的反爬体系有三大部分工作要做:感知识别、策略分析、监控封禁。数据支撑:爬虫指纹、设备指纹、风险UA、IP库等,不同端指纹的mapping等。

node.js主从分布式爬虫

node.js是一款基于google的V8引擎开发javascript运行环境。在高性能的V8引擎以及事件驱动的单线程异步非阻塞运行模型的支持下,node.js实现的web服务可以在没有Nginx的http服务器做反向代理的情况下实现很高的业务并发量。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!