Query Table

Um rastreador de tabelas financeiras da web usando Playwright que consulta dados de vários sites com alternância de fallback.

Documentação

mcp_query_table

  1. Rastreador de tabelas de páginas financeiras implementado com base em playwright, suportando Model Context Protocol (MCP) . Atualmente, as fontes consultáveis são:

    Em operação real, se um site estiver fora do ar ou passar por reformulação, você pode alternar imediatamente para outro site. (Observação: diferentes sites têm estruturas de tabela diferentes, sendo necessária adaptação antecipada.)

  2. Rastreador de chamadas de modelo de linguagem grande implementado com base em playwright. As fontes atualmente disponíveis são:

    RooCode fornece o recurso Human Reply. No entanto, descobriu-se que a versão web do 纳米搜索 corrompe a formatação ao copiar, então este recurso foi desenvolvido.

Instalação

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

Uso

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())

Observações

  1. O navegador ideal é o Chrome. Se for necessário usar o Edge, além de fechar todas as janelas do Edge, também é preciso encerrar todos os processos do Microsoft Edge no Gerenciador de Tarefas, ou seja, taskkill /f /im msedge.exe.
  2. Garanta a largura da janela do navegador para evitar que alguns sites se adaptem automaticamente à versão mobile, causando falha na consulta de tabelas.
  3. Se você tiver conta em algum site, faça login antecipadamente. Esta ferramenta não possui função de login automático.
  4. Diferentes sites têm estruturas de tabela diferentes, e o número de ações retornadas para a mesma condição também varia. É necessário fazer adaptação após a consulta.

Princípio de Funcionamento

Diferente do requests, o playwright é baseado em navegador, simulando as operações do usuário no navegador.

  1. Não é necessário resolver problemas de login.
  2. Não é necessário lidar com construção de requisições ou análise de respostas.
  3. É possível obter dados de tabela diretamente, o que você vê é o que você obtém.
  4. A velocidade de execução é mais lenta que a do requests, mas a eficiência de desenvolvimento é alta.

A obtenção de dados inclui:

  1. Análise direta de tabelas HTML
    1. Os números são convertidos em texto, o que não é favorável para pesquisas posteriores.
    2. Maior aplicabilidade.
  2. Interceptar requisições e obter os dados json retornados
    1. Semelhante ao requests, é necessário fazer análise de resposta.
    2. Menos flexível; após reformulação do site, é necessário refazer a adaptação.

Este projeto utiliza a simulação de cliques no navegador para enviar requisições, e o método de interceptar e analisar respostas para obter dados.

No futuro, métodos mais adequados serão utilizados de acordo com as reformulações dos diferentes sites.

Modo Headless

O modo headless é mais rápido, mas alguns sites exigem login antecipado. Portanto, no modo headless é obrigatório especificar user_data_dir, caso contrário, pode ser solicitado login.

  • Quando endpoint=None, o headless=True pode iniciar uma nova instância do navegador em modo headless. Especifique executable_path e user_data_dir para garantir o funcionamento normal no modo headless.
  • endpoint começa com http://, conectando-se a um navegador com interface gráfica iniciado no modo CDP. O parâmetro --remote-debugging-port é obrigatório. executable_path é o caminho local do navegador.
  • endpoint começa com ws://, conectando-se a um Playwright Server remoto. Também é modo headless, mas não é possível especificar user_data_dir, portanto o uso é limitado.

A nova política de segurança do Chrome impede a criação do serviço CDP ao usar o user_data_dir padrão. Recomenda-se copiar o diretório de configuração para outro local.

Suporte MCP

Certifique-se de que python -m mcp_query_table -h pode ser executado no console. Se não for possível, talvez seja necessário pip install mcp_query_table primeiro.

No Cline, a configuração pode ser feita da seguinte forma. command é o caminho absoluto do python, e timeout é o tempo limite em segundos. Nas plataformas AI, como o tempo de retorno geralmente excede 1 minuto, é necessário definir um tempo limite maior.

Modo 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"
      ]
    }
  }
}

Modo SSE

Primeiro, execute o seguinte comando no console para iniciar o serviço 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"

Em seguida, você pode se conectar ao serviço MCP:

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

Modo 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"

O endereço de conexão é http://127.0.0.1:8000/mcp.

Depuração com MCP Inspector

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

Abrir o navegador e navegar pelas páginas é uma operação que consome tempo e pode causar timeout na página MCP Inspector. Você pode usar http://localhost:5173/?timeout=300000 para definir o tempo limite como 300 segundos.

Esta é a primeira tentativa de escrever um projeto MCP, pode haver vários problemas. Todos são bem-vindos para trocar ideias.

Dicas de uso do MCP

  1. As 100 ações com maior valorização em 2024, classificadas pela capitalização de mercado total em 31 de dezembro de 2024. Os resultados dos três sites são diferentes.

    • 同花顺: exibiu 2.201 ações. As 5 primeiras são 工商银行, 农业银行, 中国移动, 中国石油 e 建设银行.
    • 通达信: exibiu 100 ações. As 5 primeiras são 寒武纪, 正丹股份, 汇金科技, 万丰奥威 e 艾融软件.
    • 东方财富: exibiu 100 ações. As 5 primeiras são 海光信息, 寒武纪, 光启技术, 润泽科技 e 新易盛.
  2. Os modelos de linguagem grande têm capacidade fraca de dividir problemas, portanto, é necessário fazer perguntas de forma razoável para garantir que as condições de consulta não sejam alteradas. As opções 2 e 3 são recomendadas abaixo:

    • As 100 ações com maior valorização em 2024, classificadas pela capitalização de mercado total em 31 de dezembro de 2024

      É muito provável que o modelo de linguagem grande divida esta frase, fazendo com que uma consulta de uma etapa se torne várias etapas.

    • Consultar 东方财富: "As 100 ações com maior valorização em 2024, classificadas pela capitalização de mercado total em 31 de dezembro de 2024"

      Use aspas para evitar que seja dividido.

    • Consultar o setor 东方财富: "os setores industriais com pior desempenho no ano passado" e, em seguida, consultar as 5 ações com melhor desempenho nesse setor no ano passado.

      Divida em duas etapas: primeiro consulte o setor e depois as ações. Mas é melhor não automatizar totalmente, pois o modelo não entende "variação diária" e "variação do período" nos resultados da primeira etapa, sendo necessária correção interativa.

Suporte a Streamlit

Permite consultar dados financeiros na mesma página e inseri-los manualmente no AI para análise aprofundada. Consulte o arquivo README.md no diretório streamlit.

streamlit

Referências