如何在云端使用 Browserless 进行网页抓取?

news2024/10/3 0:31:08

云浏览器是什么?

云浏览器是一种基于云的组合,它将网页浏览器应用程序与一个虚拟化的容器相结合,实现了远程浏览器隔离的概念。开发人员可以使用流行的工具(如 Playwright 和​ Puppeteer​)来自动化网页浏览器,用于网页抓取和网页测试。

云浏览器在安全容器中执行来自网络的命令,该容器与用户端点分离,并通过远程显示协议访问。因此,浏览器应用程序更加集中、易于管理、更具成本效益、可扩展性和保护性。

为什么使用 Browserless 进行抓取?

Browserless 是一种功能强大的基于云的解决方案,可实现无缝的浏览器自动化、网页抓取和测试。Browserless 的主要目标是简化和扩展网页浏览器自动化任务(如测试和抓取),这可以通过以下两种方式实现:

  • 在Docker 或 Kubernetes上运行多个浏览器实例。
  • 使用现有的 Web 驱动程序代理服务器,如 Selenium Grid。

如何在云中使用 Browserless 进行网页抓取?

第 1 步:准备

在我们开始之前,我们需要拥有 Browserless 服务。使用 Browserless 可以解决复杂的网页爬取和大型自动化任务,并且它现在已经实现了完全托管的云部署。

Browserless 采用以浏览器为中心的 подход,提供强大的无头部署功能,并提供更高的性能和可靠性。有关 Browserless 的更多信息,您可以 获取文档 了解更多。

获取 API 密钥 并转到 Nstbrowser 客户端的 Browserless 菜单页面,或者您可以转到 Nstbrowser 客户端进行访问

第 2 步:确认抓取目标

在我们开始之前,我们需要确保我们要抓取的内容。在以下示例中,我们尝试抓取 IMDb 前 250 名电影中的电影标题。打开页面后:

  1. 等待页面正常加载,并将页面定位到 IMDb 前 250 名电影中的电影标题
  2. 打开调试控制台并识别电影标题的 html 元素
  3. 使用您喜欢的库获取电影标题

 

第 3 步:开始抓取

一切准备就绪,开始抓取!我们选择使用 Nstbrowser 提供的功能强大的云 Browserless 来抓取上述内容。下面我们将列出一些常用的库。

Puppeteer

如果您还没有选择库,我们强烈推荐 Puppeteer,因为它非常活跃,并且有许多维护者。它也是由 Chrome 开发人员构建的,因此它是最优质的库之一。

  • 安装 puppeteer-core
# pnpm
pnpm i puppeteer-core
# yarn
yarn add puppeteer-core
# npm
npm i --save puppeteer-core
  • 代码脚本
import puppeteer from "puppeteer-core";

const token = "您的 api 密钥"; // '您的代理'

const config = {
  proxy: '您的代理', // 必需;输入格式:schema://user:password@host:port 例如:http://user:password@localhost:8080
  // platform: 'windows', // 支持:windows, mac, linux
  // kernel: 'chromium', // 仅支持:chromium
  // kernelMilestone: '128', // 支持:128
  // args: {
  //     "--proxy-bypass-list": "detect.nstbrowser.io"
  // }, // 浏览器参数
  // fingerprint: {
  //     userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.85 Safari/537.36', // userAgent 从 v0.15.0 版本开始支持
  // },
};

const query = new URLSearchParams({
  token: token, // 必需
  config: JSON.stringify(config),
});

const browserWSEndpoint = `https://less.nstbrowser.io/connect?${query.toString()}`;
// 连接 browserless
const browser = await puppeteer.connect({
  browserWSEndpoint,
  defaultViewport: null,
})
console.info('连接成功!');

// 创建新页面
const page = await browser.newPage()

// 访问 IMDb 前 250 名页面
await page.goto('https://www.imdb.com/chart/top/?ref_=nv_mv_250')

// 等待电影列表加载
await page.waitForSelector('.ipc-metadata-list')

// 获取电影标题列表
const moviesList = await page.$$eval('.ipc-metadata-list h3.ipc-title__text', nodes => nodes.map(node => node.textContent));

console.log('[IMDb 前 250 名电影]===>', moviesList);

// 关闭浏览器
await browser.close();
Playwright

