最近基金跌的真够猛,虽说是定投,但大幅度下跌,有时候适当的增加定投数也是降低平均成本的一种方式

每天去看去算太费时间,写了个爬虫,让他自动抓数据后自动计算出来吧

实现逻辑:

1、创建了一个excel表格,把当前定投的基金都备注到里面、

2、脚本依次读取表格中的基金代码

3、拿到基金代码,到“天天基金网”获取基金最新净值

4、把获取到净值和更新时间写到excel中

5、excel公示计算出基于最近一次购买值的涨跌幅

后续还可以把脚本搬到云上,每天自动运行,达到设置的跌幅发邮件提醒或者短信提醒,这都是后话

这里只写代码部分

第一步,读取表格中的基金代码,脚本如下

#读取表格内的基金代码
def code():
wb = xlrd.open_workbook(path+'\\更新数据.xlsx')# 打开Excel文件
data = wb.sheet_by_name('Sheet1')#通过excel表格名称(rank)获取工作表
b=data.col_values(1)#获取第一列数据(数组)
list=[]
for c in b[1:]:#for循环,排除第一行数据
d=int(c)
s="%06d" % d#股票代码一共有6位,常规打印无法打印出首位带0的代码的0部分,补齐缺失的0
#print(s)
list.append(s)
return(list)
code=code()

返回数据如下格式

“['161005', '161903', '110003', '160222', '000248', '163406']”

这一步涉及到对excel操作(读取)处理,请参考:https://www.cnblogs.com/becks/p/11397995.html

第二步,从上一步返回的基金代码list中取值,拼接成有效链接爬取基金信息,脚本如下

def data(cookies,headers,params,code):
valuelist = []
for num in code:
response = requests.get('http://fund.eastmoney.com/'+num+'.html', headers=headers, params=params, cookies=cookies, verify=False)
response.encoding = 'utf-8' #处理编码得步骤
response = response.text
#获取当前基金净值
valueD = re.findall('<span class="fix_dwjz bold ui-color-green">(.+?)</span>', response, re.S)
if len(valueD)>0: #如果返回值长度大于0,即可理解为当天是跌,value从valueD取值
value = valueD
else: #否则,即可理解为当天是涨,value从valueZ取值
valueZ = re.findall('<span class="fix_dwjz bold ui-color-red">(.+?)</span>', response, re.S)#当天净值为涨
value = valueZ
#print(value)
#获取当前最新净值更新时间
valuetime = re.findall('<div class="titleItems tabBtn titleItemActive" data-date="(.+?)" data-href-more', response, re.S)
valuelist.append(value[0])
#timelist.append(value1)
return(valuelist,valuetime)
test=data(cookies,headers,params,code)

返回数据如下:这一步没有对数据进行处理,里面包含了所有基金净值和更新时间

“(['3.7090', '2.1096', '2.5932', '1.2488', '3.2830', '2.1112'], ['2021-03-05'])”

这一步涉及对数据的正则处理,可参考:https://www.cnblogs.com/becks/p/14494929.html

第三步,处理数据,并保存到excel中,脚本如下

def save(test):
xfile = openpyxl.load_workbook(path+'\\更新数据.xlsx')
sheet1 = xfile.get_sheet_by_name('Sheet1')
for i in range(len(test[0])):
sheet1.cell(i+2, 5).value=test[0][i]
for i in range(len(test[0])):
sheet1.cell(i+2, 6).value=test[1][0]
xfile.save(path+'\\更新数据.xlsx')
save(test)

这一步涉及到对excel进行操作(追加写入),可参考:https://www.cnblogs.com/becks/p/12250052.html

整个脚本执行后,将自动更新下图表格中的红框数据,且涨跌幅一栏也会基于购买时的净值,计算得出结果

需要注意的是,excel文件的命名还有存放位置需要跟脚本在一个目录下

附完整代码

