序言
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">历史净值查询 ></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">历史净值查询 ></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">走近基金经理 ></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">网上交易费率优惠 ></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