如何使用 Browserless 抓取动态网站?

news2024/10/19 10:11:21

什么是动态网页?

动态网页是指其内容并非完全直接嵌入在静态HTML中,而是通过服务器端或客户端渲染生成的网页。

它可以根据用户的操作实时显示数据,例如在用户点击按钮或向下滚动页面时加载更多内容(如无限滚动)。这种设计可以改善用户体验,并允许用户无需重新加载整个页面即可获得相关信息。

要判断一个网站是否是动态网页,可以在浏览器中禁用JavaScript。如果该网站是动态的,大多数内容将消失。

爬取动态网站时面临的挑战

指纹识别和封锁

  1. 指纹识别技术: 许多网站使用指纹识别技术来检测和阻止自动爬虫。这些技术通过分析用户的浏览器行为、屏幕分辨率、插件、时区等信息来创建每个用户的唯一“指纹”。如果检测到异常或与正常用户行为不一致,网站可能会阻止访问。

  2. 封锁机制: 为了保护其内容,网站会实施各种封锁机制,例如:

  • IP封锁: 当同一IP地址频繁发出请求时,网站可能会暂时或永久禁止该IP地址访问。
  • 验证码验证: 当检测到自动化流量时,网站可能会引入验证码,以确认访问者是人类。
  • 流量限制: 设置请求速率限制,当请求速率超过预设阈值时,网站将拒绝进一步的请求。

本地加载挑战

  1. 资源消耗: 动态页面通常需要更多系统资源来进行渲染和数据抓取。当使用Puppeteer或Selenium等工具时,可能会导致内存和CPU使用率过高,尤其是在抓取多个页面时。
  2. 延迟和时间成本: 由于需要等待页面完全加载(包括JavaScript执行和AJAX请求),抓取动态页面的时间成本可能会很高,这将影响整个爬虫的效率。
  3. 并发处理: 在高负载情况下,同时处理多个抓取任务可能会导致系统过载,导致请求失败或超时。这需要合理的任务调度和资源管理策略。

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

抓取动态网站的 6 种有效方法

1. 拦截XHR/Fetch请求

在抓取过程中拦截XHR(XMLHttpRequest)和Fetch请求的一种有效方法是检查浏览器的Network选项卡,以识别提供动态内容的API端点。一旦识别出这些端点,就可以使用HTTP客户端(如Requests库)直接向这些API发送请求以获取数据。

  • 优点: 此方法通常很快,并且可以高效地提取数据,因为它只获取所需的内容,而不是整个网页。
  • 缺点: 如果数据以JSON的形式存储在DOM中,而不是由API返回,这可能具有挑战性。此外,模拟API请求的过程可能会受到API更改、速率限制和身份验证要求的影响,导致可扩展性差。

2. 使用无头浏览器

使用无头浏览器(如Puppeteer或Selenium)可以完全模拟用户行为,包括页面加载和交互。这些工具能够处理JavaScript并抓取动态生成的内容。

  • 优点: 此方法能够抓取高度动态的网站,并支持复杂的用户交互。
  • 缺点: 资源消耗高、抓取速度慢,并且可能需要处理复杂的页面结构和动态内容。

3. API请求

直接从网站的API请求数据是一种高效的抓取方式。分析网站的网络请求,找到API端点,并使用HTTP客户端请求数据。

  • 优点: 能够直接获取所需数据,并避免解析HTML的复杂性。
  • 缺点: 如果API需要身份验证或具有请求频率限制,可能会影响抓取效率。

4. 抓取AJAX请求

通过监控网络请求,识别AJAX调用并重现它们,可以提取动态加载的数据。

  • 优点: 直接获取数据源,减少不必要的加载。
  • 缺点: 需要对AJAX请求的参数和格式有一定了解,并且可能还会遇到身份验证和速率限制问题。

5. 代理和IP轮换

为了避免被网站封锁,使用代理服务和IP轮换是一种重要的策略。这可以帮助分散请求,降低被检测到的风险。

  • 优点: 降低被封锁的概率,可以在大量请求中保持有效性。
  • 缺点: 使用代理服务可能会增加抓取成本,并且需要维护代理列表。

