数据分析——ETF基金申购赎回清单

本文介绍了作者在一家人工智能企业担任数据标注工作时,遇到的从网页抓取并解析JSON数据以获取基金申赎清单的过程。作者首先尝试通过requests库获取HTML内容,发现数据是通过Ajax动态加载的。通过分析网络请求,找到了包含所需数据的JSON文件,并成功构造URL获取了数据。最后,展示了如何解析并提取所需字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

序言

2021年4月入职了南京一家数据导向的人工智能企业。这个岗位除了写些Python的脚本代码外,还有的工作就是文本标记。文本标记可以认为是人工将数据整理、清洗的一个过程,虽然比较枯燥但也是必不可少的环节。

在过去的半个多月里,我接触到了如何处理json文件。之前我也比较菜,接触到的都是可以用xpath直接匹配到html文件的那种,在现在的工作里我第一次接触到了json文件。现在我以民生加银沪深300ETF这个基金为例,通过分析它的json文件来处理它的申购赎回清单。

分析

据了解,一般只有以ETF三个字母结尾的基金才会有“申购赎回清单”,而这里只有“民生加银沪深300ETF”这一个基金是符合要求的。因此这次就不用写翻页功能了,因为只有一个符合要求的,所以只要单独处理这一个页面就行了,如图所示:

我们需要得到的是以下几个字段:基金代码、公告日期、持仓股票的名称、持仓股票的代码、持仓股票数量、现金替代标志、申购溢价比例、赎回折价比例和替代金额。可以看到上图这个页面里全都有了。

于是我写了以下的代码:

import requests


headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36',
    'Referer': 'http://www.msjyfund.com.cn/osoa/views/funds/fundDetail.html?fund_code=mcaSesVXrHU=&fund_type=M0Uo0ORwvYw=',
}
base_url = "http://www.msjyfund.com.cn/osoa/views/funds/fundDetail.html?fund_code=mcaSesVXrHU=&fund_type=M0Uo0ORwvYw="
html = requests.get(url=base_url, headers=headers).content.decode()
print(html)

运行后得到如下结果:

