尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
基于Pyecharts的数据可视化开发(二)调用通义千问api分析爬虫数据
1. 爬虫数据接大模型分析卡在返回结构解析这一步上一篇把“广州市2023年天气情况”爬下来存成 CSV 之后很多人第一反应是直接把整份文件丢给大模型让它给结论。我一开始也这么干结果要么请求体超长被拒要么返回一大段散文根本没法往 Pyecharts 里塞。问题不在模型而在中间少了一层“结构化转换”大模型输出的是自然语言Pyecharts 要的是字段和数值两者之间必须有一个稳定的解析层。这篇就聚焦这条链路爬虫 CSV → 通义千问 API 分析 → 返回结构解析 → 字段清洗 → Pyecharts 图表映射。适合已经会 pandas 读表、想用大模型给数据“加一层解读”再可视化的同学。核心检索词就是 Pyecharts 数据可视化、通义千问 API、爬虫数据分析下面每一步都给可复制的配置和脚本。先说清楚大模型在这条链路里的定位它不是替代你算均值、算极值那些 pandas 一行就搞定它擅长的是把统计结果翻译成人话比如“7 月高温天数集中、昼夜温差收窄”这种结论再让你把结论和图表标题、注释绑定。所以正确姿势是先用 pandas 做确定性统计把统计摘要交给模型模型返回结构化 JSON你再解析成 Pyecharts 能用的字段。这样既省 token又避免模型瞎编数字。我试过直接把 300 多行原始记录拼成 messages 发过去返回的文本里数字和原始表对不上因为模型在长上下文里会“概括性失真”。改成只发统计摘要后结论稳定多了。下面从接入配置开始一步步把这条链路跑通。2. 通义千问 API 接入前置Base URL、Key 与模型 ID 三件套不管你是用 OpenAI 兼容 SDK 还是直接 requests调通义千问都要凑齐三件套Base URL、API Key、Model ID。这三个任何一个写错报错信息都不一样后面排障章节会逐个对照。Base URL 走兼容模式是https://dashscope.aliyuncs.com/compatible-mode/v1注意结尾是/v1不要多加/chat/completionsSDK 会自己拼。API Key 在阿里云百炼控制台的 API-KEY 管理里创建创建后只显示一次复制下来存好。Model ID 是最容易踩坑的地方控制台里模型叫 Qwen-Long但代码里传的 model 字段不一定是qwen-long。我实测下来分析长文本用qwen-long这个 ID 是能通的但有些账号或某些时段会提示模型不存在这时候去模型列表页核对当前可用的 ID别凭记忆写。如果你不想在阿里云和本地环境之间来回切也可以把兼容 OpenAI 协议的网关作为统一入口比如 TaoToken 的 API 地址https://taotoken.net/api它同样接受 Base URL Key Model ID 这套配置换 base_url 就能复用同一份脚本。这样做的实际好处是你本地只维护一套 OpenAI 客户端代码换模型只改 model 字段不用重写请求逻辑。配置建议走环境变量别硬编码。Windows 用setx DASHSCOPE_API_KEY sk-xxxmacOS/Linux 写进~/.zshrc或~/.bashrc的export DASHSCOPE_API_KEYsk-xxx。代码里用os.getenv(DASHSCOPE_API_KEY)读取。硬编码的风险是分享脚本时 Key 跟着泄露我见过有人把带 Key 的 notebook 传到公开仓库几分钟就被刷爆额度。验证 Key 是否可用用最小请求打一发别等整条链路写完才发现鉴权失败import os from openai import OpenAI client OpenAI( api_keyos.getenv(DASHSCOPE_API_KEY), base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1, ) resp client.chat.completions.create( modelqwen-long, messages[ {role: system, content: You are a helpful assistant.}, {role: user, content: 只回复两个字可用}, ], ) print(resp.choices[0].message.content)输出“可用”就说明三件套没问题。如果报from openai import OpenAI导入失败是 openai 库版本太旧pip install --upgrade openai升级即可。如果报 model 不存在去模型列表核对 ID。这一步过了再往下做数据转换。3. 可复制配置从 CSV 统计摘要到结构化 JSON 请求这一步是整个链路的核心。目标是把爬虫 CSV 变成“模型能读懂、返回能解析”的请求。分三段读表统计、拼请求体、约束返回格式。先读表并生成统计摘要。不要发原始行发聚合结果import pandas as pd import json df pd.read_csv(guangzhou_weather_2023.csv) df[date] pd.to_datetime(df[date]) summary { row_count: int(len(df)), date_range: [str(df[date].min().date()), str(df[date].max().date())], temp_high_avg: round(float(df[temp_high].mean()), 2), temp_low_avg: round(float(df[temp_low].mean()), 2), temp_high_max: float(df[temp_high].max()), rain_days: int((df[rainfall] 0).sum()), rain_total: round(float(df[rainfall].sum()), 2), monthly_rain: df.groupby(df[date].dt.month)[rainfall].sum().round(2).to_dict(), } print(json.dumps(summary, ensure_asciiFalse, indent2))monthly_rain的 key 是月份数字JSON 序列化后会变成字符串解析时注意转换。这个摘要大概几百 token比原始表小两个数量级。接着拼请求体关键是 system prompt 里强制模型只返回 JSON并给出字段 schemasystem_prompt 你是数据分析助手。根据用户提供的天气统计摘要输出严格 JSON不要任何解释文字。 JSON 结构 { overview: 一句话总体结论, highlights: [要点1, 要点2, 要点3], monthly_rain_rank: [{month: 1, rain: 0.0}], advice: 一句出行建议 } monthly_rain_rank 按 rain 从高到低排序。 user_prompt 统计摘要如下\n json.dumps(summary, ensure_asciiFalse) resp client.chat.completions.create( modelqwen-long, messages[ {role: system, content: system_prompt}, {role: user, content: user_prompt}, ], response_format{type: json_object}, ) raw resp.choices[0].message.content print(raw)response_format{type: json_object}是兼容模式下的 JSON 模式能大幅降低返回带 markdown 代码块的概率。但注意即使开了这个模型偶尔还是会在 JSON 前后加反引号所以解析前要清洗。如果你用 TaoToken 作为统一入口把base_url换成https://taotoken.net/api其余请求结构不变model 字段按你选的模型填。这样本地脚本不用为每个供应商写一套。清洗和解析返回import re def parse_model_json(text: str) - dict: text text.strip() text re.sub(r^(?:json)?, , text).strip() text re.sub(r$, , text).strip() return json.loads(text) data parse_model_json(raw) print(data[overview]) print(data[monthly_rain_rank])到这里模型返回的已经是带monthly_rain_rank列表的结构化数据可以直接喂给 Pyecharts。这一步的坑在于模型返回的 month 可能是字符串 1rain 可能是字符串 123.4渲染前统一转 int/float否则 Pyecharts 会把它们当类目而不是数值。4. 端到端验证把分析结果渲染成 Pyecharts 图表现在把解析后的数据映射到图表。用两个图月度降雨柱状图 高温低温折线图标题和注释用模型返回的 overview 和 highlights。from pyecharts import options as opts from pyecharts.charts import Bar, Line, Grid rank data[monthly_rain_rank] months [str(int(item[month])) 月 for item in rank] rains [float(item[rain]) for item in rank] bar ( Bar() .add_xaxis(months) .add_yaxis(月降雨量(mm), rains, color#5470c6) .set_global_opts( title_optsopts.TitleOpts( title广州2023年月度降雨量, subtitledata[overview], ), xaxis_optsopts.AxisOpts(name月份), yaxis_optsopts.AxisOpts(name降雨量(mm)), ) ) monthly_temp df.groupby(df[date].dt.month).agg( high(temp_high, mean), low(temp_low, mean) ).round(1) line ( Line() .add_xaxis([str(m) 月 for m in monthly_temp.index]) .add_yaxis(月均高温, monthly_temp[high].tolist(), is_smoothTrue) .add_yaxis(月均低温, monthly_temp[low].tolist(), is_smoothTrue) .set_global_opts( title_optsopts.TitleOpts(title广州2023年月均气温), yaxis_optsopts.AxisOpts(name温度(℃)), ) ) grid ( Grid() .add(bar, grid_optsopts.GridOpts(pos_bottom60%)) .add(line, grid_optsopts.GridOpts(pos_top60%)) ) grid.render(guangzhou_weather_report.html) print(渲染完成guangzhou_weather_report.html)打开生成的 HTML你应该看到上半部分是月度降雨柱状图副标题是模型给的一句话结论下半部分是双折线气温图。验证成功的标志有三个柱状图的月份顺序和monthly_rain_rank一致从高到低折线图 12 个月都有点副标题文字和模型返回的 overview 完全一致。如果副标题是空的说明data[overview]没取到回去检查 JSON 解析。如果柱状图 x 轴出现重复月份说明模型返回的 rank 里有重复项去重后再渲染。这一步跑通整条链路就闭环了爬虫 CSV → 统计摘要 → 通义千问 API → JSON 解析 → Pyecharts 渲染。5. 本篇常见报错排查401、token 超限与 choices 解析失败排障按报错原文对照别凭感觉改。401 Unauthorized / invalid_api_keyKey 没读到或写错。先确认os.getenv(DASHSCOPE_API_KEY)返回的不是 None再确认 Key 没有多余空格。如果你用的是 TaoToken 的 API 地址Key 也要换成对应平台的 Key别混用。400 invalid_parameter_error: Single round file-content exceeds token limit这是把原始行全塞进 messages 导致的。解决方式是只发统计摘要或者改用文件上传拿 fileid 再引用。我实测把 300 行原始记录直接拼 messages 必报这个换成摘要后一次通过。local proxy failed / connection error本地网络到 API 端点的连接问题。先确认 base_url 拼写兼容模式结尾是/v1不要写成/v1/chat/completions。如果公司网络有出口限制换网络环境重试别在代码里加代理配置。reading choices / KeyError: choices返回体里没有 choices通常是请求失败但没抛异常。打印resp原始内容看 error 字段。常见原因是 model ID 写错比如把qwen-long写成qwen_long或者账号没开通对应模型。json.decoder.JSONDecodeError模型返回带了 markdown 反引号或前后有解释文字。用第 3 节的parse_model_json清洗或者把 system prompt 里的“只返回 JSON”再强调一遍。如果还不行加一次重试把上一次的返回作为上下文让模型“只输出 JSON”。OAuth / auth.json 相关报错如果你在用 Claude Code 或 Codex 这类工具接模型认证走的是 OAuth 或 auth.json和本文的 API Key 模式不同。这类工具要配全三件套Base URL、Key、Model ID缺一个都会在启动时报认证失败。CC Switch、Cline MCP 同理配置项里 Base URL 填兼容模式地址Key 填 API KeyModel ID 填控制台核对的 ID。排障顺序建议先跑第 2 节的最小验证请求确认三件套没问题再跑第 3 节的统计摘要请求确认返回是 JSON最后跑第 4 节渲染确认字段类型对。哪一步断就查哪一步的报错。6. 继续往下走把这条链路固化成可复用脚本链路跑通后建议把它拆成三个函数build_summary(csv_path)、ask_model(summary)、render_charts(data, df)。这样换一份爬虫数据只改 CSV 路径就能复用。模型返回的highlights可以进一步做成图表注释比如在柱状图最高月加 markdown 标注让结论直接落在图上。如果你要长期跑这类“爬虫 模型分析 可视化”的任务可以考虑用 Coding Plan 把脚本工程化把 API 调用、重试、JSON 校验封装成模块避免每次手写。需要看模型返回效果、快速验证 prompt 的可以直接在模型对话里试改完 prompt 再落回脚本。API Key 管理和接入文档在控制台和文档页配置项对照着填别凭记忆。最后留一个实用技巧模型返回的 JSON 一定要做 schema 校验哪怕只是检查overview、highlights、monthly_rain_rank三个 key 是否存在。我踩过的坑是模型某次返回了monthly_rain而不是monthly_rain_rank渲染时直接 KeyError。加一行assert monthly_rain_rank in data就能提前拦住比在 Pyecharts 里报错好定位得多。
RELATED

