前言:为什么一个新闻系研究生要写代码?

我是东北师范大学新闻传播专业的一名研一学生。在我们课题组的日常研究中,捕捉“社会痛点”和“负面舆情”是必备内容

但现实很骨感:面对海量的信息流,人工筛选就像在大海捞针。传统爬虫只能抓标题,关键词匹配(Regex)又太笨,经常把“好日子”误判为负面新闻,或者漏掉那些阴阳怪气的“高级黑”。

为了解决这个痛点,我利用 Python 和最新的 LLM(大语言模型)技术,给自己开发了一个“全自动舆情监测智能体(AI Agent)”。它能每天自动醒来,帮我搜遍人民日报、澎湃新闻、光明网,把真正值得关注的社会争议新闻发到我的邮箱里。

今天分享一下这个项目的核心技术难点和我的解决方案。


一、 项目架构:不仅仅是爬虫

这个项目不仅仅是一个脚本,它符合 AI Agent(智能体) 的感知、决策、执行三要素:

  • 感知层(Eyes): 使用 Async Playwright 进行异步网页采集,专门对抗动态渲染。

  • 决策层(Brain): 接入 DeepSeek 大模型 API,用语义理解替代关键词匹配,精准识别“社会舆情”。

  • 执行层(Hands): 结合 macOS Automator 和 SMTP 协议,实现无感运行和邮件推送。

二、 技术挑战 1:SPA 页面的“状态丢失”难题

这是我在开发中最头疼的问题。以某主流新闻客户端(WAP版)为例,它是一个典型的 SPA(单页应用)。

问题复现: 我想获取新闻的真实链接,必须“点击”标题进入详情页,拿到 URL 后再“后退”回列表。 但是,每次执行 page.go_back() 后,页面 DOM 树会重置!之前我辛苦点击“加载更多”刷出来的 40 条新闻,瞬间变回了初始的 10 条。脚本直接傻眼,找不到第 11 条新闻,程序崩溃。

解决方案:自动状态恢复逻辑 我参考了前端状态管理的思路,在 Python 里写了一套“死磕复活”机制:

Python

# 核心逻辑伪代码
for i in range(target_count):
    # 每次操作前,先检查页面上的新闻数量够不够
    current_items = page.locator(selector)
    
    if await current_items.count() <= i:
        print(f"⚠️ 检测到页面重置 (当前{current_items.count()}条 < 目标{i+1})")
        
        # 触发状态恢复:疯狂点击加载,直到列表长度恢复
        while await current_items.count() <= i:
            await load_more_btn.click()
            await page.wait_for_timeout(1000)
            
    # 状态恢复后,继续点击下一条...

这段逻辑让我的 Agent 具备了极强的鲁棒性,无论页面怎么刷新,它都能“顽强”地恢复到之前的工作状态。

三、 技术挑战 2:如何让 AI 读懂“舆情”?

把几万字的新闻扔给 AI 既费钱又慢。我设计了一套 “硬过滤 + 软筛选” 的漏斗机制:

  1. Python 硬过滤: 在代码层面维护一个 BLACKLIST(黑名单),直接过滤掉包含“会议”、“致辞”、“正能量”等明显非舆情类的新闻。这帮我节省了 80% 的 Token 成本。

  2. DeepSeek 语义分析: 将清洗后的数据喂给 DeepSeek,配合精心设计的 Prompt(提示词):

“你是一名社会舆情分析师。请过滤掉所有成就展示和领导动态,重点保留恶性治安事件、食品安全、烂尾楼、就业困难及网友争议话题...”

结果惊人:DeepSeek 能精准识别出像“磷脂0含量骗局”这种不仅没有敏感词,但极具社会争议的新闻。

四、 自动化部署:让 Mac 成为服务器

为了让它每天自动运行,我没有买云服务器,而是榨干了我的 MacBook Air (M1)。

我遇到了 macOS “App Nap(应用小憩)” 的坑:不插电或后台运行时,系统会杀掉 Python 进程。 最终我通过编写 Shell 启动脚本 (start_bot.sh) 并结合 Automator 的日历触发器,成功实现了“静默运行”。现在,每天下午 4 点,它都会准时通过 Mac 通知中心向我汇报工作。

五、 总结与反思

作为一名文科生,编程带给我的不仅仅是效率,更是一种“工程化思维”。如果你也对“计算传播”或“Python 自动化”感兴趣,欢迎在评论区交流!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