C:\Users\ABC\AppData\Local\Programs\Python\Python38\python.exe C:/Users/ABC/PycharmProjects/pythonProject/1.py
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<meta http-equiv="X-UA-Compatible" content="IE=9" />
		<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
		<link href="/osoa/css/style.css" rel="stylesheet" type="text/css">
		<title>民生加银</title>
	</head>
	<body>
		<!--header-->
		<div id="headerContent"></div>
		
		<!--banner-->
		<div class="banner_box banner_box1"></div>
		
		<!--content-->
		<div id="bodyContent">
			<div class="content bg_gray" id="funds_fundDetail">
				<div class="wrapfix pt290">
					<div class="prarea clearfix prarea1" style="background: #fcfcfe;">
						<div class="fl">
							<!-- 非货币型 -->
							<div id="tabs02" class="fhp_fund">
								<div class="jy_top clearfix">
									<p class="active" data-value="1">单位净值走势</p>
									<p data-value="2">累计净值走势</p>
								</div>
								<div class="jy_body">
									<div class="jy_bot" style="display: block;">
										<div class="tab03">
											<div class="jy_sub_tit clearfix">
												<a href="javascript:;" class="active" data-value="1">1月</a>
												<a href="javascript:;" data-value="3">3月</a>
												<a href="javascript:;" data-value="6">6月</a>
												<a href="javascript:;" data-value="12">1年</a>
												<a href="javascript:;" data-value="36">3年</a>
												<a href="javascript:;" data-value="40">今年以来</a>
												<a href="javascript:;" data-value="41">成立以来</a>
												<span class="nv_block">历史净值查询 &gt;</span>
											</div>
											<div class="jy_sub_body">
												<div class="jy_sub_bot" style="display: block;">
													<div class="jy_chart" id="fhp_fund_chat_yjbx">
													</div>
												</div>
											</div>
										</div>
									</div>
								</div>
							</div>
							
							<!-- 货币型 -->
							<div id="tabs02" class="hp_fund" style="display: none;">
								<div class="jy_top clearfix">
									<p class="active" data-value="3">七日年化收益率</p>
									<p data-value="4">万份收益</p>
								</div>
								<div class="jy_body">
									<div class="jy_bot" style="display: block;">
										<div class="tab03">
											<div class="jy_sub_tit clearfix">
												<a href="javascript:;" class="active" data-value="3">3个月</a>
												<a href="javascript:;" data-value="12">1年</a>
												<a href="javascript:;" data-value="36">3年</a>
												<a href="javascript:;" data-value="40">今年以来</a>
												<span class="nv_block">历史净值查询 &gt;</span>
											</div>
											<div class="jy_sub_body">
												<div class="jy_sub_bot" style="display: block;">
													<div class="jy_chart" id="hp_fund_chat_yjbx">
													</div>
												</div>
											</div>
										</div>
									</div>
								</div>
							</div>
						</div>
						<div class="fr" id="fund_base_info">
							<script id="fund_info_02" type="text/template" defer="defer">
								<div class="jy_tit">
									<h2>{{= it.fund_short_name }}<span>({{= it.fund_code }})</span></h2>
									<div class="clearfix">
										<a href="javascript:;" class="blue_bor">{{= it.fund_type }}基金</a>
										<a href="javascript:;" class="red_bor">{{= it.risk_level }}</a>
									</div>
								</div>
								{{? it.fund_text == "非货币型" }}
									<div class="jy_cover clearfix" id="show_fhb_content">
										<div>
											<h2><strong>{{= it.unit_nv }}</strong></h2>
											<label>单位净值<span>[ {{= it.nv_date.substr(5,5) }} ]</span></label>
										</div>
										<div class="nr_bor">
											<p>日涨跌幅:<span class="{{= it.daily_change_color }}">{{= it.daily_change }}</span></p>
											<p class="nb_mar">
												净值变动:<span class="{{= it.nv_change_color }}">{{= it.nv_change }}</span>
											</p>
										</div>
									</div>
								{{??}}
									<!-- 货币型 -->
									<div class="jy_cover clearfix" id="show_hb_content" style="padding-bottom: 30px;">
										<div>
											<h2><strong>{{= it.serven_days_annual_profit }}</strong></h2>
											<label>七日年化收益率 <span>[ {{= it.nv_date.substr(5,5) }} ]</span></label>
											<small>万份收益 <em>{{= it.profit_per_million }}</em></small>
										</div>
										<div class="nr_bor">
											<p>赎回时长:<span>{{= it.redeem_time || 0 }}</span>个交易日</p>
											<p>成立日期:<span>{{= it.establish_date }}</span></p>
											<p class="nb_mar">
												最新规模:{{= it.newest_scale ? '<span>'+it.newest_scale+'元</span><em>('+it.newest_scale_date+')</em>' : '--' }}
											</p>
										</div>
									</div>
								{{?}}

								<div class="jy_bottom">
									<h5>投资金额:</h5>
									<div class="clearfix">
										<label>
											<input type="text" value="{{= it.min_buy_amount_detail.indexOf('--') >= 0 ? '0.00' : it.min_buy_amount_detail }}" id="tz_amount"/>
											<em>元</em>
										</label>
										<a href="javascript:;" class="lj_bug">立即申购</a>
										<span class="rate_calculation"></span>
									</div>
									<p class="bug_rate" style="{{= it.fund_text == '非货币型' ? 'display: block;' : 'display: none;' }}">
										费率<s>{{= it.buy_rate }}</s><em>{{= it.preferential_rate.indexOf('--') >= 0 ? '' : '1折起' }}</em><b>(使用加银宝扣款并且招行卡除外)</b>
									</p>
								</div>
							</script>
						</div>
					</div>
					<div class="infoarea clearfix">
						<div class="fl" style="height: auto;min-height: 761px;">
							<div class="in_tab clearfix" id="show_tag">
								<a href="javascript:;" class="active">基本信息</a>
								<a href="javascript:;" style="display: none;">投资组合</a>
								<a href="javascript:;">基金经理</a>
								<a href="javascript:;">基金公告</a>
								<a href="javascript:;">费率</a>
								<a href="javascript:;">分红信息</a>
								<a href="javascript:;">销售机构</a>
								<a href="javascript:;" >历史净值</a>
                				<a href="javascript:;" style="margin-right: 0px;display: none;" id="etf_qd">申赎清单</a>
							</div>
							<div id="product_info">
								<!-- 基本信息 -->
								<div class="in_block jbxx fund_info_01" style="display: block;">
									<script id="fund_info_01" type="text/template" defer="defer">
										<ul class="in_ul">
											<li>
												<span>基金名称</span>
												<p class="p1">{{= it.fund_name }}(简称 "{{= it.fund_short_name }}")</p>
											</li>
											<li>
												<span>基金代码</span>
												<p class="p1">{{= it.fund_code }}</p>
											</li>
											<li>
												<span>基金类型</span>
												<p class="p1">{{= it.fund_type }}</p>
											</li>
											<li>
												<span>成立日期</span>
												<p class="p1">{{= it.establish_date.replace("-", "年").replace("-", "月").replace("年0", "年").replace("月0", "月")+"日" }}</p>
											</li>
											<li>
												<span>基金管理人</span>
												<p class="p1">{{= it.manager_name }}</p>
											</li>
											<li>
												<span>基金托管人</span>
												<p class="p1">{{= it.custodian_name }}</p>
											</li>
											<li>
												<span>业绩比较基准</span>
												<p class="p1">{{= it.benchmark.replace(/style/ig, "data-style") }}</p>
											</li>
											<li>
												<span>投资目标</span>
												<p class="p1">{{= it.invest_objective.replace(/style/ig, "data-style") }}</p>
											</li>
											<li>
												<span>投资范围</span>
												<p class="p1">{{= it.invest_scope.replace(/style/ig, "data-style") }}</p>
											</li>
											<li class="fund_strategy" style="{{= it.invest_strategy.replace(/<.*?>/ig, "") ? 'display: block;' : 'display: none;' }}">
												<span>投资比例</span>
												<p class="p1">{{= it.invest_strategy.replace(/style/ig, "data-style").replace(/span/ig, "p") }}</p>
											</li>
											<li>
												<span>风险收益特征</span>
												<p class="p1">{{= it.risk_feature.replace(/style/ig, "data-style") }}</p>
											</li>
										</ul>
									</script>
								</div>
								
								<!-- 投资组合 -->
								<div class="in_table tzzh" style="display: none;padding: 0;">
									<div class="in_table ">
										<div class="in_tit clearfix">
											<h4>--</h4>
											<p>--</p>
										</div>
										<div class="in_chart in_chart1">
											<div class="in_img" id="tzzh_graph" style="width:550px;height:400px">
											</div>
											<div class="in_info clearfix" style="position: relative;">
												<p>股票<i></i></p>
												<p>债券<i class="p2"></i></p>
												<p>现金<i class="p3"></i></p>
												<p class="nr_mar">其他<i class="p4"></i></p>
											</div>
										</div>
									</div>
								</div>
								
								<!-- 基金经理 -->
								<div class="in_table nice_tab_box zjjl" style="display: none;padding: 0;">
									<ul class="nice_tab_tit clearfix manager_list">
										<script id="manager_list" type="text/template" defer="defer">
											{{ for(var i = 0; i < it.length; i++) { }}	
												<li class="{{= i == 0 ? 'active' : ''}}">
													<div class="ntt_img">
														<img src="{{= it[i].photo_url }}" height=100 alt=""/>
													</div>
													<h5>{{= it[i].member_name }}</h5>
													<p>{{= it[i].education }}</p>
													<span class="{{= i == 0 ? 'active' : ''}}"></span>
												</li>
											{{ } }}
										</script>
									</ul>
									<div class="nice_tab_body">
										<div class="nice_tab_children">
											<div class="in_table ">
												<div class="posit clearfix">
													<div class="p_left">
														<a href="javascript:;"><img></a>
													</div>
													<div class="p_right">
														<h4>
															--<span>--</span>
															<div class="a_btns">
																<!-- <a href="/osoa/views/newsView/fundManagerList.html" target="_blank">走近基金经理 &gt;</a> -->
															</div>
														</h4>
														<span>任职时间:<em>--</em></span>
														<p>--</p>
													</div>
												</div>
											</div>
											<div class="in_table ">
												<div class="in_tit clearfix">
													<h4>基金经理观点</h4>
												</div>
												<div class="in_word">--</div>
											</div>
											<div class="in_table in_table4">
												<div class="in_tit clearfix">
													<h4>产品业绩</h4>
												</div>
												<table width="100%" border="1" cellpadding="0" cellspacing="0">
													<thead>
														<tr>
															<th>基金代码</th>
															<th>基金简称</th>
															<th>成立日期</th>
															<th>份额净值(元)</th>
															<th>今年以来 (%)</th>
															<th>成立以来 (%)</th>
														</tr>
													</thead>
													<tbody class="manager_performance">
														
													</tbody>
												</table>
												<div class="in_tit clearfix hbly_type" style="margin-top:20px;display:none">
												</div>
												<table class="hbly_type" width="100%" border="1" cellpadding="0" cellspacing="0" style="display:none">
													<thead>
														<tr>
															<th>基金代码</th>
															<th>基金简称</th>
															<th>成立日期</th>
		<!-- 													<th>份额净值(元)</th> -->
															<th>七日年化收益率 (%)</th>
															<th>万份收益 (元)</th>
														</tr>
													</thead>
													<tbody class="manager_performance2">
														
													</tbody>
												</table>
												<div class="fund_manger_page"></div>
											</div>
										</div>
									</div>
									
								</div>
								
								<!-- 基金公告 -->
								<div class="zjgg" style="display: none;">
									<div class="in_table xxarea xxarea1" id="release_document">
										<div class="in_tit clearfix">
											<h4>法律文件</h4>
											<a href="javascript:;" class="a_more announcement_list" data-type="0"></a>
										</div>
										<div class="posit clearfix">
										</div>
									</div>
									<div class="in_table xxarea xxarea1" id="periodic_announcement">
										<div class="in_tit clearfix">
											<h4>定期公告</h4>
											<a href="javascript:;" class="a_more announcement_list" data-type="1"></a>
										</div>
										<div class="posit clearfix">
										</div>
									</div>
									<div class="in_table xxarea xxarea1" id="interim_announcement">
										<div class="in_tit clearfix">
											<h4>临时公告</h4>
											<a href="javascript:;" class="a_more announcement_list" data-type="2"></a>
										</div>
										<div class="posit clearfix">
										</div>
									</div>
								</div>
								
								<!-- 费率 -->
								<div class="zjfl" style="display: none;">
									<div class="in_table rgfv">
										<div class="in_tit clearfix">
											<h4>基金认购费率</h4>
										</div>
										<table width="100%" border="1" cellpadding="0" cellspacing="0">
											<thead>
												<tr>
													<th>认购金额(M,单位:元)</th>
													<th>费率</th>
												</tr>
											</thead>
											<tbody>
											</tbody>
										</table>
									</div>
									<div class="in_table sgfv">
										<div class="in_tit clearfix">
											<h4>基金申购费率</h4>
										</div>
										<table width="100%" border="1" cellpadding="0" cellspacing="0">
											<thead>
												<tr>
													<th>申购金额(M,单位:元)</th>
													<th>费率</th>
												</tr>
											</thead>
											<tbody>
											</tbody>
										</table>
									</div>
									<div class="in_table shfv">
										<div class="in_tit clearfix">
											<h4>基金赎回费率</h4>
										</div>
										<table width="100%" border="1" cellpadding="0" cellspacing="0">
											<thead>
												<tr>
													<th>持有时期(T)</th>
													<th>费率</th>
												</tr>
											</thead>
											<tbody>
											</tbody>
										</table>
									</div>
									<div class="in_table in_table3 yzfv">
										<div class="in_tit clearfix">
											<h4>基金运作费</h4>
										</div>
										<table width="100%" border="1" cellpadding="0" cellspacing="0">
											<thead>
												<tr>
													<th>管理费率</th>
													<th>托管费</th>
													<th>销售服务年费</th>
												</tr>
											</thead>
											<tbody>
											</tbody>
										</table>
									</div>
									<div class="a_btns"><a href="/osoa/views/serviceCenter/rateDiscount.html" target="_blank">网上交易费率优惠 &gt;</a></div>
								</div>
								
								<!--分红信息 -->
								<div class="fhxx" style="display: none;">
									<div class="in_table in_table1">
										<div class="in_tit clearfix">
											<h4>基金分红记录</h4>
										</div>
										<table width="100%" border="1" cellpadding="0" cellspacing="0">
											<thead>
												<tr>
													<th>分红年度</th>
													<th>权益登记日</th>
													<!-- <th>除息日</th> -->
													<th>红利发放日</th>
													<th class="w29">每10分收益单位派息 (元)</th>
												</tr>
											</thead>
											<tbody>
											</tbody>
										</table>
										<div class="in_no" style="display: none;">
											<img src="/osoa/images/jp/img_03.png" />
											暂无分红记录
										</div>
									</div>
									<div class="in_table in_table2">
										<div class="in_tit clearfix">
											<h4>基金拆分记录</h4>
										</div>
										<table width="100%" border="1" cellpadding="0" cellspacing="0">
											<thead>
												<tr>
													<th>拆分日期</th>
													<th>拆分前净值</th>
													<th>拆分后净值</th>
													<th>拆分比例 (%)</th>
												</tr>
											</thead>
											<tbody>
											</tbody>
										</table>
										<div class="in_no" style="display: none;">
											<img src="/osoa/images/jp/img_03.png" />
											暂无拆分记录
										</div>
									</div>
								</div>
								
								<!-- 销售机构 -->
								<div class="xsjg" style="display: none;">
									<div class="in_table">
										<table width="100%" border="1" cellpadding="0" cellspacing="0">
											<thead>
												<tr>
													<th>销售机构</th>
													<th>服务热线</th>
												</tr>
											</thead>
											<tbody>
											</tbody>
										</table>
									</div>
								</div>
								
								<!-- 历史净值列表 -->
								<div class="in_table in_table2 lsjz" style="display: none;">
									<div class="in_tit clearfix">
										<h4>历史净值列表</h4>
										<div class="date clearfix">
											<div class="d_input">
												<input type="text" id="start_time" readOnly onClick="WdatePicker({maxDate:'#F{$dp.$D(\'end_time\')}'})"/>
												<i></i>
											</div>
											<span>一</span>
											<div class="d_input">
												<input type="text" id="end_time" readOnly onClick="WdatePicker({minDate:'#F{$dp.$D(\'start_time\')}'})"/>
												<i></i>
											</div>
											<a href="javascript:;" id="search_data"></a>
										</div>
									</div>
									<table width="100%" border="1" cellpadding="0" cellspacing="0">
										<thead>
											<tr>
												<th>发布日期</th>
												<th>--</th>
												<th>--</th>
												<th>资产净值(元)</th>
											</tr>
										</thead>
										<tbody>
										</tbody>
									</table>
								</div>
                				<!-- 赎回清单开始-->
								<div class="redeem_list shqd" style="display: none;">
				                    <div class="redeem_search">
					                     <em></em>
					                     <span>清单日期</span>
					                     <input type="text"  id="startDate" readonly="readonly" />
				                        <a href="javascript:void(0);" class="btn" id="serchBtn">查询</a>
				                    </div>
				                    <!-- 基金信息 -->
				                    <div id="fund_info" >
												          
					                </div>
					                <!-- 成份股信息内容 -->
			                    	<div id="fund_list" >
											                    
					                </div>
										            
				                </div>
								<!-- 赎回清单结束-->
							</div>
						</div>
						<div class="fr">
							<div class="f_top">热销基金</div>
							<ul id="hot_fund_list">
							</ul>
						</div>
					</div>
				</div>
			</div>
		</div>
		
		
		<!--footer-->
		<div id="footerContent"></div>
	
		<!--右侧悬浮-->
		<!-- 
		<div class="right_bar">
			<a href="javascript:;" class="bar_block kf"></a>
			<a href="javascript:;" class="bar_block wei">
				<div class="hide_wei">
					<img src="/osoa/images/img_w3.png">
				</div>
			</a>
			<a href="javascript:;" class="bar_block up"></a>
		</div> -->
		<!-- 模板 -->
		<script id="manager_performance" type="text/template" defer="defer">
			{{ for(var i = 0; i < it.length; i++) { }}	
				{{? !(it[i].fund_type == '6'||it[i].fund_type == '5') }}
					<tr>
						<td>{{= it[i].fund_code }}</td>
						<td>{{= it[i].fund_short_name }}</td>
						<td>{{= it[i].establish_date }}</td>
						<td class="{{= it[i].unit_nv_color }}">{{= it[i].unit_nv }}</td>
						<td class="{{= it[i].yieldratety_color }}">{{= it[i].yieldratety }}</td>
						<td class="{{= it[i].yieldratestart_color }}">{{= it[i].yieldratestart }}</td>
					</tr>
				{{?}}
			{{ } }}
		</script>
		
		<script id="manager_performance2" type="text/template" defer="defer">
			{{ for(var i = 0; i < it.length; i++) { }}		
				{{? it[i].fund_type == '5'||it[i].fund_type == '6'}}
					<tr>
						<td>{{= it[i].fund_code }}</td>
						<td>{{= it[i].fund_short_name }}</td>
						<td>{{= it[i].establish_date }}</td>
						
						<td class="{{= it[i].serven_days_annual_profit }}">{{= it[i].serven_days_annual_profit }}</td>
						<td class="{{= it[i].profit_per_million }}">{{= it[i].profit_per_million }}</td>
					</tr>
				{{?}}
			{{ } }}
		</script>
		<!-- 模板 -->
	    <script type="text/javascript">
	 	//项目主体页面 pageCode:页面路径编码,jsonParam:参数,isLoad:是否每次都加载
	 	var _defaultPage = {"pageCode": "funds/fundDetail", "jsonParam":{},"isLoad":false}; 
	 	//项目页头页面 pageCode:页面路径编码,jsonParam:参数,isLoad:是否每次都加载,默认是inclue/header
	 	var _headerPage = {"pageCode": "include/header", "jsonParam":{},"isLoad":false}; 
		//项目页脚页面 pageCode:页面路径编码,jsonParam:参数,isLoad:是否每次都加载,默认是inclue/footer
		var _footerPage = {"pageCode": "include/footer", "jsonParam":{},"isLoad":false};
		</script>
		<script type="text/javascript" src="/osoa/version.js"></script>
		<!--基础框架包 -->
		<script type="text/javascript" src="/thinkiveJs.min.js"></script>
	</body>