它是一个活跃的开源项目,有大量的贡献者。Playwright 由微软开发,支持多种浏览器(Chromium、Firefox 和 WebKit)和多种编程语言(Nodejs、Python、.NET 和 Java),使其成为最通用的高质量浏览器自动化工具之一。

在 Nodejs 中使用

  • 安装 Playwright
# pnpm
pnpm create playwright
# yarn
yarn create playwright
# npm
npm init playwright@latest
  • 代码脚本
import { chromium } from 'playwright'

const token = "您的 api 密钥"; // '您的代理'

const config = {
  proxy: '您的代理', // 必需;输入格式:schema://user:password@host:port 例如:http://user:password@localhost:8080
  // platform: 'windows', // 支持:windows, mac, linux
  // kernel: 'chromium', // 仅支持:chromium
  // kernelMilestone: '128', // 支持:128
  // args: {
  //     "--proxy-bypass-list": "detect.nstbrowser.io"
  // }, // 浏览器参数
  // fingerprint: {
  //     userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.85 Safari/537.36', // userAgent 从 v0.15.0 版本开始支持
  // },
};

const query = new URLSearchParams({
  token: token, // 必需
  config: JSON.stringify(config),
});

const browserWSEndpoint = `ws://less.nstbrowser.io/connect?${query.toString()}`;
// 连接 browserless
const browser = await chromium.connectOverCDP(browserWSEndpoint);
console.info('连接成功!');

// 创建新页面
const page = await browser.newPage();

// 访问 IMDb 前 250 名页面
await page.goto('https://www.imdb.com/chart/top/?ref_=nv_mv_250');

// 等待电影列表加载
await page.waitForSelector('.ipc-metadata-list');

// 获取电影标题列表
const moviesList = await page.$$eval('.ipc-metadata-list h3.ipc-title__text', nodes => nodes.map(node => node.textContent));

console.log('[IMDb 前 250 名电影]===>', moviesList);

// 关闭浏览器
await browser.close();

在 Python 中使用

  • 安装 Playwright
pip install pytest-playwright
  • 代码脚本
from playwright.sync_api import sync_playwright
from urllib.parse import urlencode
import json

token = "您的 api 密钥"  # '您的代理'

config = {
    "proxy": "您的代理",  # 必需;输入格式:schema://user:password@host:port 例如:http://user:password@localhost:8080
    # platform: 'windows', // 支持:windows, mac, linux
    # kernel: 'chromium', // 仅支持:chromium
    # kernelMilestone: '128', // 支持:128
    # args: {
    #     "--proxy-bypass-list": "detect.nstbrowser.io"
    # }, // 浏览器参数
    # fingerprint: {
    #     userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.85 Safari/537.36', // userAgent 从 v0.15.0 版本开始支持
    # },
}

query = urlencode({"token": token, "config": json.dumps(config)})

browser_ws_endpoint = f"ws://less.nstbrowser.io/connect?{query}"

def scrape_imdb_top_250():
    with sync_playwright() as p:
        # 连接 browserless
        browser = p.chromium.connect_over_cdp(browser_ws_endpoint)
        print("连接成功!")

        # 创建新页面
        page = browser.new_page()

        # 访问 IMDb 前 250 名页面
        page.goto("https://www.imdb.com/chart/top/?ref_=nv_mv_250")

        # 等待电影列表加载
        page.wait_for_selector(".ipc-metadata-list")

        # 获取电影标题列表
        movies_list = page.eval_on_selector_all(
            ".ipc-metadata-list h3.ipc-title__text",
            "nodes => nodes.map(node => node.textContent)",
        )

        print("[IMDb 前 250 名电影]===>", movies_list)

        # 关闭浏览器
        browser.close()

scrape_imdb_top_250()

选择您喜欢的语言和库,执行相应的脚本,您就可以看到抓取的结果!

第 4 步:查看 Browserless 仪表板

您可以在 Nstbrowser 客户端的 Browserless 菜单中查看最近请求的所有统计信息和剩余的会话时间。

使用 Browserless 绕过抓取阻止的 5 个技巧?

无头浏览器和常规浏览器之间存在一些关键差异。反机器人服务通过发现这些差异来检测无头浏览器。

