返回市场
查询表

查询表

作者:wukan198640 星标更新:2025-11-20

项目介绍

mcp_query_table

  1. 基于playwright实现的金融网页表格爬虫,支持模型上下文协议 (MCP)。当前可用的查询来源包括

    在实际操作中,如果某个网站崩溃或重新设计,可以立即切换到另一个网站。(注意:不同网站的表格结构不同,需要提前进行适配)

  2. 基于playwright实现的大语言模型调用爬虫。当前可用的来源包括

    RooCode提供了人类回复功能。但发现纳米搜索在复制网页版时格式会损坏,因此开发了此功能

安装

pip install -i https://pypi.org/simple --upgrade mcp_query_table
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade mcp_query_table

使用

import asyncio

from mcp_query_table import *


async def main() -> None:
    async with BrowserManager(endpoint="http://127.0.0.1:9222", executable_path=None, devtools=True) as bm:
        # 问财需要保证浏览器宽度>768,防止界面变成适应手机
        page = await bm.get_page()
        df = await query(page, '收益最好的200只ETF', query_type=QueryType.ETF, max_page=1, site=Site.THS)
        print(df.to_markdown())
        df = await query(page, '年初至今收益率前50', query_type=QueryType.Fund, max_page=1, site=Site.TDX)
        print(df.to_csv())
        df = await query(page, '流通市值前10的行业板块', query_type=QueryType.Index, max_page=1, site=Site.TDX)
        print(df.to_csv())
        # TODO 东财翻页要提前登录
        df = await query(page, '今日涨幅前5的概念板块;', query_type=QueryType.Board, max_page=3, site=Site.EastMoney)
        print(df)

        output = await chat(page, "1+2等于多少?", provider=Provider.YuanBao)
        print(output)
        output = await chat(page, "3+4等于多少?", provider=Provider.YuanBao, create=True)
        print(output)

        print('done')
        bm.release_page(page)
        await page.wait_for_timeout(2000)


if __name__ == '__main__':
    asyncio.run(main())

注意事项

  1. 最好使用浏览器Chrome。如果必须使用Edge,除了关闭Edge之外,还需要在任务管理器中关闭所有Microsoft Edge进程,即taskkill /f /im msedge.exe
  2. 浏览器应确保窗口宽度,以防止某些网站自动适应移动版,这可能导致表格查询失败
  3. 如果有网站账号,请提前登录。此工具没有自动登录功能
  4. 不同网站的表格结构不同,在相同条件下返回的股票数量也不同。需要在查询后进行适配

工作原理

requests不同,playwright基于浏览器并模拟用户在浏览器内的操作。

  1. 不需要解决登录问题
  2. 不需要构建请求和解析响应
  3. 可以直接获取表格数据,所见即所得
  4. 运行速度比requests慢,但开发效率高

数据获取包括:

  1. 直接解析HTML表格
    1. 数字化文本不利于后续研究
    2. 适用性最强
  2. 拦截请求并检索返回的json数据
    1. 类似于requests,我们需要分析响应
    2. 几乎没有灵活性,网站重新设计后需要重新适配

本项目通过模拟点击浏览器发送请求,采用拦截和解析响应的方法获取数据。

后期我们将根据不同的网站修订情况选择更合适的方法。

无头模式

无头模式运行更快,但某些网站需要提前登录,因此无头模式必须指定user_data_dir。否则可能需要登录。

  • endpoint=None时,headless=True可以启动一个新的无头浏览器实例。指定executable_pathuser_data_dir以确保无头模式正常运行。
  • endpointhttp://开头时,连接CDP模式下启动的无头浏览器,必须带有参数--remote-debugging-portexecutable_path是本地浏览器路径。
  • endpointws://开头时,远程连接Playwright Server。这也是无头模式,但不能指定user_data_dir,因此使用受限

Chrome的新版安全策略默认无法创建user_data_dir,建议将配置目录复制到其他位置

MCP支持

确保可以在控制台执行python -m mcp_query_table -h。如果不可以,可能需要先pip install mcp_query_table

Cline中可以如下配置。其中commandpython的绝对路径,timeout是超时时间,单位为秒。在每个AI 由于平台上的返回时间经常超过1分钟,需要设置较大的超时时间。

STDIO方法

{
  "mcpServers": {
    "mcp_query_table": {
      "timeout": 300,
      "command": "D:\\Users\\Kan\\miniconda3\\envs\\py312\\python.exe",
      "args": [
        "-m",
        "mcp_query_table",
        "--format",
        "markdown",
        "--endpoint",
        "http://127.0.0.1:9222",
        "--executable_path",
        "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
      ]
    }
  }
}

SSE方法

首先,在控制台执行以下命令启动MCP服务

python -m mcp_query_table --format markdown --transport sse --port 8000 --endpoint http://127.0.0.1:9222  --user_data_dir "D:\user-data-dir"

然后可以连接到MCP已提供的服务

{
  "mcpServers": {
    "mcp_query_table": {
      "timeout": 300,
      "url": "http://127.0.0.1:8000/sse"
    }
  }
}

Streamable HTTP方法

python -m mcp_query_table --format markdown --transport streamable-http --port 8000 --endpoint http://127.0.0.1:9222  --user_data_dir "D:\user-data-dir"

连接地址为http://127.0.0.1:8000/mcp

使用MCP Inspector进行调试

npx @modelcontextprotocol/inspector python -m mcp_query_table --format markdown --endpoint http://127.0.0.1:9222

打开浏览器并翻页是一个耗时的操作,可能会导致MCP Inspector页面超时,可以通过http://localhost:5173/?timeout=300000 表示超时时间为300秒

首次编写MCP项目可能会遇到各种问题,欢迎各位交流。

MCP使用提示

  1. 2024年涨幅最大的前100只股票按截至2024年12月31日的总市值排名。三个网站的结果不同

    • 同花顺:显示了2201只股票。前五名为工商银行、农业银行、中国移动、中国石油、建设银行
    • 同达新:显示了100只股票,前五名为寒武纪、正丹股份、汇金科技、万丰奥威、爱荣软件
    • 东方财富:显示了100只股票,前五名为海光信息、寒武纪、广信科技、润泽科技、新易盛
  2. 大语言模型的问题拆分能力较弱,因此需要能够提出合理的问题,并确保查询条件不变。推荐下面的第二和第三选项

    • 2024年涨幅最大的前100只股票按截至2024年12月31日的总市值排名

      大语言模型很可能拆分这句话,导致一步查询被拆分为多步查询

    • 在东方财富上搜索2024年涨幅最大的前100只股票按截至2024年12月31日的总市值排名

      用引号包裹以避免拆分

    • 在东方财富板块中搜索“去年涨幅最差的行业板块”,然后在该板块中搜索去年涨幅前五的股票

      将搜索分为两步,先搜索板块,再搜索股票。但最好不要完全自动化,因为第一步的结果不理解“今天的涨幅”和“范围涨幅”,需要交互修正

支持Streamlit

实现在同一页面查询金融数据,并手动输入到AI进行深入分析。参考streamlit目录下的README.md文档。

streamlit

参考