# -*-coding:utf8-*-
# encoding:utf-8
import requests
import os
import sys
import re
import time
import random
import openpyxl
import xlrd path = os.path.abspath(os.path.dirname(sys.argv[0])) cookies = {
'intellpositionL': '1010.67px',
'em_hq_fls': 'js',
'em-quote-version': 'topspeed',
'qgqp_b_id': '134fc3fcff10a2a2c4035eebfe40f119',
'intellpositionT': '455px',
'HAList': 'a-sh-600909-%u534E%u5B89%u8BC1%u5238%2Ca-sh-605003-%u4F17%u671B%u5E03%u827A%2Ca-sz-300855-%u56FE%u5357%u80A1%u4EFD%2Ca-sz-300015-%u7231%u5C14%u773C%u79D1%2Ca-sh-603939-%u76CA%u4E30%u836F%u623F%2Ca-sz-300677-%u82F1%u79D1%u533B%u7597%2Ca-sh-600036-%u62DB%u5546%u94F6%u884C%2Ca-sz-000860-%u987A%u946B%u519C%u4E1A%2Ca-sz-002352-%u987A%u4E30%u63A7%u80A1%2Ca-sz-002034-%u65FA%u80FD%u73AF%u5883',
'kforders': '0%3B-1%3B%3B%3B0%2C2%2C24%2C25%2C18%2C19%2C22%2C23%2C21%2C3',
'Eastmoney_Fund_Transform': 'true',
'Eastmoney_Fund': '000297_000001_000011',
'st_si': '89636864382855',
'st_asi': 'delete',
'ASP.NET_SessionId': 'kbxmonijodtnjbezidg0jzmq',
'searchbar_code': '519736_000032_000205_040040_206018_000248_110003_163406_161903_161005',
'EMFUND0': '02-08%2015%3A15%3A53@%23%24%u6613%u65B9%u8FBE%u4FE1%u7528%u503A%u503A%u5238A@%23%24000032',
'EMFUND2': '02-08%2015%3A16%3A12@%23%24%u534E%u5B89%u7EAF%u503A%u503A%u5238A@%23%24040040',
'EMFUND1': '02-08%2015%3A16%3A07@%23%24%u6613%u65B9%u8FBE%u6295%u8D44%u7EA7%u4FE1%u7528%u503A%u503A%u5238A@%23%24000205',
'EMFUND3': '02-08%2015%3A26%3A18@%23%24%u9E4F%u534E%u4EA7%u4E1A%u503A%u503A%u5238@%23%24206018',
'EMFUND4': '02-08%2015%3A27%3A25@%23%24%u6C47%u6DFB%u5BCC%u4E2D%u8BC1%u4E3B%u8981%u6D88%u8D39ETF%u8054%u63A5@%23%24000248',
'EMFUND5': '02-08%2015%3A28%3A40@%23%24%u6613%u65B9%u8FBE%u4E0A%u8BC150%u589E%u5F3AA@%23%24110003',
'EMFUND6': '02-08%2015%3A29%3A32@%23%24%u5174%u5168%u5408%u6DA6%u6DF7%u5408%28LOF%29@%23%24163406',
'EMFUND7': '02-08%2015%3A30%3A22@%23%24%u4E07%u5BB6%u884C%u4E1A%u4F18%u9009%u6DF7%u5408%28LOF%29@%23%24161903',
'EMFUND8': '03-07%2020%3A24%3A02@%23%24%u5357%u65B9%u660C%u5143%u8F6C%u503AA@%23%24006030',
'st_pvi': '18238554782275',
'st_sp': '2020-01-23%2014%3A56%3A33',
'st_inirUrl': 'https%3A%2F%2Fwww.baidu.com%2Flink',
'st_sn': '5',
'st_psi': '20210307202806812-112200305282-6714006413',
} headers = {
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'If-None-Match': 'W/"6044c497-25fbe"',
'If-Modified-Since': 'Sun, 07 Mar 2021 12:18:31 GMT',
} params = (
('spm', 'search'),
) #读取表格内的基金代码
def code():
wb = xlrd.open_workbook(path+'\\更新数据.xlsx')# 打开Excel文件
data = wb.sheet_by_name('Sheet1')#通过excel表格名称(rank)获取工作表
b=data.col_values(1)#获取第一列数据(数组)
list=[]
for c in b[1:]:#for循环,排除第一行数据
d=int(c)
s="%06d" % d#股票代码一共有6位,常规打印无法打印出首位带0的代码的0部分,补齐缺失的0
#print(s)
list.append(s)
return(list)
code=code() def data(cookies,headers,params,code):
valuelist = []
for num in code:
response = requests.get('http://fund.eastmoney.com/'+num+'.html', headers=headers, params=params, cookies=cookies, verify=False)
response.encoding = 'utf-8' #处理编码得步骤
response = response.text
#获取当前基金净值
valueD = re.findall('<span class="fix_dwjz bold ui-color-green">(.+?)</span>', response, re.S)
if len(valueD)>0: #如果返回值长度大于0,即可理解为当天是跌,value从valueD取值
value = valueD
else: #否则,即可理解为当天是涨,value从valueZ取值
valueZ = re.findall('<span class="fix_dwjz bold ui-color-red">(.+?)</span>', response, re.S)#当天净值为涨
value = valueZ
#print(value)
#获取当前最新净值更新时间
valuetime = re.findall('<div class="titleItems tabBtn titleItemActive" data-date="(.+?)" data-href-more', response, re.S)
valuelist.append(value[0])
#timelist.append(value1)
return(valuelist,valuetime)
test=data(cookies,headers,params,code) def save(test):
xfile = openpyxl.load_workbook(path+'\\更新数据.xlsx')
sheet1 = xfile.get_sheet_by_name('Sheet1')
for i in range(len(test[0])):
sheet1.cell(i+2, 5).value=test[0][i]
for i in range(len(test[0])):
sheet1.cell(i+2, 6).value=test[1][0]
xfile.save(path+'\\更新数据.xlsx')
save(test) def over(test):
print("数据已更新",test[1][0])
over(test)

