当前位置: 首页 > news >正文

基于 Python + LangChain + MCP(新闻查询)

创建 news_server.py MCP 服务器新闻搜索 MCP Server - 使用百度新闻搜索 import re import urllib.parse import requests from mcp.server.fastmcp import FastMCP mcp FastMCP(News) HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36, Accept-Language: zh-CN,zh;q0.9, } def _search_baidu_news(keyword: str, count: int 5) - list[dict]: 从百度新闻搜索结果中提取新闻列表 url https://www.baidu.com/s params { tn: news, word: keyword, rn: str(count), } resp requests.get(url, paramsparams, headersHEADERS, timeout15) resp.encoding utf-8 html resp.text results [] # 百度新闻搜索结果的每个条目在 div classresult-op 或 div classresult 中 # 提取标题、链接、来源、时间、摘要 blocks re.findall( rdiv\sclassresult[^]*[^]*(.*?)/div\s*/div, html, re.DOTALL, ) if not blocks: # 备用正则匹配更宽泛的结构 blocks re.findall( rh3[^]*classc-title[^]*[^]*(.*?)/div\s*(?:div[^]*)?\s*/div, html, re.DOTALL, ) for block in blocks[:count]: news {} # 标题 title_match re.search(rh3[^]*(.*?)/h3, block, re.DOTALL) if title_match: news[title] re.sub(r[^], , title_match.group(1)).strip() else: continue # 链接 link_match re.search(rhref[\]?(https?://[^\\s]), block) news[url] link_match.group(1) if link_match else # 来源和时间 - 通常在 p classc-author 或 span classc-color-gray 中 author_match re.search( r(?:c-author|c-color-gray|news-meta)[^]*(.*?), block, re.DOTALL, ) if author_match: meta re.sub(r[^], , author_match.group(1)).strip() news[meta] meta else: news[meta] # 摘要 summary_match re.search( rspan\sclassc-font-normal[^]*[^]*(.*?)/span, block, re.DOTALL ) if not summary_match: summary_match re.search( rclassc-span-last[^]*[^]*(.*?)/div, block, re.DOTALL ) if summary_match: news[summary] re.sub(r[^], , summary_match.group(1)).strip() else: news[summary] results.append(news) return results mcp.tool() def search_news(keyword: str, count: int 5) - str: 根据关键词搜索百度新闻。参数 keyword 为搜索关键词count 为返回条数默认5条最多10条。 count max(1, min(10, count)) try: results _search_baidu_news(keyword, count) if not results: return f未找到与「{keyword}」相关的新闻。 lines [f 关键词「{keyword}」的搜索结果共 {len(results)} 条\n] for i, news in enumerate(results, 1): lines.append(f{i}. {news[title]}) if news[meta]: lines.append(f {news[meta]}) if news[summary]: lines.append(f {news[summary]}) if news[url]: lines.append(f {news[url]}) lines.append() return \n.join(lines) except requests.exceptions.RequestException as e: return f搜索新闻失败: {e} if __name__ __main__: mcp.run(transportstdio)在 mcp_client.py 中注册新闻 MCP# MCP 服务器配置 - 在此注册所有 MCP 服务器 MCP_SERVERS { weather: { transport: stdio, command: sys.executable, args: [os.path.join(os.path.dirname(__file__), mcp_servers, weather_server.py)], }, news: { transport: stdio, command: sys.executable, args: [os.path.join(os.path.dirname(__file__), mcp_servers, news_server.py)], }, }
http://www.zskr.cn/news/1398155.html

相关文章:

  • 2026年实用AI写作辅助软件全攻略(含保姆级操作教程)
  • 从DC-9靶场实战,聊聊那些容易被忽略的‘敲门’服务(knockd)与SSH端口隐藏技巧
  • CTF新手必看:从PolarCTF靶场实战,手把手教你搞定DOCX隐写和伪加密压缩包
  • 数据库死锁分析与解决实战
  • 有哪些真正好用的降AIGC平台?能同时不降文笔还能清零AI疑似率的那种
  • 网络排障手记:同网段内两个IP,为何Ping的结果一好一坏?
  • A51宏汇编器预定义宏详解与应用技巧
  • 住宅 IP 和机房 IP 有什么区别?跨境账号为什么不能只看 IP 国家
  • SAP接口分页功能添加
  • 别再乱接线了!ESP8266-01s连接USB转TTL模块的保姆级避坑指南(附外部电源方案)
  • 数据分析师必备:用Python/Pandas实操贾俊平《统计学》里的那些核心概念(附代码)
  • 2026乐山美食攻略:乐山本地人推荐的小吃/乐山本地人美食推荐/乐山特色小吃店/乐山特色小吃有哪些/乐山美食什么好吃/选择指南 - 优质品牌商家
  • 基于LDA的Olivetti人脸降维与身份识别
  • 湿式双离合变速器微滑控制方法【附代码】
  • 从工具到AI操作系统:Agent技术演进全解析(2026)
  • 趣味智能陪伴!基于魔珐星云的宠物专属数字助手
  • 情感分析入门踩坑实录:我用知网词典+Python分析微博,结果翻车了…
  • 【鲁棒】分布式港口-哈密顿系统(Port–Hamiltonian)鲁棒调控的李雅普诺夫方法附Matlab代码
  • 2026年玫瑰爽肤水优质推荐榜:清爽型洗面奶/滋润型洗面奶/精华保湿水/美白洗面奶/美白补水提亮肤色爽肤水/美白补水收缩毛孔爽肤水/选择指南 - 优质品牌商家
  • 用Python和蒙特卡洛树搜索(MCTS)从零实现一个会自我对弈的五子棋AI
  • 从微分方程到算法稳定性:Gronwall不等式在数值计算中的实战应用(附Python代码)
  • 告别调参玄学:手把手教你用CSPStage和四检测头优化YOLOv8,轻松复现GC10-DET涨点
  • NumPy 创建数组
  • Arch Linux虚拟机里,用Xfce桌面+Fcitx5搞定中文输入,还顺手配了个VNC远程桌面
  • 2026 直播培训平台怎么选?三大核心维度深度解析
  • 单片机iwdg实验
  • 告别调参玄学:用Python手把手实现L1-ball投影,给你的模型加个‘稀疏’开关
  • 订单状态机别写散:我在 Rust CRM 里把 6 个状态收进领域模型
  • LangChain Day4 课程:回调、持久化、日志追踪
  • 基于CT+NMF+ANN的鲁棒图像水印技术:原理、实现与优化