6. 模拟用户行为

编写脚本模拟人类浏览行为,例如在请求之间添加延迟,随机化操作顺序等,可以帮助降低被网站识别为爬虫的风险。

  • 优点: 数据抓取可以更自然地进行,降低被检测到的风险。
  • 缺点: 实现起来比较复杂,需要花费时间调整和优化模拟行为。

什么是 Browserless?

Browserless 是一种无头chrome云服务,它可以在没有图形用户界面的情况下运行在线应用程序和自动化脚本。对于网页抓取和其他自动化操作,它特别有用。

在我们的视频中找到更多细节!

Browserless 使抓取动态网页变得容易

Browserless 也是一个强大的无头浏览器。接下来,我们将以Browserless为例来抓取动态网页。

先决条件

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

Browserless 采用浏览器为中心的策略,提供强大的无头部署能力,并提供更高的性能和可靠性。您可以访问 Nstbrwoser 的使用教程了解有关 Browserless 服务配置的更多信息。

在一开始,我们需要获取Nstbrowser的API KEY。您可以前往 Nstbrowser 客户端的 Browserless菜单页面。

确定抓取目标

在我们开始之前,让我们确定本次测试的目标。我们将使用Puppeteer和Playwright来获取动态网站的页面标题内容:

  1. 访问目标网站:https://www.nstbrowser.io/en
  2. 获取动态页面标题内容

初始化项目

按照以下步骤安装依赖项:

  • 步骤1: 在Vs code中创建一个新文件夹
  • 步骤2: 打开Vs code终端,运行以下命令以安装相关的依赖项
npm init -y
pnpm add playwright puppeteer-core

使用Playwright和Browserless抓取动态网页

  • 创建一个抓取脚本
const { chromium } = require('playwright');

async function createBrowser() {
  const token = ''; // required
  const config = {
    proxy:
      '', // required; input format: schema://user:password@host:port eg: http://user:password@localhost:8080
    // platform: 'windows', // support: windows, mac, linux
    // kernel: 'chromium', // only support: chromium
    // kernelMilestone: '124', // support: 113, 120, 124
    // args: {
    //   '--proxy-bypass-list': 'detect.nstbrowser.io',
    // }, // browser args
    // 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',
    // },
  };
  const query = new URLSearchParams({
    token: token, // required
    config: JSON.stringify(config),
  });

  const browserWSEndpoint = `ws://less.nstbrowser.io/connect?${query.toString()}`;
  const browser = await chromium.connectOverCDP(browserWSEndpoint);
  const context = await browser.newContext();
  const page = await context.newPage();

  page.goto('https://www.nstbrowser.io/en');

  // sleep for 5 seconds
  await new Promise((resolve) => setTimeout(resolve, 5000));

  const h1Element = await page.$('h1');
  const content = await h1Element?.textContent();
  console.log(`Playwright: The content of the h1 element is: ${content}`)

  await page.close();
  await page.context().close();
}

createBrowser().then();
  • 检查抓取结果

抓取结果

使用Puppeteer和Browserless抓取动态网页

  • 创建一个抓取脚本
const puppeteer = require('puppeteer-core');

async function createBrowser() {
  const token = ''; // required
  const config = {
    proxy:
      '', // required; input format: schema://user:password@host:port eg: http://user:password@localhost:8080
    // platform: 'windows', // support: windows, mac, linux
    // kernel: 'chromium', // only support: chromium
    // kernelMilestone: '124', // support: 113, 120, 124
    // args: {
    //   '--proxy-bypass-list': 'detect.nstbrowser.io',
    // }, // browser args
    // 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',
    // },
  };
  const query = new URLSearchParams({
    token: token, // required
    config: JSON.stringify(config),
  });

  const browserWSEndpoint = `ws://less.nstbrowser.io/connect?${query.toString()}`;
  const browser = await puppeteer.connect({
    browserWSEndpoint: browserWSEndpoint,
    defaultViewport: null,
  });
  const page = await browser.newPage();

  await page.goto('https://www.nstbrowser.io/en');

  // sleep for 5 seconds
  await new Promise((resolve) => setTimeout(resolve, 5000));

  const h1Element = await page.$('h1');

  if (h1Element) {
    const content = await page.evaluate((el) => el.textContent, h1Element); // use page.evaluate to get the text content of the h1 element
    console.log(`Puppeteer: The content of the h1 element is: ${content}`);
  } else {
    console.log('No h1 element found.');
  }

  await page.close();
}

