项目介绍
通过 TypeScript 实现一个简单的爬虫程序,从豆瓣电影 Top 250 页面抓取电影的标题和评论信息,并将数据存储到本地 JSON 文件中。该项目使用了 superagent
和 cheerio
两个核心工具:
- superagent:一个轻量的 HTTP 请求库,用于获取网页 HTML 内容。
- cheerio:一个类似 jQuery 的 HTML 解析库,方便从 HTML 中提取需要的数据。
代码详解
1. 数据结构设计
interface Target {
name: string;
comment: string;
}
interface StoreData {
time: number;
data: Target[];
}
Target
接口用于存储每部电影的标题和评论。StoreData
接口用于存储整个数据集合以及时间戳,便于后续分析。
2. 发送请求获取 HTML 内容
let res = await supporagent.get(url);
let html = res.text;
- 通过
superagent.get()
方法发送 HTTP 请求,获取网页 HTML 内容并存储在html
变量中。
3. HTML 解析与数据提取
let allContent = cheerio.load(html);
let fileItems = allContent('.item');
- 使用
cheerio.load()
将 HTML 加载为可操作的 DOM 结构。 fileItems
存储了所有电影条目元素,便于遍历提取信息。
4. 写入 JSON 文件
fs.writeFile('movie1.json', JSON.stringify(storeData), 'utf-8', (err) => {
if (err) {
console.log(err);
} else {
console.log('写入成功');
}
});
- 将提取到的数据写入
movie.json
文件中,确保内容保存成功。
完整代码
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;
// 解析 HTML
let 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();
凡是过去,皆为序章;凡是未来,皆有可期。