影刀RPA 自动化舆情监控:关键词预警与报告生成
📅 2026/7/24 0:17:48
👁️ 阅读次数
📝 编程学习
影刀RPA 自动化舆情监控:关键词预警与报告生成
作者:林焱
写在前面
品牌负面舆情一旦爆发,几个小时内可能蔓延全网。靠人工每天刷微博、知乎、新闻,根本来不及。影刀可以帮你搭一套7×24小时的舆情监控系统:定时采集多个平台的内容→关键词匹配→情感初步判断→有风险立即推送告警。
本文从零到一搭建这套系统。
一、系统架构
拼多多店群自动化报活动上架!
数据来源: ├── 微博(关键词搜索) ├── 知乎(话题搜索) ├── 新闻网站(RSS订阅) └── 百度指数(品牌声量) 处理流程: 采集数据 → 关键词过滤 → 情感判断 → 风险评分 → 告警/汇总报告二、RSS新闻监控(最简单稳定的方案)
很多新闻网站提供RSS订阅,不需要爬虫就能获取内容,是舆情监控的首选数据源。
importfeedparserimportrequestsimportjsonimporttimeimportdatetimeimportrefromcollectionsimportdefaultdictdefmonitor_rss_feeds(feed_urls,keywords,lookback_hours=24):""" 监控RSS新闻中的关键词 feed_urls: RSS地址列表 keywords: 监控关键词列表 lookback_hours: 只看最近N小时的内容 """cutoff_time=datetime.datetime.now()-datetime.timedelta(hours=lookback_hours)matched_articles=[]forfeed_urlinfeed_urls:try:feed=feedparser.parse(feed_url)forentryinfeed.entries:# 解析发布时间ifhasattr(entry,'published_parsed'):importcalendar pub_time=datetime.datetime.fromtimestamp(calendar.timegm(entry.published_parsed))else:pub_time=datetime.datetime.now()# 只处理时间窗口内的文章ifpub_time<cutoff_time:continue# 标题+摘要全文搜索full_text=f"{entry.get('title','')}{entry.get('summary','')}"matched_keywords=[kwforkwinkeywordsifkwinfull_text]ifmatched_keywords:matched_articles.append({"来源":feed.feed.get('title',feed_url),"标题":entry.get('title',''),"摘要":entry.get('summary','')[:200],"链接":entry.get('link',''),"发布时间":pub_time.strftime('%Y-%m-%d %H:%M'),"命中关键词":", ".join(matched_keywords),})exceptExceptionase:print(f"RSS采集失败:{feed_url}-{e}")returnmatched_articles# 配置RSS源RSS_FEEDS=["https://36kr.com/feed",# 36氪"https://www.huxiu.com/rss/",# 虎嗅"https://www.ifanr.com/feed",# 爱范儿"https://news.qq.com/rss/tech.xml",# 腾讯科技# 还可以添加各平台的搜索RSS:如百度新闻、Google News的搜索结果RSS]# 监控关键词KEYWORDS=["品牌A","品牌A食品","品牌A安全","公司名称","产品名"]articles=monitor_rss_feeds(RSS_FEEDS,KEYWORDS)print(f"发现{len(articles)}篇相关文章")三、情感分析(判断正面/负面)
fromsnownlpimportSnowNLP# pip install snownlp# 负面词汇词典(可自定义扩展)NEGATIVE_WORDS=["投诉","举报","欺诈","虚假","问题","缺陷","召回","致癌","危险","事故","处罚","罚款","违规","索赔","退款","维权","曝光","负面","差评","中毒","过期"]POSITIVE_WORDS=["好评","推荐","优质","创新","突破","荣获","获奖","上市","合作","融资","获批","认证"]defanalyze_sentiment(text):""" 情感分析,返回风险级别 returns: (sentiment_score, risk_level) """# SnowNLP情感得分:0-1,越接近1越正面try:sentiment_score=SnowNLP(text).sentimentsexcept:sentiment_score=0.5# 无法判断时返回中性# 负面词计数negative_count=sum(1forwordinNEGATIVE_WORDSifwordintext)positive_count=sum(1forwordinPOSITIVE_WORDSifwordintext)# 综合判断风险级别ifnegative_count>=3orsentiment_score<0.2:risk_level="高风险"elifnegative_count>=1orsentiment_score<0.4:risk_level="中风险"elifpositive_count>=2orsentiment_score>0.7:risk_level="正面"else:risk_level="中性"returnsentiment_score,risk_level,negative_count# 对采集到的文章进行情感分析forarticleinarticles:score,risk,neg_count=analyze_sentiment(article['标题']+' '+article['摘要'])article['情感得分']=round(score,3)article['风险级别']=risk article['负面词数量']=neg_count# 按风险排序articles.sort(key=lambdax:['高风险','中风险','中性','正面'].index(x.get('风险级别','中性')))四、实时告警推送
defsend_alert(articles,webhook_url):""" 推送高风险内容告警 """high_risk=[aforainarticlesifa.get('风险级别')=='高风险']ifnothigh_risk:returnalert_content=f"## ⚠️ 舆情风险告警\n\n"alert_content+=f"发现 **{len(high_risk)}** 条高风险内容,请立即关注:\n\n"fori,articleinenumerate(high_risk[:5],1):# 最多显示5条alert_content+=f"**{i}. [{article['标题']}]({article['链接']})**\n"alert_content+=f"> 来源:{article['来源']}| 时间:{article['发布时间']}\n"alert_content+=f"> 命中关键词:`{article['命中关键词']}`\n"alert_content+=f">{article['摘要'][:100]}...\n\n"iflen(high_risk)>5:alert_content+=f"\n> 还有{len(high_risk)-5}条未展示,请查看完整报告\n"# 发送到企业微信群importrequests payload={"msgtype":"markdown","markdown":{"content":alert_content}}resp=requests.post(webhook_url,json=payload)print(f"告警已推送:{resp.json()}")ALERT_WEBHOOK="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的key"send_alert(articles,ALERT_WEBHOOK)五、每日舆情汇总报告
importopenpyxlfromopenpyxl.stylesimportPatternFill,Font,Alignmentdefgenerate_daily_report(articles,output_file=None):"""生成每日舆情汇总Excel报告"""ifoutput_fileisNone:date_str=datetime.datetime.now().strftime('%Y%m%d')output_file=f"舆情监控报告_{date_str}.xlsx"wb=openpyxl.Workbook()# Sheet1:概览ws_summary=wb.active ws_summary.title="每日概览"total=len(articles)risk_counts=defaultdict(int)forainarticles:risk_counts[a.get('风险级别','未知')]+=1ws_summary.append(["舆情监控日报",datetime.datetime.now().strftime('%Y-%m-%d')])ws_summary.append([])ws_summary.append(["风险级别","数量","占比"])forrisk_levelin['高风险','中风险','中性','正面']:count=risk_counts.get(risk_level,0)ws_summary.append([risk_level,count,f"{count/total*100:.1f}%"iftotalelse"0%"])ws_summary.append(["合计",total,"100%"])# Sheet2:明细ws_detail=wb.create_sheet("明细数据")headers=["来源","标题","风险级别","情感得分","命中关键词","发布时间","摘要","链接"]ws_detail.append(headers)# 设置标题样式forcellinws_detail[1]:cell.font=Font(bold=True)cell.fill=PatternFill(start_color="1565C0",fill_type="solid")cell.font=Font(bold=True,color="FFFFFF")# 风险级别对应颜色risk_colors={"高风险":"FF6B6B","中风险":"FFB347","中性":"E0E0E0","正面":"90EE90"}forarticleinarticles:row=[article.get('来源',''),article.get('标题',''),article.get('风险级别',''),article.get('情感得分',''),article.get('命中关键词',''),article.get('发布时间',''),article.get('摘要',''),article.get('链接',''),]ws_detail.append(row)# 按风险级别着色risk=article.get('风险级别','中性')color=risk_colors.get(risk,'E0E0E0')fill=PatternFill(start_color=color,fill_type="solid")forcellinws_detail[ws_detail.max_row]:cell.fill=fill# 调整列宽ws_detail.column_dimensions['B'].width=40ws_detail.column_dimensions['G'].width=50ws_detail.column_dimensions['H'].width=50wb.save(output_file)print(f"舆情报告已生成:{output_file}")returnoutput_fileTEMU店群矩阵自动化运营核价报活动
六、完整定时执行流程
defrun_sentiment_monitoring():"""完整的舆情监控流程"""print(f"[{datetime.datetime.now().strftime('%Y-%m-%d %H:%M')}] 开始舆情监控...")# 1. 采集articles=monitor_rss_feeds(RSS_FEEDS,KEYWORDS,lookback_hours=2)# 2. 情感分析forarticleinarticles:text=article['标题']+' '+article['摘要']score,risk,neg_count=analyze_sentiment(text)article.update({'情感得分':score,'风险级别':risk,'负面词数量':neg_count})# 3. 告警send_alert(articles,ALERT_WEBHOOK)# 4. 每天早上8点生成日报ifdatetime.datetime.now().hour==8:report_file=generate_daily_report(articles)print(f"日报已生成:{report_file}")print(f"监控完成,共分析{len(articles)}条内容")# 在影刀中设置每2小时执行一次run_sentiment_monitoring()七、踩坑记录
坑1:SnowNLP对网络语言识别不准
SnowNLP是基于微博语料训练的,对中规中矩的新闻文章识别准确率约70%。提高准确率的方法:结合自定义负面词典,负面词数量比情感得分更可靠。
坑2:RSS源有些不稳定
部分媒体的RSS地址会变化或停更。建议定期检查RSS是否还有更新,超过7天没新内容的RSS源标记为失效。
坑3:中文分词影响关键词匹配
直接字符串匹配"品牌A" in text可以用,但对"品/牌/A"这类被分词打散的情况无效。建议同时用jieba分词后匹配:"品牌A" in " ".join(jieba.cut(text))。
坑4:同一条内容被多个源重复收录
同一篇文章可能出现在多个RSS源里,需要URL去重。用文章链接的MD5作为唯一标识,已处理的链接存到文件或SQLite里,避免重复告警。
总结
舆情监控系统的三个核心:数据采集(RSS是最稳的免费方案)、情感判断(规则词典+SnowNLP双保险)、及时告警(企业微信群机器人实时推送)。搭好后,高风险内容第一时间到手机,不再靠人工刷屏。
署名:林焱
编程学习
技术分享
实战经验