TypeScript 爬虫项目实战:抓取豆瓣电影 Top 250(TypeScript简单应用)

server/2025/1/16 11:29:58/

项目介绍

通过 TypeScript 实现一个简单的爬虫程序,从豆瓣电影 Top 250 页面抓取电影的标题和评论信息,并将数据存储到本地 JSON 文件中。该项目使用了 superagentcheerio 两个核心工具:

  • superagent:一个轻量的 HTTP 请求库,用于获取网页 HTML 内容。
  • cheerio:一个类似 jQuery 的 HTML 解析库,方便从 HTML 中提取需要的数据。

代码详解

1. 数据结构设计
typescript">interface Target {name: string;comment: string;
}interface StoreData {time: number;data: Target[];
}
  • Target 接口用于存储每部电影的标题和评论。
  • StoreData 接口用于存储整个数据集合以及时间戳,便于后续分析。
2. 发送请求获取 HTML 内容
typescript">let res = await supporagent.get(url);
let html = res.text;
  • 通过 superagent.get() 方法发送 HTTP 请求,获取网页 HTML 内容并存储在 html 变量中。
3. HTML 解析与数据提取
typescript">let allContent = cheerio.load(html);
let fileItems = allContent('.item');
  • 使用 cheerio.load() 将 HTML 加载为可操作的 DOM 结构。
  • fileItems 存储了所有电影条目元素,便于遍历提取信息。
4. 写入 JSON 文件
typescript">fs.writeFile('movie1.json', JSON.stringify(storeData), 'utf-8', (err) => {if (err) {console.log(err);} else {console.log('写入成功');}
});
  • 将提取到的数据写入 movie.json 文件中,确保内容保存成功。

完整代码

typescript">import supporagent from 'superagent';
import * as cheerio from 'cheerio';
import fs from 'fs';// 数据结构定义
interface Target {name: string;comment: string;
}interface StoreData {time: number;data: Target[];
}// 目标网址
let url: string = 'https://movie.douban.com/top250';// 爬取数据的核心函数
async function getData() {let recommendationFiles: Target[] = [];// 发送请求获取 HTML 内容let res = await supporagent.get(url);let html = res.text;// 解析 HTMLlet allContent = cheerio.load(html);let fileItems = allContent('.item');// 遍历页面中的电影条目fileItems.each((index, item) => {let fname: string = allContent(item).find('.hd').find('.title').first().text();let comment: string = allContent(item).find('.inq').text();recommendationFiles.push({name: fname,comment: comment});});// 组织数据结构并写入文件let storeData: StoreData = {time: new Date().getTime(),data: recommendationFiles};fs.writeFile('movie1.json', JSON.stringify(storeData), 'utf-8', (err) => {if (err) {console.log(err);} else {console.log('写入成功');}});
}// 执行爬虫程序
getData();

凡是过去,皆为序章;凡是未来,皆有可期。


http://www.ppmy.cn/server/158809.html

相关文章

想法分享,利用html通过求输入框中用户输入数组的最大值

我有一个非常有趣的想法 做一个网页求用户输入的数组的最大值 1.直接让用户输入进一个类似数组的容器,输入几个数字之后,点击按钮 2.这个方法不行,因为form表单没有直接类似数组的容器,所以用input输入框代替 3.Input直接输入的是…

Unity3D实现加载.abc动画模型

系列文章目录 unity工具 文章目录 系列文章目录unity工具👉前言👉一、效果展示👉二、使用步骤👉2-1、导入插件👉2-1、导入模型👉三、实现代码控制动画👉四、加载解析👉4-1、数据读取与解析👉4-2、动画播放机制👉4-3、材质👉壁纸分享👉总结👉前言 .…

《C++11》并发库:简介与应用

在C11之前,C并没有提供原生的并发支持。开发者通常需要依赖于操作系统的API(如Windows的CreateThread或POSIX的pthread_create)或者第三方库(如Boost.Thread)来创建和管理线程。这些方式存在以下几个问题: …

关于反向传播算法个人的一些思考

关于反向传播算法个人的一些思考 非常简单的一个例子让情况变得复杂一些未完待续 本文为笔者个人对反向传播算法的一个理解,由于笔者也是刚刚踏上深度学习之路,所以很多地方可能理解的不到位,欢迎各位在评论处指出。 本文适合已经了解过反向传…

数组元素的删除

题目描述 把一个数组的第x个位置的元素删除掉 输入 有三行 第一行有一个整数n( n < 10 ) 第二行有n个整数 第三行有一个整数x&#xff0c;为要删除的位置 输出 输出更新后的数组 样例输入 复制 5 1 2 3 4 5 3 样例输出 复制 1 2 4 5 思路&#xff1a;偷个懒&…

Springboot + vue 小区物业管理系统

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

基于微信小程序的农产品自主供销系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

Django Admin中使用上下文处理器实现用户组权限控制

在Django项目开发中,我们经常需要根据用户的权限来控制页面上某些元素的显示。本文将介绍如何使用Django的上下文处理器(Context Processors)来实现这一功能,特别是在Django Admin中控制特定按钮的显示。 © ivwdcwso (ID: u012172506) 背景 假设我们有一个ECS服务管理系…