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

发布于:2025-02-10 ⋅ 阅读:(109) ⋅ 点赞:(0)

项目介绍

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

  • 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();

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


网站公告

今日签到

点亮在社区的每一天
去签到