</html>


Process finished with exit code 0

可以通过摁下Ctrl+F键进行搜索基金名称等关键词,会发现根本没有相关的HTML,所以这个表格的数据因该是通过Ajax来渲染的。我又在浏览器里按了F12,查看Network里的DOC一项,同时确认了我的想法。这是我在F12中的Network里的XHR中寻找,最终发现我要的数据都在这个json文件中,如下两张图所示:

所以现在来看,只要处理这个json文件就可以了,于是我写了如下的代码:

import requests


headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36',
    'Referer': 'http://www.msjyfund.com.cn/osoa/views/funds/fundDetail.html?fund_code=mcaSesVXrHU=&fund_type=M0Uo0ORwvYw=',
}
base_url = "http://www.msjyfund.com.cn/servlet/json"
json = requests.get(url=base_url, headers=headers).json()
print(json)

满心欢喜的运行了却得到了如下结果:

C:\Users\ABC\AppData\Local\Programs\Python\Python38\python.exe C:/Users/ABC/PycharmProjects/pythonProject/1.py
{'error_no': '-10004', 'error_info': '调用BUS接口的功能号不能为空'}

Process finished with exit code 0

我反思了一下,发现是没有传参数,于是我在这里找到了要传的参数,如下图所示:

于是url改为

http://www.msjyfund.com.cn/servlet/json?funcNo=905505&fund_code=515350&tradingday=&curtPageNo=1&numPerPage=1000