相关推荐

舌苔识别系统毕设:从数据集到GUI的完整落地路径

舌苔识别系统毕设:从数据集到GUI的完整落地路径

简介:这份资源是面向计算机相关专业大四学生与项目实战学习者的毕业设计完整方案,主题为基于深度学习的舌苔识别检测鉴定系统,配套GUI界面、论文资料与可运行源码,适合作为毕设、课程设计或期末大作业的参考模板。压缩包共109个文…

📅 2026/10/4 16:43:14
OpenAI与Anthropic API协议对比:迁移避坑实战指南

OpenAI与Anthropic API协议对比:迁移避坑实战指南

1. 两套API协议差异的根源:不止是“换个单词”那么简单做AI应用开发的人,十有八九都经历过这种场景:项目初期用OpenAI跑通原型,后来客户要求换成Anthropic的Claude,或者反过来。乍一看都是“发一段JSON过去&#xff0c…

📅 2026/10/4 16:43:14
GPIO驱动开发:从电气特性到Linux内核的全栈实践

GPIO驱动开发:从电气特性到Linux内核的全栈实践

1. 这不是“点个灯”那么简单:GPIO驱动开发的真实战场 你搜“GPIO驱动开发”,首页弹出来的可能是“STM32点亮LED教程”“Linux下读取按键状态”——看起来就像教人拧螺丝。但我在车规级BMS(电池管理系统)和工业PLC模块上干了11年嵌…

