基于playwright实现的金融网页表格爬虫,支持模型上下文协议 (MCP)。目前可用的查询来源包括
在实际操作中,如果某个网站崩溃或重新设计,可以立即切换到另一个网站。(注意:不同网站的表格结构不同,需要提前进行适配)
基于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())
Chrome。如果必须使用Edge,除了关闭Edge之外,还需要在任务管理器中关闭所有Microsoft Edge进程,即taskkill /f /im msedge.exe与requests不同,playwright基于浏览器并模拟用户在浏览器内的操作。
requests慢,但开发效率高数据获取包括:
json数据
requests,我们需要分析响应本项目通过模拟点击浏览器发送请求,采用拦截和解析响应的方法获取数据。
后期我们将根据不同的网站修订情况选择更合适的方法。
无头模式运行更快,但有些网站需要提前登录,因此必须指定无头模式的user_data_dir。否则可能需要登录。
endpoint=None时,headless=True可以启动一个新的无头浏览器实例。指定executable_path和user_data_dir以确保无头模式正常运行。endpoint以http://开头时,连接CDP模式下启动的头部浏览器,必须带有参数--remote-debugging-port。executable_path为本地浏览器路径。endpoint以ws://开头时,远程连接Playwright Server。这也是无头模式,但不能指定user_data_dir,因此使用受限
Chrome的新版安全策略默认无法创建user_data_dir,建议将配置目录复制到其他位置
确保可以在控制台执行python -m mcp_query_table -h。如果不可以,可能需要先pip install mcp_query_table
在Cline中可以如下配置。其中command是python的绝对路径,timeout是超时时间,单位为秒。在每个AI
由于平台上的返回时间经常超过1分钟,需要设置较大的超时时间。
{
"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"
]
}
}
}
首先在控制台执行以下命令启动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"
}
}
}
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使用提示2024年涨幅最大的前100只股票按其截至2024年12月31日的总市值排名。三个网站的结果不同
大语言模型的问题拆分能力较弱,因此需要能够提出合理的问题,并确保查询条件不变。推荐下面的第二和第三选项
大语言模型很可能拆分这个句子,导致一步查询被拆分为多步查询
用引号包裹以避免拆分
将搜索分成两步,先搜索板块,再搜索股票。但最好不要完全自动化,因为第一步的结果不理解“今天的涨幅”和“区间涨幅”,需要交互修正
Streamlit实现在同一页面查询金融数据,并手动输入到AI进行深入分析。参考streamlit目录下的README.md文档。
