当前位置: 首页 > news >正文

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

什么是动态网页?

动态网页是指其内容并非完全直接嵌入在静态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 = ''; // requiredconst 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, // requiredconfig: 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 secondsawait 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 = ''; // requiredconst 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, // requiredconfig: 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 secondsawait 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 elementconsole.log(`Puppeteer: The content of the h1 element is: ${content}`);} else {console.log('No h1 element found.');}await page.close();
}createBrowser().then();
  • 检查抓取结果

结论

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

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

相关文章:

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

什么是动态网页? 动态网页是指其内容并非完全直接嵌入在静态HTML中,而是通过服务器端或客户端渲染生成的网页。 它可以根据用户的操作实时显示数据,例如在用户点击按钮或向下滚动页面时加载更多内容(如无限滚动)。这…...

第21~22周Java主流框架入门-Spring 2.SpringAOP面向切面编程

1.Spring AOP (Aspect-Oriented Programming) 1. 1. 什么是 Spring AOP? AOP(面向切面编程) 是 Spring 提供的一种可插拔的组件技术,允许我们在软件运行过程中添加额外的功能。场景:假设有两个模块,用户管…...

Flutter不常用组件----InteractiveViewer

在现代移动应用开发中,用户互动性是提升体验的关键。Flutter 提供了多种组件来帮助开发者实现丰富的交互功能,其中一个强大的组件便是 InteractiveViewer。它允许用户通过手势对内容进行缩放、平移和旋转,适用于需要用户查看大图、地图或者其…...

【LeetCode HOT 100】详细题解之二分查找篇

【LeetCode HOT 100】详细题解之二分查找篇 35 搜索插入位置思路代码(左闭右闭)代码(左闭右开) 74 搜索二维矩阵思路代码(左闭右闭) 34 在排序数组中查找元素的第一个和最后一个位置思路代码 33 搜索旋转排序数组思路代码 153 寻找旋转排序数组中的最小值思路代码 4 寻找两个正…...

管理篇(顶级思维模型(31个))(待做)

目录 一、成长进阶模型 二、优势探索模型 三、优势层次模型 四、人生定位模型 五、看懂人性模型 六、如何抉择模型 七、本质思考模型 八、心流模型 九、精力管理模型 十、高效沟通模型 十一、100%传递模型 十二、高效倾听模型 十三、高效表达模型 十四、精准提问模…...

十一、数据库配置

一、Navicat配置 这个软件需要破解 密码是:123456; 新建连接》新建数据库 创建一个表 保存出现名字设置 双击打开 把id设置为自动递增 这里就相当于每一次向数据库添加一个语句,会自动增长id一次 二、数据库的增删改查 1、Vs 建一个控…...

day02 -- docker

1.docker的介绍 Docker 是一个开源的应用容器引擎,基于 Go语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使…...

ecmascript标准

1. 简介 1.1. 概述 ECMAScript(简称ES)是JavaScript编程语言的一个标准化版本。它是为网络开发设计的一种轻量级的脚本语言,主要用于在网页上实现交互性和动态效果。ECMAScript是该语言的标准名称,而JavaScript是其最知名和广泛使用的实现。 1.2. 特点 跨平台性 :ECMAS…...

在Linux命令行中一行执行多个命令

原文地址链接: https://kashima19960.github.io/2024/10/22/Linux/在Linux命令行中一行执行多个命令/,一般有最新的修改都是在我的个人博客里面,所以在当前平台的更新会比较慢,请见谅😃 前言 在shell中一个一个命令行&#xff0c…...

u盘快速格式化后怎么恢复文件:深入解析与全面指南

U盘,凭借其小巧便携、易于使用的特点,成为了我们日常生活中不可或缺的数据存储工具。然而,有时为了清除病毒、解决文件系统错误或准备存储新数据,我们可能需要对U盘进行快速格式化。但这一操作往往伴随着一个严峻的问题&#xff1…...

青少年编程能力等级测评CPA C++(二级)试卷(2)

青少年编程能力等级测评CPA C(二级)试卷(2) 一、单项选择题(共20题,每题3.5分,共70分) CP2_2_1.下列C程序段中,对二维数组arr的定义不正确是( &…...

aws 把vpc残留删除干净

最近忘了把vpc 删干净导致又被收了冤大头钱 在删除vpc 的收发现又eni在使用,但是忘了是哪个资源在占用 先用命令行把占用的资源找出来停掉 使用 AWS 命令行界面(CLI)来查看 VPC 的使用情况 列出子网: aws ec2 describe-subnets …...

平衡二叉树最全代码

#include<stdio.h> #include<stdlib.h>typedef struct Node {int val;int height;struct Node *left;struct Node *right; }Node;//创建新结点 Node* newNode(int val) {Node *node (Node*)malloc(sizeof(Node));node->val val;node->height 1;node->l…...

数据库表的创建

运用的环境是pychram python3.11.4 创建一个表需要用到以下语法 注释已经写清楚各种语法的含义&#xff0c;记住缩进是你程序运行的关键&#xff0c;因为程序是看你的缩进来判断你的运行逻辑&#xff0c;像我这个就是缩进不合理导致的报错 那么今天分享就到这里&#xff0c;谢…...

【MySQL 数据库】之--基础知识

1. MySQL 数据库基础概念 数据库: 逻辑上存储和管理数据的集合。MySQL 是一个常用的关系型数据库管理系统。 2. 创建数据库 要创建一个新的数据库&#xff0c;可以使用 CREATE DATABASE 语句。 语法: CREATE DATABASE 数据库名; 示例: CREATE DATABASE my_database; 注意事…...

Flume面试整理-如何处理Flume中的数据丢失

在Apache Flume中,数据丢失是一个可能出现的严重问题,特别是在处理大规模数据时。数据丢失通常会发生在数据从Source(源)到Channel(通道),或从Channel到Sink(汇)传输的过程中。如果不处理得当,Flume的崩溃或网络故障可能会导致丢失的数据无法恢复。以下是几种常见的F…...

文件处理新纪元:微信小程序的‘快递员’与‘整理师’

嗨&#xff0c;我是中二青年阿佑&#xff0c;今天阿佑将带领大家如何通过巧妙的文件处理功能&#xff0c;让用户体验从‘杂乱无章’到‘井井有条’的转变&#xff01; 文章目录 微信小程序的文件处理文件上传&#xff1a;小程序的“快递服务”文件下载&#xff1a;小程序的“超…...

应付账款优化,自动化管理5要点

优化应付账款流程对企业现金流至关重要。通过自动化、规范采购订单、管理供应商、设计高效流程及保留数字记录&#xff0c;可显著提升效率与精确度。ZohoBooks在线财务记账软件助您简化应付账款处理&#xff0c;确保业务顺畅。 1、自动化您的应付账款流程 通过自动化你的应付账…...

Win安装Redis

目录 1、下载 2、解压文件并修改名称 3、前台简单启动 4、将redis设置成服务后台启动 5、命令启停redis 6、配置文件设置 1、下载 【下载地址】 2、解压文件并修改名称 3、前台简单启动 redis-server.exe redis.windows.conf 4、将redis设置成服务后台启动 redis-server -…...

手把手带你安装U9【win10+sql+U9】,同样适用U9C的安装

一、Win10操作系统设置 1、Windows 10内置账号administrator启用 a、登录到Windows 10系统以后,鼠标右键点击桌面左下角“win图标”,在弹出画面选择“命令提示符(管理员)”或”windows power shell(管理员)”,如下图: b、在”命令提示符(管理员)”或”windows power sh…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...