使用TypeScript和jsdom库实现自动化数据抓取

news2024/10/7 3:22:24

目录

环境准备

使用TypeScript和jsdom抓取数据

总结


随着网络技术的发展,数据抓取已成为获取信息的重要手段。然而,手动进行数据抓取既耗时又容易出错。因此,本文将介绍如何使用TypeScript和jsdom库实现自动化数据抓取。我们将通过创建一个简单的爬虫来演示这个过程,该爬虫从一个简单的网页上抓取数据。

TypeScript是一种由Microsoft开发的开源编程语言,它是JavaScript的一个超集,添加了静态类型定义等一些特性。jsdom是一个轻量级的JavaScript环境,它模拟了DOM(文档对象模型)API,使得我们可以在Node.js环境中运行JavaScript代码,而不需要实际的浏览器环境。

环境准备

在开始之前,我们需要先安装一些必要的依赖。首先安装TypeScript和ts-node,运行以下命令:

npm install -g typescript ts-node

然后安装jsdom:

npm install jsdom

使用TypeScript和jsdom抓取数据

创建一个简单的HTML页面
为了演示我们的爬虫,我们首先需要一个页面来爬取。下面是一个简单的HTML页面示例:

html
<!DOCTYPE html>  
<html>  
<head>  
    <title>My Website</title>  
</head>  
<body>  
    <h1>Welcome to My Website</h1>  
    <p id="content">  
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas consequat, diam eratcillum doloreeiras, euium zzril delenit,amet doloreeiras magnavelit. Sed ut labore et reprehenderit dolore magna aliquam veritatis.
</p>

</body> </html>

保存为 `index.html`。


使用TypeScript和jsdom抓取数据
创建一个名为 dataScraper.ts 的TypeScript文件,并输入以下代码:

typescript
import * as jsdom from 'jsdom';  
import * as fs from 'fs';  
  
// 设置HTML文件路径  
const htmlFilePath = './index.html';  
  
// 设置数据抓取的函数  
async function scrapeData() {  
  // 创建jsdom实例  
  const { JSDOM } = await jsdom.env({  
    html: fs.readFileSync(htmlFilePath),  
    features: {  
      FetchExternalResources: ['script'],  
      ProcessExternalResources: ['script'],  
    },  
  });  
  
  // 获取文档的DOM元素  
  const { document } = JSDOM.window;  
  const element = document.getElementById('content');  
  
  // 抓取数据  
  const text = element?.textContent;  
  
  // 输出结果  
  console.log(text);  
}  
  
// 运行数据抓取任务  
scrapeData().catch((error) => {  
  console.error('数据抓取出现错误:', error);  
});


这段代码首先导入jsdom和fs库。然后,我们定义了一个名为 scrapeData 的异步函数,该函数执行以下操作:

1、通过 jsdom.env 方法创建一个jsdom实例,该实例加载我们的HTML文件并模拟浏览器环境。
2、从模拟的浏览器环境中获取文档的DOM元素。
3、从DOM元素中提取文本内容。
4、输出提取到的文本内容。


最后,我们调用 scrapeData 函数来执行数据抓取任务。如果在执行过程中出现错误,将会打印出错误信息。

当然,我们可以进一步扩展这个数据抓取的过程,让它更具效率和实用性。以下是一些建议的步骤:

1、确定目标数据结构:在开始抓取数据之前,明确你想要从网页中获取哪些信息。这些信息通常以某种结构(如列表、表格或字典)存在于HTML中。确定这些结构可以帮助你更精确地定位和解析数据。
2、使用更高级的查询选择器:在jsdom中,你可以使用更复杂的CSS选择器或者XPath来查找HTML元素。例如,你可以使用:nth-child(n)选择器来查找特定顺序的子元素,或者使用//前缀的XPath来查找任何位置的元素。
3、处理嵌套和动态内容:如果你的目标数据位于JavaScript动态加载的内容中,或者嵌套在复杂的DOM结构中,你可能需要更复杂的抓取策略。使用document.evaluate方法可以执行更复杂的XPath查询,帮助你获取深层次的DOM元素。
4、处理异步加载内容:有些网页的内容是异步加载的,也就是说它们不会在页面初次加载时出现在DOM中。你可以通过监听window.fetch或其他相关事件来等待并获取这些内容。
5、错误处理和异常处理:为你的代码添加错误处理逻辑,以防止例如网络中断、页面结构变化等问题导致的程序崩溃。你可以使用try/catch语句来捕获和处理这些异常。
6、优化性能:如果你的数据抓取任务需要处理大量的网页或者需要高频地运行,那么性能是非常重要的。你可以通过缓存网页内容、减少不必要的网络请求、并行处理任务等方式来提高性能。
7、遵守网站的使用条款和法律法规:最重要的一点是,你的数据抓取行为必须遵守所有相关的使用条款和法律法规。在抓取数据之前,确保你有权这么做,并且不会侵犯任何人的隐私或造成其他人的困扰。

