如何用Python抓取交互式图表数据并导出为CSV?
解决方法
你之前的代码存在几个关键问题:
- 用错了目标URL(你写的是fidelity的页面,不是crusaderpensions的)
- 直接用xpath获取的元素对象无法直接写入CSV,需要提取实际数据
- 没有正确定位到图表存储的数据来源
下面是可行的Python实现方案:
步骤说明
目标页面的图表数据是通过JavaScript动态加载的,实际数据存储在页面的脚本标签中,我们可以通过渲染页面后提取脚本中的JSON数据,再整理导出为CSV。
完整代码
from requests_html import HTMLSession import json from csv import DictWriter # 正确的目标URL url = 'https://crusaderpensions.com/services/fund-history/' s = HTMLSession() r = s.get(url) # 渲染页面,等待JS加载完成 r.html.render(sleep=2) # 查找包含基金历史数据的脚本标签 script_content = None for script in r.html.find('script'): if 'fundHistoryData' in script.text: script_content = script.text break if not script_content: print("未找到数据来源") exit() # 提取JSON数据部分 # 从脚本中截取fundHistoryData对应的JSON字符串 start_idx = script_content.find('fundHistoryData = ') + len('fundHistoryData = ') end_idx = script_content.find(';', start_idx) json_str = script_content[start_idx:end_idx].strip() # 解析JSON数据 fund_data = json.loads(json_str) # 定义CSV字段 columns = ['Fund_Type', 'Valuation_Date', 'Unit Price'] # 写入CSV文件 with open('crusader_fund_history.csv', 'w', newline='', encoding='utf-8') as f: writer = DictWriter(f, fieldnames=columns) # 写入表头 writer.writeheader() # 遍历每个基金的数据 for fund_type, entries in fund_data.items(): for entry in entries: # 整理成字典格式 row = { 'Fund_Type': fund_type, 'Valuation_Date': entry['date'], 'Unit Price': entry['price'] } writer.writerow(row) print("数据已成功导出到crusader_fund_history.csv")
代码说明
- 修正URL:使用你目标的crusaderpensions页面地址
- 渲染页面:通过
r.html.render()等待JavaScript加载完成,确保能获取到动态生成的数据 - 提取脚本数据:遍历页面脚本,找到存储基金数据的
fundHistoryData变量,截取并解析其JSON内容 - 整理并写入CSV:遍历解析后的基金数据,将每个条目整理为符合字段要求的字典,写入CSV文件,同时写入表头
内容的提问来源于stack exchange,提问作者purplemonstera
相关产品推荐
相关产品推荐