createBrowser().then();
  • 检查抓取结果

结论

抓取动态网页总是比抓取普通网页更复杂。在抓取过程中很容易遇到各种麻烦。通过本博文的介绍,您一定已经学习到了:

  • 6 种有效的方法来抓取动态网页
  • 使用 Browserless 轻松抓取动态网页

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

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

相关文章

查缺补漏----三次握手与四次挥手

注意事项: ① 如果是和FTP服务器建立连接,那么要建立两个TCP连接。一个是控制连接一个是数据连接。 ② SYN报文段不能携带数据。三次握手的最后一个报文段可以捎带数据,但是如果不携带数据,那么就不消耗序号。 ③ 在断开连接过程中…

线性代数学习

1.标量由只有一个元素的张量表示 import torchx torch.tensor([3,0]) y torch.tensor([2,0])x y, x * y, x / y, x**y 2.可以将向量视为标量值组成的列表 x torch.arange(4) x 3.通过张量的索引访问任一元素 x[3] 4.访问张量长度 len(x) 5.只有一个轴的张量&#xff0c…

Apache Seata Raft模式配置中心

本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Apache Seata Raft模式配置中心 title: Seata Raft模式配置中心 author: 蒋奕晨-清华大学&…

解决在Windows中安装tensorflow2.10无法检测到GPU的问题

解决在Windows中安装tensorflow2.10无法检测到GPU的问题 官方给出的Windows本地安装方式 更新显卡驱动到最新。安装anaconda或miniconda作为python环境的管理工具。创建新的环境tf:conda create --name tf python3.9,然后进入改环境:conda …

汇编验证并跟踪求平均数程序

一.实验目的 在数据段中定义一个5字节数据的数组array,把它们看做有符号数并求它们的平均数,结果保存在avg内存单元。 二.实验代码(dosbox) ;*************************************************************** assume ds:data,…

最近AI产品开发的热点在什么领域?

AI技术发展可谓是日新月异,头部AI公司的研发方向也成为了行业的风向标。然而,与以往不同的是,这一波AI浪潮的热点不仅仅停留在技术本身,而是更注重实际应用场景的落地。过去,我们常说“先有场景再去想办法”,而如今,AI技术的发展却呈现出“先有技术再找场景”的趋势。因…

RTSP流图片采样助手(yolov5)

在监控和视频分析领域,实时采样视频流中的图像数据是十分重要的。本文将介绍一个基于Python和Tkinter构建的RTSP流图片采样助手的设计与实现,旨在简化RTSP流的采样过程,并支持根据用户定义的特殊标签进行筛选。 项目概述 该项目的主要功能包…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于AGCN-LSTM模型的海上风电场功率概率预测 》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

时序数据库 TDengine 支持集成开源的物联网平台 ThingsBoard

Thingsboard 中“设备配置”和“设备”的关系是一对多的关系,通过设备配置为每个设备设置不同的配置,每个设备都会有一个与其关联的设备配置文件。等等,这不就是TDengine 中超级表的概念: 超级表是一种特殊的表结构,用…

分布式ID多种生成方式

分布式ID 雪花算法(时间戳41机器编号10自增序列号10) 作用:希望ID按照时间进行有序生成 原理: 即一台带有编号的服务器在毫秒级时间戳内生成带有自增序号的ID,这个ID保证了自增性和唯一性 雪花算法根据结构的生成ID个数的上线时…

密码学原理

