如何使用 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 轻松抓取动态网页

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DolphinDB 2024 年度峰会回顾之分论坛:权益类数字基建与技术创新

在这个数字化时代,金融科技正以前所未有的速度发展,而权益类数字基建作为这一进程的核心支撑,正不断推动着金融领域的创新与变革。 DolphinDB 2024 年度峰会的分论坛 A 聚焦《权益类数字基建与技术创新》这一核心议题,邀请到了业…

携手并进,智驭教育!和鲸科技与智谱 AI 签署“101 数智领航计划”战略合作协议

近日,上海和今信息科技有限公司(以下简称“和鲸科技”)与北京智谱华章科技有限公司(以下简称“智谱 AI”)签署“101 数智领航计划”战略合作协议。双方将携手营造智能化学科教育与科研环境,提供多种大模型工…

HTTP协议讲解

前瞻: 认识URL 1.ipport 2.平时上网,就是进程间通信 3.上网行为,1.获取资源 2.上传数据 相当于I/O 4.http协议采用tcp协议 网页 图片 音乐其实都是资源 Http请求 http request Method:Get/Post资源/路径&#xff1a…

GitLab 老旧版本如何升级?

极狐GitLab 正式对外推出 GitLab 专业升级服务 https://dl.gitlab.cn/cm33bsfv! 专业的技术人员为您的 GitLab 老旧版本实例进行专业升级!服务详情可以在官网查看详细解读! 那些因为老旧版本而被攻击的例子 话不多说,直接上图&a…

通用大模型应用研究七:RAGOS和AgentOS

RAG,即检索增强生成(Retrieval-Augmented Generation),是一种结合了信息检索和大型语言模型(LLM)提示的技术。它通过从数据源检索相关信息,并将检索到的信息与问题一起注入到LLM提示中&#xff…

一起赚美元第九期及相关推荐

一、核心内容 (一)一起赚美元第九期文章导读 作者复盘了在 10 天内通过知识付费赚到 220750 美元的故事。运营数据:24 号课程做完,28 号课程开卖,10 天后 262 人付款,均价 800 美元,总金额 22…

【Android】事件分发机制

Android 的事件分发机制主要包括以下几个步骤: 事件生成:用户在设备上进行触摸、滑动等操作时,系统会生成相应的事件,如触摸事件(MotionEvent)。 事件发送:生成的事件会被发送到当前活动&#…

【linux】线程 (三)

13. 常见锁概念 (一)了解死锁 死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程占有的,且不释放的资源,而处于的一种永久等待状态 (二)死锁四个必要条件 互斥条件…

uniapp项目结构基本了解

基本结构的解释 App.vue:应用的根组件,定义全局布局和逻辑。pages/:存放各个页面的 .vue 文件,定义应用的具体页面和功能模块。main.js:应用入口文件,初始化应用,挂载 App.vue。manifest.json&…

【C++】— 一篇文章让你认识STL

文章目录 🌵1.什么是STL?🌵2.STL的版本🌵3.STL的六大组件🌵4.STL的重要性🌵5. 如何学习STL🌵6. 学习STL的三种境界 🌵1.什么是STL? STL是Standard Template Library的简称…

『完整代码』靠近显示对话图标

在NPC预制体中增加Canvas 并设置 创建Image 并设置 隐藏Image 在场景中创建Canvas 重命名为CurrentCanvas 创建空物体设置底端锚点 重命名为DownPin 创建Image重命名为TalkUI 选择图片设置 创建Image并设置 重命名为imgNpc 创建文本并设置 重命名为txtNpc 可以给图片与文本加一…

centos 安装达梦数据库

一、环境准备 1.1、确认操作系统的版本和数据库的版本是否一致 ## 查看系统版本:cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)1.2、关闭防火墙和Selinux # 查看selinux是不是disabled / enforce cat /etc/selinux/config## 查看防火墙状态 fir…

windows mysql 8.0版本重置root密码

1.停止mysql服务 以管理员运行cmd 2.安全模式启动 mysqld --console --skip-grant-tables --shared-memory 3.修改密码 再开个cmd窗口就可以进入了:mysql 先进入mysql database:use mysql 修改密码:ALTER USER rootlocalhost IDENTIFIED …

使用 InfiniBand 写入带宽对 NVIDIA GPUDirect RDMA 进行基准测试

简介 性能基准测试是 HPC 的标志。最现代的超级计算机是具有异构架构的计算节点集群。在这样的节点中,我们可以看到经典 CPU 和专用计算协处理器 (GPU)。本教程介绍了使用基于 InfiniBand 写入带宽 (ib_write_bw) 构建的定制脚本对 NVIDIA GPUDirect 远程直接内存访…

Xmind一款极简思维导图和头脑风暴软件,支持PC和移动端,Xmind 2024.10.01101版本如何升级到Pro版?简单操作,最新可用!

文章目录 Xmind下载安装Xmind免费升级到Pro Xmind 是一款全功能的思维导图和头脑风暴软件,不限制节点和文件数,创新无限,界面纯净简洁无广告,支持PC和移动端,思维导图和大纲视图自由切换,可本地化文档存储&…

AutoFixture:.NET 的假数据生成工具

上次推荐过《Bogus:.NET的假数据生成利器》方便我们制造假数据测试。今天继续推荐另外一个也是非常流行的工具。 01 项目简介 AutoFixture 是一个用于 .NET 的测试工具,它允许开发者在单元测试中自动生成随机的测试数据。它支持广泛的数据类型&#xf…

如何使用DockerSpy检测你的Docker镜像是否安全

关于DockerSpy DockerSpy是一款针对Docker镜像的敏感信息检测与安全审计工具,该工具可以帮助广大研究人员在Docker Hub上检测和搜索自己镜像的安全问题,并识别潜在的泄漏内容,例如身份验证密钥等敏感信息。 功能介绍 1、安全审计&#xff1a…

React源码03 - React 中的更新

03 - React 中的更新 React 中创建更新的方式: 初次渲染:ReactDOM.render、ReactDOM.hydrate 后续更新:setState、forceUpdate 1. ReactDOM.render() 先创建 ReactRoot 顶点对象然后创建 FiberRoot 和 RootFiber创建更新,使应用进…

ArcGIS应用指南:多尺度渔网创建

在GIS中,创建渔网矢量文件是GIS中的一项常见任务,通过将研究区域划分为规则的网格,可以更精细地分析和管理城市空间数据。本文以厦门市行政区为例,详细介绍了如何创建不同尺度的渔网矢量网格,以适应不同区域的发展特点…

DCS项目调试踩坑记录

最近在调试一个DCS项目(集散控制系统),实际上就是一个新建厂区的控制系统。PLC用的是西门子1500,控制画面使用组态王7.5。 在调试过程中,发现给西门子DB块的变量转移到组态王太难了,因此记录一下&#xff0…