让cursor使用Nest.js从零到实现定时爬取微博热搜

前言

在数字化浪潮中,微博热搜作为信息传播的关键节点,其数据价值不言而喻。

无论是用于舆情分析、内容创作还是商业决策或者是个人网站的展示,实时掌握这些微博热搜动态都至关重要。

今天,我将分享如何借助cursor+ Nest.js 框架,按照规范的方法实现微博热搜的定时爬取。

微博热搜数据接口解析

微博热搜数据通常通过其开放接口以 JSON 格式返回。

这些接口提供了热搜词、热度值、链接等关键信息,是后续分析与展示的数据基石。

Nest.js 规范实现爬取逻辑

项目结构搭建

按照 Nest.js 的模块化规范,cursor先帮我们创建一个nest项目,然后使用nest命令去创建相关文件,下面是整体的项目结构

1、创建实体类存到数据库

2、连接数据库

创建一个独立的模块 hot-search.module.ts,用于封装微博热搜相关功能。在该模块中,引入必要的提供者和服务。

同时,创建一个服务类 hot-search.service.ts,专门处理与微博热搜数据交互的逻辑。

服务类实现

在服务类中,使用 axios 进行 HTTP 请求,模拟浏览器行为以获取微博热搜数据。以下是核心代码片段:

typescript 复制代码
import { Injectable, Logger } from '@nestjs/common';
import axios from 'axios';

@Injectable()
export class HotSearchService {
    private readonly logger = new Logger(HotSearchService.name);
    private url = 'https://weibo.com/ajax/side/hotSearch'; // 微博热搜接口地址
    private headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    };

    async fetchHotSearch(): Promise<any> {
        try {
            const response = await axios.get(this.url, { headers: this.headers });
            return response.data;
        } catch (error) {
            this.logger.error(`Failed to fetch hot search data: ${error.message}`);
            return null;
        }
    }
}

定时任务实现

利用 Nest.js 的 @Cron() 装饰器,可以轻松实现定时爬取功能。在服务类中添加以下代码,实现每隔一段时间自动爬取微博热搜数据:

typescript 复制代码
import { Cron } from '@nestjs/schedule';

// 在 HotSearchService 类中
@Cron('0 0-59/1 * * * *') // 每分钟执行一次
async handleCron() {
    this.logger.log('Start fetching hot search data...');
    const data = await this.fetchHotSearch();
    if (data) {
        // 在此处处理获取到的数据,如存储到数据库或进行其他操作
        this.logger.log('Hot search data fetched successfully');
    }
}

错误处理与日志记录

在代码中,使用了 try-catch 结构来捕获请求过程中的异常,并通过 Logger 类记录操作日志。这样可以在出现问题时快速定位,并跟踪爬取任务的执行情况。

控制器与路由

创建一个控制器 hot-search.controller.ts,定义路由以暴露相关接口:

typescript 复制代码
import { Controller, Get } from '@nestjs/common';
import { HotSearchService } from './hot-search.service';

@Controller('hot-search')
export class HotSearchController {
    constructor(private readonly hotSearchService: HotSearchService) {}

    @Get()
    async getHotSearch() {
        return await this.hotSearchService.fetchHotSearch();
    }
}

也写一个接口,支持手动触发,这样就不用每次都要整点才会触发

最终的效果

总结

通过cursor帮我们从0实现了一个微博热搜,使用 Nest.js 框架,我们可以按照规范的方式实现微博热搜的定时爬取,cursor生成的代码结构,代码都是非常简洁,扩展性还是很高的。

这种实现方式不仅代码结构清晰,便于维护和扩展,而且利用了框架提供的强大功能,如模块化、依赖注入、定时任务等,使整个爬取流程更加稳定和高效。

这种方法适用于需要定时获取动态数据的多种场景,为数据分析和业务决策提供了有力支持。

相关推荐
用户5394187290715 小时前
Cursor 用着用着就抽风?补全失灵、Agent 乱改、一直转圈、额度狂掉,我整理了一张对症排查表
ai编程·cursor
用户539418729072 天前
祖传项目一行测试都没有、改一下全靠赌?我用 Cursor 逐步补出最小测试安全网
ai编程·cursor
jerrywus2 天前
让 AI 写完代码后交一份报告:我改造了 answer-me-with-html
前端·claude·cursor
code_Bo2 天前
从策划到上线:我和 AI 一起做了个微信记账小程序
前端·ai编程·cursor
一缕82年的清风3 天前
Windsurf 凭什么敢叫板 Cursor?深度实测一周,聊聊底层机制与真实心路
claude·cursor
一缕82年的清风4 天前
上下文工程(Context Engineering):为什么说它是 AI 编程时代最重要的核心内功?
claude·cursor
网络毒刘4 天前
国庆后开工第一周:用一张 Cursor 能力地图安排学习路径(Rules→MCP→工作流)
cursor·工作流·rules·mcp·学习路径
全栈Agent 小李6 天前
【无标题】
前端·后端·agent·ai编程·全栈·cursor·mcp
网络毒刘6 天前
开源模型推理网关 + Cursor:通过兼容 API 切换后端,控制成本与延迟
开源·cursor·成本·工具实践·推理网关
一缕82年的清风7 天前
从Cursor杀向命令行:当AI接管终端,为什么资深架构师反而很少开IDE了?
claude·cursor·gemini