使用 Browserless 绕过抓取阻止涉及几个关键策略:

  1. 使用无头浏览器: Browserless 允许您运行无头浏览器(如 Puppeteer),它们可以模仿真实用户的行为,降低检测风险。
  2. 轮换用户代理: 随机化用户代理可以帮助避免阻止,使您的请求看起来来自不同的浏览器。
  3. 实施代理轮换: 利用轮换代理频繁更改 IP 地址,最大限度地减少被目标网站阻止的可能性。
  4. 限制请求: 模仿类似人类的浏览行为,在请求之间引入延迟,防止触发安全措施的快速请求。
  5. 管理 Cookie 和会话: 正确处理 Cookie 和会话数据以保持连续性并避免检测,因为持续的会话不太可能被标记。

Browserless 和无头浏览器之间的区别是什么?

定义:

Browserless: 提供基于云的浏览器自动化的服务或平台,使用户能够运行无头浏览器,而无需管理底层基础设施。

无头浏览器: 一种没有图形用户界面 (GUI) 的网页浏览器,可以在命令行环境中运行,可用于自动化网页任务。

管理:

Browserless: 提供托管服务,抽象了设置和维护浏览器实例的复杂性。用户通过 API 与之交互以启动任务。

无头浏览器: 要求用户设置和管理浏览器环境,包括依赖项和配置。

可扩展性:

Browserless: 专为可扩展性而设计,使用户能够轻松地并行运行多个浏览器实例,利用云资源。

无头浏览器: 扩展可能需要更多的手动工作,例如管理多个实例和服务器资源。

用例:

Browserless: 非常适合需要可扩展自动化来进行网页抓取、测试和数据提取而无需基础设施问题的开发人员和团队。

无头浏览器: 适用于喜欢直接控制其自动化任务并愿意管理其自身环境的开发人员。

集成:

Browserless: 通常提供与各种工具和服务的集成,使其更容易集成到现有工作流程中。

无头浏览器: 需要定制的集成工作才能与其他工具或服务连接。

总结

如何在云中使用 browserless 进行网页抓取?我们已经探讨了 4 个详细步骤。只需选择您喜欢的库,然后抓取您需要的数据。

此外,我们还了解了:

  • 云浏览器是什么?
  • Browserless 的优势
  • 避免阻止的 5 个有效方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2165904.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

repo 查看指定日期内,哪些仓库有修改,具体的修改详情

文章目录 想看指定时间段内仓库中修改了哪些具体的文件,是谁修改的,commit的备注信息等详情只想看某段时间内有更改的仓库的修改详情,其他没有修改的仓库不显示。 想看指定时间段内仓库中修改了哪些具体的文件,是谁修改的&#xf…

VSCode#include头文件时找不到头文件:我的解决方法

0.前言 1.在学习了Linux之后,我平常大部分都使用本地的XShell或者VSCode连接远程云服务器写代码,CentOS的包管理器为我省去了不少繁琐的事情,今天使用vscode打开本地目录想写点代码发现#include头文件后,下方出现了波浪线&#…

SparkSQL-初识

一、概览 Spark SQL and DataFrames - Spark 3.5.2 Documentation 我们先看下官网的描述: SparkSQL是用于结构化数据处理的Spark模块,与基本的Spark RDD API不同。Spark SQL提供的接口为Spark提供了更多关于正在执行的数据和计算结构的信息。在内部&a…

C++中vector类的使用