📅 2026/10/4 16:43:14
MORE NEWS

更多资讯

📰

DAY1 HTML

一. HTML 初体验1. 第一步:鼠标右键 > 新建 > 文本文档 > 输入以下内容,并保存。2. 第二步:修改后缀为 .html ,然后双击打开即可。(这里的后缀名,使用 .htm 也可以,但推荐使用更标准的 .html 。)3…

📰

SpringBoot+Vue+MyBatis二手车交易系统:从需求分析到全栈实战

二手车交易系统这个项目,我拿到手里的第一反应是:它不能只做一个普通的增删改查。二手车和普通电商的最大区别在于商品的高度“非标性”,每一辆车的品牌、车龄、里程、排放标准、变速箱、所在地都不一样,而且从发布车源、买家看车…

📰

【ICML 2025】General Agents 论文解读:通用智能体必然包含世界模型|从强化学习理论视角

摘要 本文解读 ICML 2025 论文《General agents need world models》,也就是「通用智能体必然包含世界模型」这一结论的来源。该论文提出智能体即世界模型这一必要性定理,通过融合有界目标条件智能体的形式化定义、复合目标查询构造与信息论意义上的识别…

📰

量产烧录一致性如何保障?从镜像校验到产线防呆的工程实践

量产烧录这个环节,在整条电子制造业链条里存在感一直很低。很多人觉得它无非就是把编译好的固件写进存储芯片,点一下烧录器,看到绿色PASS,然后装箱出货。但我在原厂一级代理的位子上待了十几年,见过太多产品死在“烧录…

📰

【ICLR 2026】TMoW:测试时混合世界模型,让具身智能体持续适配动态环境|从具身智能体域适配视角

摘要 本文解读 ICLR 2026 论文《Test-Time Mixture of World Models for Embodied Agents in Dynamic Environments》。该论文提出 TMoW(测试时混合世界模型),通过融合多粒度原型路由、测试时原型细化与蒸馏混合模型增广,让基于语…

📰

UGUI弹窗毛玻璃背景新方案:截屏降采样+分离模糊,不依赖插件

做Unity项目,尤其是带商城、背包、副本入口这一类界面的时候,弹窗背景的高斯模糊几乎是躲不掉的审美需求。之前被Asset Store里的UI Gaussian Blur插件坑过一阵,装上去之后整个Canvas的渲染层级直接乱掉,URP下还有兼容问题&#x…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