python爬虫(正则取数据)读取表格内的基金代码后爬取基金最新净值,同时写到对应的表格中,基于最近一次购买净值计算出涨跌幅(名字有点长)的更多相关文章

  1. Python爬虫入门教程 13-100 斗图啦表情包多线程爬取

    斗图啦表情包多线程爬取-写在前面 今天在CSDN博客,发现好多人写爬虫都在爬取一个叫做斗图啦的网站,里面很多表情包,然后瞅了瞅,各种实现方式都有,今天我给你实现一个多线程版本的.关键技术点 aioht ...

  2. python爬虫从入门到放弃(九)之 实例爬取上海高级人民法院网开庭公告数据

    通过前面的文章已经学习了基本的爬虫知识,通过这个例子进行一下练习,毕竟前面文章的知识点只是一个 一个单独的散知识点,需要通过实际的例子进行融合 分析网站 其实爬虫最重要的是前面的分析网站,只有对要爬取 ...

  3. Python爬虫入门教程 4-100 美空网未登录图片爬取

    美空网未登录图片----简介 上一篇写的时间有点长了,接下来继续把美空网的爬虫写完,这套教程中编写的爬虫在实际的工作中可能并不能给你增加多少有价值的技术点,因为它只是一套入门的教程,老鸟你自动绕过就可 ...

  4. 【python爬虫】对喜马拉雅上一个专辑的音频进行爬取并保存到本地

    >>>内容基本框架: 1.爬虫目的 2.爬取过程 3.代码实现 4.爬取结果  >>>实验环境: python3.6版本,pycharm,电脑可上网. [一 爬虫目 ...

  5. python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(1)

    一.数据类型及解析方式 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为两部分,非结构化的数据 和 结构化的数据. 非结构化数据:先有数据,再有结构, 结构化数 ...

  6. 爬虫入门之Scrapy框架基础框架结构及腾讯爬取(十)

    Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查看他们的工作方式,方便我们爬取的网页中提取的数据. 如果安装了 IPyth ...

  7. 爬虫系列4:scrapy技术进阶之多页面爬取

    多页面爬取有两种形式. 1)从某一个或者多个主页中获取多个子页面的url列表,parse()函数依次爬取列表中的各个子页面. 2)从递归爬取,这个相对简单.在scrapy中只要定义好初始页面以及爬虫规 ...

  8. python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(2)

    上半部分内容链接 : https://www.cnblogs.com/lowmanisbusy/p/9069330.html 四.json和jsonpath的使用 JSON(JavaScript Ob ...

  9. python爬虫26 | 把数据爬取下来之后就存储到你的MySQL数据库。

    小帅b说过 在这几篇中会着重说说将爬取下来的数据进行存储 上次我们说了一种 csv 的存储方式 这次主要来说说怎么将爬取下来的数据保存到 MySQL 数据库 接下来就是 学习python的正确姿势 真 ...

随机推荐

  1. PowerShell随笔1---背景

    既然是随笔,那就想到什么说什么,既会分享主题知识,也会分享一些其他技巧和个人学习方法,供交流. 我一般学习一个东西,我都会问几个问题: 这东西是什么? 这东西有什么用,为什么会出现,出现是为了解决什么 ...

  2. 数理统计10(习题篇):寻找UMVUE

    利用L-S定理,充分完备统计量法是寻找UMVUE的最方便方法,不过实际运用时还需要一些小技巧,比如如何写出充分完备统计量.如何找到无偏估计.如何求条件期望,等等.课本上的例题几乎涵盖了所有这些技巧,我 ...

  3. Java 并发机制底层实现 —— volatile 原理、synchronize 锁优化机制

    本书部分摘自<Java 并发编程的艺术> 概述 相信大家都很熟悉如何使用 Java 编写处理并发的代码,也知道 Java 代码在编译后变成 Class 字节码,字节码被类加载器加载到 JV ...

  4. C++:Process returned -1073741571 (0xC00000FD)

    启动程序无法输入,然后崩溃报错Process returned -1073741571 (0xC00000FD) 原因: 栈溢出了 栈的默认内存空间为1M,如果函数中定义的数组太大会导致内存溢出. 解 ...

  5. 【非原创】codeforces 1060E Sergey and Subway 【树上任意两点距离和】

    学习博客:戳这里 本人代码: 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 con ...

  6. Bootstrap导航组件

    Bootstrap 中的导航组件都依赖同一个 .nav 类,状态类也是共用的.改变修饰类可以改变样式. 标签页 注意 .nav-tabs 类依赖 .nav 基类 <ul class=" ...

  7. js 可选链 & 空值合并 In Action

    js 可选链 & 空值合并 In Action const obj = { props: { name: 'eric', }, // prop, 不存在的属性 ️ }; console.log ...

  8. play games for learning web skills

    play games for learning web skills CSS flexbox https://codepip.com/games/flexbox-froggy/ CSS grid ht ...

  9. CSS3 优先级

    CSS3   优先级  https://developer.mozilla.org/zh-CN/docs/Web/CSS/Specificity 优先级 在本文章中 概念 优先级是如何计算的? 选择器 ...

  10. Twitter 分享

    Twitter 分享 Twitter Share API https://twitter.com/intent/tweet?url= &text= demo ?url= https://www ...