《Python爬虫获取基金变动信息.docx》由会员分享,可在线阅读,更多相关《Python爬虫获取基金变动信息.docx(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、目录1前言2抓取变动信息基金的变动信息获取2.1 基金阶段信息的抓取3最终结果展现1前言前面文章Python爬虫获取基金列乩Python爬虫获取基金基本信息我们已经介绍了怎么获取基金列表以及 怎么获取基金基本信息,本文我们继续前面的内容,获取基金的变动信息。这次获取信息的方式将组合使 用页面数据解析和api接口调用的方式进行。2抓取变动信息我们通过观察基金基本信息页面,我们可以发现有关基金变动信息的页面可以包含以下4个局部:接下来说一下我们抓取数据的思路,在第一个图中我们已经得到了基金的基本信息,变动信息和阶段涨幅, 但是阶段涨幅已经在第2个图中得到了展示,所以在这个图中,我们只需要获取实时的
2、涨跌以及前一日的 基金净值即可。|2基金的变动信息获取2 I#基金的变动信息,我们还是从二个简单的连接开始,其他基金的获取方式是和这个类似,|5 I#访问地址换上其他的基金代码即可 | :/fund.eastmoney /005585.htmlj 这里获取变动分为两个局部,一局部是实时获取基金的变动新,会发现净值估算是过一段时间会发生变化, 通过监控浏览器的访问请求记录,抓取到了这样一个api访问,瞬间就乐开了花。|/. 1234567 .cn/js/005585.js0fundcode: 005585name银河文体娱乐混合,基金代码和基金名称可以根据jSOn返|口1的内容可以知道,但是jz
3、rq,dwjz,gsz,gszzl,gztime都是什么意思 呢,我仔细研究了很长时间,结合页面上展示的内容,再加上dfcf编码中文拼音的首字母的习惯,我猜这 些字段的意思大致是净值日期、单位净值、估算值、估算增长率、估算时间。我都有点儿沾沾自喜了,竟然破解出来了其中的奥义。第一局部是获取基金的单位净值,这个通过分析发现数据是包含在一个dl class=dataltem02的html 元素中的,我们获取的方式是通过bs4的方式解析返回页面信息来抓取元素解析dom树来获取。总结一下就是我们通过api接口调用来获取基金的实时变动信息,通过解析返回的html,解析dom树来获 取基金的单位净值信息。
4、以下是第二局部抓取信息的代码。;I#抓取基金实时变动信息|356789101112131415161718192021222324226272829resp = requests.get( :/fundgz.1234567 .cn/js/).js.format(code)|#去除js的呢绒方便进行数据的json转化|data = res,text.replaceLjsonpgzOT亍replace西丐body = json.loads(data)I#输出获取到的结果数据|iprintCQ 估算值估算涨跌估算时间.format(bodyfundcodeL bodyfame, bodygIsz,
5、bodygszzl, bodypgztime)请求获取基金页面的信息|response上 requests.get( :/fund.eastmoney x:om/.html.format(code)|#打印原始的请求返回报文编码方式|print (response. apparenjencoding设置请求的返回内容编码方式,防止出现控制台乱码的情况|response.encoding =| UTF8|resp body = response.text|#进行数据的转换和解析|soup =soup =BeautifulSoup(resp body, Ixml)I#因为确定了只有二个元素,因此可
6、以使用find发放来获取数据,这个就是查找dl标签,class=dataltem02|的元素|dl con = soup.findCdl class=,ldataltem02*)|#获取基金净值的更新时间|value date = dl con.find(p).get text()|#员提取基金数据的时间即可|value date = value date.replace市位净值,.replace(, ) .replace),|#净值数据和涨跌百分比数据是在dd标签下的两个p标签中| value_con =| dl con.find(dd, class=dataNums) data_list_
7、= value con.find all(sparT)val_data J data list0J.get text()per_data = data_listl.get_text()print(基金净值日期净值数据涨跌百分比.format (value_date, val_data, per_data)最终,我们通过以上的操作,就可以获取到基金的变动信息。2.2基金阶段信息的抓取基金的阶段信息抓取也是采用bs4解析页面数据的方式进行操作,这里分为三个图,第一个图展示的是阶 段的涨跌信息“第二个和第三个是季度和年度的涨跌信息、,因为最后我们要进行格式化的存储,对于第一 个图我们可以进行结构化行
8、模式存储,可以做到每天的变化展示,但是二和三我们要采用列模式的存储, 作为一种统计数据进行杳询。因为两种方式的解析方式不同,一图中的表头字段在数据库中是作为字段存 在的,所以我们不需要关心,二和三需要获取表格的表头进行存储,统计的事件也是我们存储的数据。再 有就是我们不仅要得到基金的基本信息,还要获取到沪深300的相关信息,以后方便在做筛选时作为一个 强度指标进行基准判断,所以沪深300的数据也需要进行抓取,这局部的操作难度不大,主要是在于分 析获取的数据方式以及后续进行存储思路。123456789011121314151617181920212223我这里是直接获取页面所有的table元素,
9、然后进行循环输出结果,然后获取需要抓取的数据在那个下标。这里我就直接贴一下代码进行说明:I#打印表格| def print table(head, body):tb PrettyTable() # 生成表格行冢 tb.field names =head #定义表头| tb.add row(body)print(tb)|#查询季度年度数据|def| |query year quarter(data list, num):| stageJList|data list.finLall(tr) 0.find all(th )|head_list 3 O for卜d in| |stage list:|v
10、al = nd.get text().strip()|vaEal.replace(季度,replace(年度,).replace(“年)IM两j# print(ndJget text()|head list.append(val)body_list3j | stage_list = data list.find all(tr)num.find all(td)| for| 卜d in| |stage llst:|42526272829303132333435363738394024344454647val = nd.get text()| if|卜阶段涨幅回卜al or| |沪深300”|回|c
11、ontinue(body list.append(val.replace(%1*,)|#打印表府print table(head list, body list)I#获取基金基本信息这里只是贴了局部代码,需要把获取净值局部的信息进行组合才能够运行|def query fund basic(code=005585, hsFlag=False):|#阶段涨谓画| stage head liti1stage week, stage month, stage month3, stage month6, stage year, stage yearl,stage year2, stage year3,|
12、stage listbody listll flnd allC*t丙|#获取第2个是基金情况 获取笫4个感冒0情况|num = 0工 f hsFlagjnum =目tmp_listj | for, nd in stage listnum.find all(td):val-=| nd.get text()|I if|卜阶段涨幅回|val or| 沪深300”|回I tmp list.append(val.replace(%, )|#打印阶段幅度表格|print (t阶段涨跌)print table(stage head list, tmp list)print(t季度涨跌)query year quarter(body list12, num)| print(t年度涨跌)query_year_quarter(body_list13, num)3最终结果展现由于篇幅有限,本次代码就不在文内进行展示,后续我会把内容维护在github上进行提供。