接着顺着这个思路就可以得到数据了!

完整代码

import requests


data = {
            "decel_date": "",  # 公告日期
            # "trade_date": "",  # 交易日期
            # "sub_redem_sec_type": "",  # 申赎成份类别
            "fund_code": "",  # 基金交易代码
            "sec_code": "",  # 成份证券公布代码
            "sec_name": "",  # 证券简称
            "sec_quantity": "",  # 证券数量:股/手/克
            "cash_substitute_sign": "",  # 现金替代标志:0-禁止; 1-允许;2-必须;3-退补
            # "cash_substitute_ratio": "",  # 现金替代溢价比例
            "fixed_substitute_amount": "",  # 固定替代金额
            "sub_replace_amt": "",  # 申购替代金额
            "redem_replace_amt": "",  # 赎回替代金额
        }

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36',
    'Referer': 'http://www.msjyfund.com.cn/osoa/views/funds/fundDetail.html?fund_code=mcaSesVXrHU=&fund_type=M0Uo0ORwvYw=',
}
base_url = "http://www.msjyfund.com.cn/servlet/json?funcNo=905505&fund_code=515350&tradingday=&curtPageNo=1&numPerPage=1000"
json = requests.get(url=base_url, headers=headers).json()
# print(json)

items = json.get('dataList')[0].get('data')
for item in items:
    data['fund_code'] = item['fundcode']
    data['decel_date'] = item['tradingday']
    data['sec_code'] = item['stockcode']
    data['sec_name'] = item['stockname']
    data['sec_quantity'] = item['stocknum']
    data['cash_substitute_sign'] = item['cashflag']
    data['sub_replace_amt'] = item['redemptiondiscountrate']
    data['redem_replace_amt'] = item['cashratio']
    data['fixed_substitute_amount'] = item['substituteamount']
    print(data)

运行结果


END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TIM33470348

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值