1.1 加密算法 Tags: 1、加密算法分类 2、对称算法 <原理、特征、算法> 3、非对称算法 <原理、特征、算法> 4、对称算法vs非对称算法 <结合体> 1、加密算法概述&#xff1a; 用于对用户数据进行加密&#xff0c;常用算法有DES、3DES、AES、RSA、DH算法。 根据…

循序渐进丨在 MogDB 数据库中实现 Oracle ASH能力

我们都知道&#xff0c;当 Oracle 数据库出现性能故障后&#xff0c;一般会在线上实时诊断数据库性能问题&#xff0c;特别是资源突然打高的场景&#xff0c;这个时候用到ASH的数据&#xff0c;就能很大程度上准确定位问题所在。 Oracle ASH 在 Oracle 数据库中&#xff0c;实…

E-R网络

一、ER网络的基本性质 ER网络的生成方式 定义&#xff1a;一个随机图是由N个节点构成并且每对节点之间的连接概率为p G(N,L)模型&#xff1a; 一个随机图由N个节点构成&#xff0c;并且有L条连边随机放置在L对节点之间&#xff08;不出现重边与自环&#xff09; G(N,p)模型…

利用移动式三维扫描技术创建考古文物的彩色纹理网格【上海沪敖3D】

文章来源于蔡司工业质量解决方案&#xff0c;作者蔡司工业质量 在考古环境中&#xff0c;三维扫描技术应用广泛&#xff0c;如存档、保存、复制和分享&#xff08;包括实体和虚拟形式&#xff09;。 文中&#xff0c;通过真实的扫描案例&#xff0c;您将了解到三维光学解决方案…

微信小程序绘制轨迹

1、map | uni-app官网 根据官网描述&#xff1a;通过从数据库获取POI数据&#xff0c;并通过 uni-id-common 内的路线规划API&#xff0c;计算路线、距离、时间。 2、 <map style"width:100%;height:96%;" id"myMap" :scale"scale" :longi…

打包使用pythn编写的maya插件,使用pyeal打包

1.安装python,注意版本一定要和maya上面的python解释器版本一致 2.安装pyeal使用pycharm或者maya自带的python解释器mayapy.exe 3.如果有别的库&#xff0c;下载安装到你需要的文件夹中&#xff1a; 使用mayapy: "D:\AnZhuangBao\maya2022\2022\maya2022AZ\Maya2022\bin\m…

【华为HCIP实战课程十四】OSPF网络中LSA过滤,网络工程师

一、3类LSA过滤以及汇总 我们查看SW3的路由到达R4的lo0下一跳是R1的接口IP 10.1.15.1 我们在SW3上查看3类汇总LSA: SW3的3类汇总LSA可以看到ABR R1和R5到达R4的lo0的度量值分别为48和96,因此SW3到达R4的lo0的地址为48+1=49 和 96+1=97, 因此会显示49的cost,SW3的下一跳为R1的…

word怎么清除格式,Word一键清除所有格式教程

你是否曾在编辑Word文档时遇到过复制内容时格式混乱的情况?别担心&#xff0c;这只需要清除一下格式就可以了&#xff0c;很多朋友还不知道word怎么清除格式&#xff0c;下面小编就来给大家讲一讲word一键清除所有格式的方法教程&#xff0c;操作非常简单&#xff0c;有需要的…

使用短效IP池的优势是什么?

短效IP池作为代理IP服务中一种独特的资源管理方式&#xff0c;其应用已经在数据采集、市场分析和网络安全等多个领域中展示出强大的功能。尽管“短效”听起来似乎意味着某种限制&#xff0c;然而在某些特定的应用场景下&#xff0c;短效IP池却提供了无可比拟的优势。本文将详细…

流量PID控制(开度前馈量计算+辅助PID)

和流体流速(瞬时流量)相关的计算请参考下面文章链接: 1、PLC通过伯努利方程近似计算水箱流量 PLC通过伯努利方程近似计算水箱流量(FC)-CSDN博客文章浏览阅读1.6k次。本文介绍了如何使用PLC通过伯努利方程近似计算水箱中的液体流量,主要涉及流量计算、模型验证、梯形图编程及…