总结

通过以上的探讨和实践,我们可以得出以下结论:

首先,使用TypeScript和jsdom进行网页数据抓取是一种高效且灵活的方式。TypeScript提供的静态类型检查和jsdom提供的浏览器环境模拟,对于从网页中提取和解析数据非常有帮助。

其次,要实现高效的数据抓取,我们需要熟练掌握并运用相关的工具和技术。这包括查询选择器、事件监听、异步加载处理等。

再次,在进行数据抓取时,我们必须遵守所有相关的使用条款和法律法规。尊重他人的隐私权和版权,不侵犯他人的权益,这是每一个数据抓取者应尽的义务。

最后,数据抓取是一项需要不断学习和提升的技能。随着网页结构和数据加载方式的日益复杂,我们需要不断地提升自己的技术水平,以便更准确地、更高效地获取到我们所需的数据。

总的来说,使用TypeScript和jsdom进行网页数据抓取是一种强大且高效的工具,通过学习和实践,我们可以更好地掌握它,从而为我们的数据处理和分析工作带来更多的可能性。

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

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

相关文章

iMazing苹果用户手机备份工具 兼容最新的iOS16操作系统

现在距离苹果秋季新品发布会已过去月余&#xff0c;新iPhone 14系列和新版的iOS 16操作系统也如约与我们见面了&#xff0c;相信大家在9月初抢购的iPhone 14也基本到手了&#xff0c;但随之到来的数据资料备份迁移却是一件令人头大的事情&#xff0c;使用官方提供的iTunes软件卡…

计算机网络,网络(OSI)七层模型,三次握手四次挥手,get与post请求区别,网络IO(BIO\NIO\AIO),TCP与UDP区别

1.OSI模型&#xff1f; 开放式系统互联通信参考模型(Open System Interconnection Reference Model) OSI网络七层模型&#xff1a;应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 TCP/IP协议群简化了OSI七层模型&#xff1a;应用层、传输层、网络层、数据链路…

java-各种成员变量初始化过程-待完善

前置条件 一、本文章讨论的成员变量 public static final String aa "aa";public static final Integer bb 1;public static final Students cc new Students();public static String aa1 "aa";public static Integer bb1 1;public static String bb2…

nodejs+vue中学信息技术线上学习系统-计算机毕业设计

因此&#xff0c;将现代化的计算机技术、网络技术以及多媒体等技术相结合&#xff0c;开发基于互联网的自主学习平台&#xff0c;为学生提供良好的自主学习环境&#xff0c;方便学生能够网上学习&#xff0c;师生通过该平台可以进行课后交流。目 录 摘 要 I ABSTRACT II 目 录 …

ssrf漏洞学习

目录 ssrf漏洞 相关函数 相关协议 file协议 dict协议 gopher协议 ctfshow ssrf web351 web352 web353 web354过滤01 web355五位长度 web356 三位长度 web357 DNS重定向 web358 正则 ssrf漏洞 SSRF&#xff08;Server-Side Request Forgery&#xff0c;服务器端请…

基于SSM的培训学校教学管理平台的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

ASCII_Util.java