目录 1.vector类常用接口说明 1.1默认成员函数 1.1.1构造函数(constructor) 1.1.2 赋值运算符重载(operator()) 2. vector对象的访问及遍历操作(Iterators and Element access) 3.vector类对象的容量操作(Capacity) 4. vector类对象的修改及相关操作(Modifiers and Stri…

【Java数据结构】 ---对象的比较

乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 ,Java 欢迎大家访问~ 创作不易,大佬们点赞鼓励下吧~ 前言 上图中,线性表、堆…

[Redis][主从复制][上]详细讲解

目录 0.前言1.配置1.建立复制2.断开复制3.安全性4.只读5.传输延迟 2.拓扑1.一主一从结构2.一主多从结构2.树形主从结构 0.前言 说明:该章节相关操作不需要记忆,理解流程和原理即可,用的时候能自主查到即可主从复制? 分布式系统中…

PyTorch自定义学习率调度器实现指南

在深度学习训练过程中,学习率调度器扮演着至关重要的角色。这主要是因为在训练的不同阶段,模型的学习动态会发生显著变化。 在训练初期,损失函数通常呈现剧烈波动,梯度值较大且不稳定。此阶段的主要目标是在优化空间中快速接近某…

ResNet残差网络:深度学习的里程碑

引言 在深度学习领域,卷积神经网络(CNN)的发展一直推动着图像识别、目标检测等任务的进步。然而,随着网络层数的增加,传统的CNN面临着梯度消失和梯度爆炸等难题,限制了深层网络的训练效果。为了克服这些挑…

oracle direct path read处理过程

文章目录 缘起处理过程1.AWR Report 分析2.调查direct path read发生的table3.获取sql text4.解释sql并输出执行计划: 结论:补充direct path read等待事件说明 缘起 记录direct path read处理过程 处理过程 1.AWR Report 分析 问题发生时间段awr如下…

FortiGate OSPF动态路由协议配置

1.目的 本文档针对 FortiGate 的 OSPF 动态路由协议说明。OSPF 路由协议是一种 典型的链路状态(Link-state)的路由协议,一般用于同一个路由域内。在这里,路由 域是指一个自治系统,即 AS,它是指一组通过统一的路由政策或路由协议互相交 换路由信息的网络。在这个 AS 中,所有的 …

基于JSP+Servlet+Layui实现的博客系统

> 这是一个使用 Java 和 JSP 开发的博客系统,并使用 Layui 作为前端框架。 > 它包含多种功能,比如文章发布、评论管理、用户管理等。 > 它非常适合作为 Java 初学者的练习项目。 一、项目演示 - 博客首页 - 加载动画 - 右侧搜索框可以输入…

开源服务器管理软件Nexterm

什么是 Nexterm ? Nexterm 是一款用于 SSH、VNC 和 RDP 的开源服务器管理软件。 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 nexterm ,选择第一个 germannewsmaker/nexterm,版本选择 latest。 本文写作时, latest 版本对…

【STM32】RTT-Studio中HAL库开发教程七:IIC通信--EEPROM存储器FM24C04

文章目录 一、简介二、模拟IIC时序三、读写流程四、完整代码五、测试验证 一、简介 FM24C04D,4K串行EEPROM:内部32页,每个16字节,4K需要一个11位的数据字地址进行随机字寻址。FM24C04D提供4096位串行电可擦除和可编程只读存储器&a…

Excel 设置自动换行

背景 版本:office 专业版 11.0 表格内输入长信息,发现默认状态时未自动换行的,找了很久设置按钮,遂总结成经验帖。 操作 1)选中需设置的单元格/区域/行/列。 2)点击【开始】下【对齐方式】中的【自动换…

HAproxy,nginx实现七层负载均衡

环境准备: 192.168.88.25 (client) 192.168.88.26 (HAproxy) 192.168.88.27 (web1) 192.168.88.28 (web2) 192.168.88.29 (php1) 192.168.88.30…

基于微信小程序的教学质量评价系统ssm(lw+演示+源码+运行)

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了基于微信小程序的教学质量评价系统的开发全过程。通过分析基于微信小程序的教学质量评价系统管理的不足,创建了一个计算机管理基于微信小程序的教学…

【Anti-UAV410】论文阅读

摘要 无人机在红外视频中的感知,对于有效反无人机是很重要的。现有的跟踪数据集存在目标大小和环境问题,不能完全表示复杂的逼真场景。因此作者就提出了Anti-UAV410数据集,该数据集总共410个视频和超过438K个标注框。为了应对复杂环境无人机跟…

丹摩智算(damodel)部署stable diffusion实验

名词解释: 丹摩智算(damodel):是一款带有RTX4090,Tesla-P40等显卡的公有云服务器。 stable diffusion:是一个大模型,可支持文生图,图生图,文生视频等功能 一.实验目标 …

Linux-TCP重传

问题描述: 应用系统进行切换,包含业务流量切换(即TongWeb主备切换)和MYSQL数据库主备切换。首先进行流量切换,然后进行数据库主备切换。切换后发现备机TongWeb上有两批次慢请求,第一批慢请求响应时间在133…

【HarmonyOS】应用引用media中的字符串资源如何拼接字符串

【HarmonyOS】应用引用media中的字符串资源如何拼接字符串 一、问题背景: 鸿蒙应用中使用字符串资源加载,一般文本放置在resoutces-base-element-string.json字符串配置文件中。便于国际化的处理。当然小项目一般直接引用字符串,不需要加载s…