在 Docker 中部署无头 Chrome:在 Browserless 中运行

news/2024/9/19 7:32:46 标签: docker, chrome, 容器

什么是 Browserless?

Browserless 是一款基于云的浏览器解决方案,旨在实现高效的浏览器自动化、网页抓取和测试。

它利用 Nstbrowser 的指纹库,实现随机指纹切换,确保流畅的数据收集和自动化。得益于其强大的云基础设施,Browserless 简化了对多个浏览器实例的访问,从而更轻松地管理自动化任务。

您对网页抓取和 Browserless 有什么奇思妙想和疑问吗?
让我们看看其他开发者在 Discord 和 Telegram 上分享了什么!

Browserless 如何运作?

Browserless 通过提供一个无头浏览器服务来运作,允许用户在无需图形界面的情况下执行浏览器自动化任务。

它使开发者能够通过 API 运行基于浏览器的任务,例如网页抓取、自动化测试和渲染网页。通过在云环境中运行,Browserless 简化了浏览器自动化过程,无需手动设置或维护浏览器基础设施。

Browserless 支持 Puppeteer 和 Playwright 等流行库,允许用户以编程方式与网站交互。其基于 Docker 的基础设施支持可扩展和灵活的部署,使其适用于小型和企业级应用程序。它可以集成到工作流程中,以自动化重复性任务或从需要浏览器的网站收集数据。

如何在 Docker 中部署 Headlesschrome

第 1 步:获取您的 API 密钥

为了获得更好的体验,请在 Nstbrowser 上创建一个新帐户。

使用您注册的信息登录 Nstbrowser 客户端。成功登录后,不要忘记从 API 菜单中生成您的唯一 API 密钥!

API 密钥

第 2 步:获取 Nstbrowserless 镜像并运行

您需要获取 API Key 并替换以下 {YOUR_API_KEY} 部分。

docker run -it -e TOKEN={YOUR_API_KEY} -e SERVER_PORT=8848 -p 8848:8848 --name nstbrowserless nstbrowser/browserless:0.0.1-beta

用您的 API 密钥替换

如何在 Docker 容器中使用 Browserless?

您可以通过 Puppeteer、Playwright、Chromedp 或其他 CDP 库连接到无头浏览器,以实现无头浏览器的操作和截图功能。

Puppeteer

Puppeteer 是一个 Node.js 库,它提供了一个高级 API 来控制 Chrome 浏览器,并支持通过 DevTools 协议进行操作。

安装 Puppeteer

npm install puppeteer

准备 puppeteer.js 文件

const puppeteer = require("puppeteer");

(async () => {
  const host = "127.0.0.1:8848"; // 替换为您的 Docker 容器 IP
  const browserWSEndpoint = `ws://${host}/ws/connect`;
  
  try {
    const browser = await puppeteer.connect({
      browserWSEndpoint: browserWSEndpoint,
    });
    
    const page = await browser.newPage();
    await page.goto("https://google.com", { waitUntil: 'networkidle2' }); // 等待网络空闲
    await page.screenshot({ path: "screenshot.png", fullPage: true }); // 拍摄全页面截图

    console.log("Screenshot taken and saved as screenshot.png");
    
    await browser.close(); // 关闭浏览器连接
  } catch (err) {
    console.error("Error occurred:", err);
  }
})();

运行您的脚本

node puppeteer.js

运行后,您可以看到无头浏览器按我们预期工作:

无头浏览器工作

现在,项目已完成,您可以找出生成的 screenshot.png

Playwright CDP

Playwright 是一个用于 Web 测试和自动化的框架,允许通过单个 API 测试 Chrome 浏览器。

安装 Playwright

npm install playwright

准备 playwright.js 文件

import { chromium } from "playwright";

(async () => {
  const host = "127.0.0.1:8848"; // 替换为您的 Docker 容器 IP
  const browserWSEndpoint = `ws://${host}/ws/connect`;
  
  try {
    const browser = await chromium.connectOverCDP(browserWSEndpoint);
    const context = await browser.newContext();
    const page = await context.newPage();
    
    await page.goto("https://www.google.com/", { waitUntil: 'networkidle' }); // 等待网络空闲
    await page.screenshot({ path: "screenshot.png" }); // 拍摄全页面截图

    console.log("Screenshot taken and saved as screenshot.png");
    
    await browser.close(); // 关闭浏览器连接
  } catch (err) {
    console.error("Error occurred:", err);
  }
})();

运行您的脚本

node playwright.js

与 Puppeteer 相同,运行后,您也可以找出生成的 screenshot.png

总结

Browserless 使网页抓取和自动化变得容易。在本博客中,您可以看到:

  • 在 Docker 中部署 headlesschrome 的有效方法。
  • 在 Docker 容器中使用 Browserless 的详细步骤。
    容器中运行浏览器提供了很大的灵活性和可扩展性。它也比传统的基于 VM 的实例便宜得多。

http://www.niftyadmin.cn/n/5665215.html

相关文章

一键文本提示实现图像对象高质量剪切与透明背景生成

按照提示词裁剪 按照边框裁剪 要实现您描述的功能,即通过一个文本提示就能自动从图片中切割出指定的对象并生成一个带有透明背景的新图像,这需要一个结合了先进的计算机视觉技术和自然语言处理能力的系统。这样的系统可以理解输入的文本指令,并将其转化为对图像内容的精确分…

LeeCode打卡第二十八天

LeeCode打卡第二十八天 第一题:路径总和II(LeeCode第437题): 给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始,也…

计算机网络第二章:作业 1: Web 服务器

文档:Web服务器的实现和测试 一、问题描述 本次实验要求开发一个简单的基于Python的Web服务器,服务器能够处理HTTP请求并返回HTML文件的内容。具体来说,Web服务器需要执行以下操作: 接收并解析HTTP请求:Web服务器从…

XXl-SSO分布式单点登录框架

概述 下载地址:https://gitee.com/xuxueli0323/xxl-sso 文档地址:https://www.xuxueli.com/xxl-sso/ 概述 XXL-SSO 是一个分布式单点登录框架。只需要登录一次就可以访问所有相互信任的应用系统。 拥有"轻量级、分布式、跨域、CookieToken均支持…

What is the new in C#11?

目录 Raw String Literals List Pattern Slice Pattern Var Pattern File Local Types Required Members Auto Default Structs Ref Fields Raw String Literals """里面的内容是space敏感的。 意思是如果”age”前面有几个空格,就会打印几个…

(PySpark)RDD实验实战——取一个数组的中间值

实验环境:提前准备好findspark,pyspark,py4j等库 import findspark from pyspark import SparkContext, SparkConffindspark.init() #初始化spark,默认为你所设定的环境变量conf SparkConf().setAppName("jsytest").…

Facebook运营:账号类型有哪些?有必要用静态住宅IP吗?

Facebook作为月活跃用户数高达几十亿的社交媒体平台,一直不断有新用户选择加入。从个人用户的生活分享到企业用户的商务宣传推广,Facebook提供各大功能和模块来满足用户需求。相应的,用户也需要了解平台特点来进行相应的操作。本文从账号类型…

五种数据库特性对比(Redis/Mysql/SQLite/ES/MongoDB)

做后端开发的程序员基本都要学会数据库的相关知识。 1、关系型数据 今天就着这段时间了解大模型的事需要牵扯到是我们接触最多的、也是入门后端必学的关系型数据库。在关系型数据库中,数据以表的形式进行组织和存储,每个表就像一个 Excel 表格&#xf…