package asc_ii;/*** 我写程序&#xff0c;写代码&#xff0c;做项目做产品&#xff0c;更加努力学习做人* 我曾经家里有两只狗&#xff0c;rocket就是那种小型犬吧&#xff0c;两耳朵跑起来飞舞着&#xff0c;我也不记得是不是舞蝶犬* 还有一条中型犬&#xff0c;“豆豆”&…

小程序实现后台数据交互及WXS的使用

一&#xff0c;数据交互准备工作 1.1 后端准备 后端部分代码&#xff0c;可自行创建后端代码 package com.zking.minoa.wxcontroller;import com.zking.minoa.mapper.InfoMapper; import com.zking.minoa.model.Info; import com.zking.minoa.util.ResponseUtil; import org…

FPGA【紫光语法】

寄存器数据类型&#xff1a; reg 默认为 1 bit wide&#xff0c;如果超过 1 bit&#xff0c;则需要 range declaration 设置 reg 的位宽integer 默认位宽为 32 bit&#xff0c;不允许有 range declarationtime 默认位宽为 64 bit&#xff0c;不允许有 range declarat…

黄金现货期货各有各的市场

投资黄金要获得高效的收益&#xff0c;投资者应该选择有一定资金杠杆的保证金品种&#xff0c;比如现货黄金和黄金期货就是这样投资方式&#xff0c;投资者都可以通过它们的杠杆来放大自己的收益&#xff0c;但二者始终存在区别&#xff0c;投资者到底该如何选择呢&#xff1f;…

(2023,DALL-E3,两步微调,标题重建)通过更好的标题改进图像生成

Improving Image Generation with Better Captions 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 重建数据集标题 2.1 构建图像标题器 2.1.1 微调标题器 3…

AI虚拟主播频繁亮相,未来会替代真人吗?灰豚AI数字人深度解析!

你可能听说过一些头部主播其实不是真人&#xff0c;而是由人工智能技术生成的虚拟数字人。这些数字人有着逼真的外貌、声音和表情&#xff0c;和真人几乎一模一样&#xff0c;可以在直播平台上和观众进行各种内容的展示和互动。那么&#xff0c;现在来考考你以下哪一个头部主播…

德施曼2023双十一全民换锁季,多款爆品持续引爆全民换购潮

每年双十一&#xff0c;对于各行业的商家来说都是必争之地&#xff0c;在智能锁领域也同样如此。国产高端智能锁品牌德施曼为了迎接此次双十一狂欢盛典&#xff0c;开启了双十一全民换锁季&#xff0c;携旗下多款爆品持续引爆全民换购热潮&#xff01; 德施曼全民换锁季 以旧换…

JOSEF约瑟 JJKY-30Z NK82-III检漏继电器 导轨或面板安装 0.1-50A

系列型号&#xff1a; JY82A检漏继电器 JY82B检漏继电器 JY82-380/660检漏继电器 JY82-IV检漏继电器 JY82-2P检漏继电器 JY82-2/3检漏继电器 JJKY检漏继电器 JD型检漏继电器 JY82-IV;JY82J JY82-II;JY82-III JY82-1P;JY82-2PA;JY82-2PB JJB-380;JJB-380/660 JD-12…

数据结构--线性表回顾

目录 线性表 1.定义 2.线性表的基本操作 3.顺序表的定义 3.1顺序表的实现--静态分配 3.2顺序表的实现--动态分配 4顺序表的插入、删除 4.1插入操作的时间复杂度 4.2顺序表的删除操作-时间复杂度 5 顺序表的查找 5.1按位查找 5.2 动态分配的方式 5.3按位查找的时间…

Vant Weapp的Slider组件自定义button

js部分: <van-slider v-model"value" range drag"priceChange" drag-end"sliderDragEnd" use-button-slot max"1000" min"0" step"10"><view class"custom-button" slot"left-button&…

如何使用LightPicture部署私人图床实现远程访问与图片管理?

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进&#xff0c;功能也越来越多&#xff0c;而手机…

ENVI IDL:对于GEOTIFF结构体的说明

Tag标签-前言 其中最关键的只有两个标签Tag&#xff0c;一个是MODELPIXELSCALETAG&#xff0c;一个是MODELTIEPOINTTAG。 至于ModelTransformationTag我没用过不了解&#xff0c;但是应该是关于仿射变换相关的&#xff0c;用于将像素坐标与地理/投影坐标进行转换的矩阵。 对于…

2000-2021年上市公司MA并购溢价计算数据(含原始数据+Stata代码)

2000-2021年上市公司M&A并购溢价计算&#xff08;原始数据Stata代码&#xff09; 1、时间&#xff1a;2000-2021年 2、范围&#xff1a;沪深A股上市公司 3、指标&#xff1a; 原始数据指标&#xff1a;事件ID、公司ID、证券代码、业务编码、上市公司交易地位编码、首次公…

ES1:index、type、document、mapping之间的关系

1.1 引言 由于长期使用es&#xff0c;但是对于es的大体结构存在疑惑&#xff0c;于是在此做一个大致总结。 1.2 数据存储结构 在 7.0版本之前&#xff0c;es的数据结构如下&#xff1a; 提示&#xff1a; 通过上图可知&#xff0c;在7.0之前elasticsearch的结构层级是&#…