搞技术的大都比较纯粹,比较实在,除了工资之外基本就没有别的收入了(少部分人能接外包赚外块)。或许是迫于生活的压力,或许是不甘于固定的工资,或许是出于技术人骨子里的好奇,亦或是这几年关于理财投资的大力宣传、门槛降低,理财越来越被我们所接受,并开始尝试股票、基金、P2P、XX宝等各种理财产品,本文所讲与P2P有关,但不打广告,只讲技术,顺便说明:投资有风险,理财需谨慎,我们赚钱不容易,不能给打了水漂。

背景介绍

某公司的理财产品有如下特点:

  1. 公司分别有12,18,24,36个月的固定期限理财产品,期限越长利率越高
  2. 投资用户可将债权申请转给其他投资人,转出时的利率你可以自行控制
  3. 你也可以通过平台借钱,借钱金额不能超过在投金额的3倍,所谓加杠杆

有一部分用户(行话叫牛)就靠平台活动或高息的时候借钱加杠杆投资,需要还钱的时候通过债权转让平台转让标还借款,通过买入和卖出时的利率差获得额外收益。这中间比较关键的一点就是转出时的利率,利率低收益就高(但太低就没有人接手了,转不出去还不了借款就要支付高额罚金),利率又跟当天待还的金额和已成交的金额有直接关系,那么如果能及时获取这两个数据就大概知道自己标多少利率能转手成功了。

我们接下来的技术实现就主要跟获取这两个数据,以及如何及时的展示数据有关。

服务和工具

  • python3.4
  • mysql5.7
  • redis2.8
  • django2.0

技术实现

只是为了技术研究,没有商用,代码和架构以实现需求为目的,未做优化,且非专业开发,凑合看

抓取数据

翻了一遍平台官网发现有个页面直接展示了转让标的详细信息,无需登录,且是通过ajax方式异步加载的json字符串(但是json字符串里套了一堆的html代码,不知道咋设计的)的方式渲染页面的,那抓取工作简单多了,写了个抓取脚本,流程为:访问页面接口 --> 取到数据 --> 简单处理 --> 录入数据库,抓取脚本直接放在计划任务里每三分钟执行一次,脚本内容如下:

import re
import time
import datetime
import requestsimport pymysql# 连接mysql数据库
db = pymysql.connect("127.0.0.1","root","passwd","pzp")
cursor = db.cursor()for i in range(1, 9999):data = {"RepaymentTypeId": 0,"pagesize": 1,"pageindex": i,"type": 1,"status": 2,"startDeadLine": 0,"endDeadLine": 0,"rate": 0,"beginRate": 0,"endRate": 0,"strkey": None,"orderby": 15,"unitStart": 0,"unitEnd": 0}try:r = requests.post('https://www.tuandai.com/pages/zSharePlan/getZXList', data=data).json()if r.get('code') == 0:html = r.get('data').get('projectListHtml')dr = re.compile(r'<[^>]+>', re.S)dd = dr.sub('', html).split()# 截取单号,只取字符串中的数字order_num = ''.join(re.compile('\d+').findall(dd[0]))# 查询mysql数据库cursor.execute("select order_num from tdw_zx_done where order_num = %s" %order_num)# 获取到查询结果ex = cursor.fetchone()# 判断单号是否已经记录过if ex is None:# 如果单号没有记录过,则计数器置为0x = 0publish_time = datetime.datetime.strptime('20%s-%s-%s %s:%s:%s' %(order_num[0:2],order_num[2:4],order_num[4:6],order_num[6:8],order_num[8:10],order_num[10:12]),'%Y-%m-%d %H:%M:%S')# ‘元’单位都替换成‘万元’,并去掉汉字a = dd[1].split(':')[1]if '元' in a:money = int(''.join(re.compile('\d+').findall(a))) / 10000else:money = a.replace('万','')# 取利率rate = dd[4].replace('%','')# 计算还款日期,借款日期 + 借款时间days = ''.join(re.compile('\d+').findall(dd[6]))repay = (publish_time + datetime.timedelta(days=int(days))).strftime('%Y-%m-%d')print(publish_time, order_num, money, rate, days, repay)# 往数据库里插入数据并提交sql = "INSERT INTO tdw_zx_done VALUES('%s', %s, %s, %s, %s, '%s')" %(publish_time, order_num, money, rate, days, repay)cursor.execute(sql)db.commit()else:# 如果单号已经记录过,则计数器加1x += 1# 如果单号已录入过数据库,则返回print('单号已录入:%s' %str(order_num))# 判断如果有连续200个单号都已经录入过数据库,则跳出循环if x == 200:breaktime.sleep(0.02)else:print(r)except Exception as e:print(e)db.close()
复制代码

数据处理及缓存

上边已经获取到了原始数据,接下来需要对原始数据进行清洗,取自己需要的今日待还及实时成交,并写入缓存,写入缓存的目的是公众号并发查询的情况下,直接去缓存取数据,减小对数据库的压力,这个脚本程序也放在计划任务里每分钟执行

import os
import sys
import json
import datetime
from decimal import Decimalos.chdir(sys.path[0])from connection import rediscon, mysqlcon
mc, rc = mysqlcon().cursor(), rediscon()def cache_now_data():today = datetime.date.today().strftime('%Y-%m-%d')tj, th, = '', ''try:# 成交数据统计mc.execute("select count(1),sum(money) from tdw_zx_done where DATE(publish_time)='%s';" %today)tj = mc.fetchone()tjie = '借款人数:%s 借款金额:%s' %(tj[0], tj[1])# 待还数据统计mc.execute("select count(1),sum(money) from tdw_zx_done where repay='%s';" %today)th = mc.fetchone()thuan = '待还人数:%s 待还金额:%s' %(th[0], th[1])# 完成还款预估时间if th[0]:tomorror_date = datetime.date.today() + datetime.timedelta(days=1)tomorror_time_str = tomorror_date.strftime('%Y-%m-%d 00:00:00')tomorror_time_format = datetime.datetime.strptime(tomorror_time_str, '%Y-%m-%d %H:%M:%S') last_hour = (tomorror_time_format - datetime.datetime.now()).seconds / 60 / 60avg_hour_money = round(Decimal(th[1] - tj[1]) / Decimal(last_hour), 4)avg_hour_money = avg_hour_money if avg_hour_money > 0 else 0else:avg_hour_money = '无今日待还数据,无法计算'# 按小时统计详情mc.execute("select Hour(publish_time) as Hour,count(1),sum(money) from tdw_zx_done where DATE(publish_time) ='%s' group by Hour;" %today)tdetail = mc.fetchall()dl = '小时  |  成交额(万元)\n'for i in tdetail:dl += str(i[0]) + '  |  ' + str(i[2]) + '\n'except Exception as e:print('数据库操作异常:%s' %e)try:key = datetime.datetime.now().strftime('%Y%m%d%H%M')val = {"daihuan":str(th[1]),"chengjiao":str(tj[1]),"avg_hour_money":str(avg_hour_money)}print(rc.set('tdw_zx_now_'+key, json.dumps(val), ex=7200))except Exception as e:print('缓存操作异常:%s' %e)if __name__ == '__main__':cache_now_data()
复制代码

微信好友、群自动回复

我想看数据的时候如何去看呢?去服务器上执行下脚本这方式太low了吧,借助微信机器人,就像你跟朋友聊天一样,发消息“最新数据”,那他就立即回复最新消息给你,这个方式看起来不错,实现完成后有几个朋友觉得不错,也想看数据,那我干脆将这些需要看数据的朋友都拉倒一个群里吧,回复消息群里所有用户都看得到很方便了,技术实现主要借助了itchat模块(itchat主要通过网页版微信接口处理数据,网页版微信很多用户无法登陆了,也就没有办法使用itchat),代码如下

import itchatfrom tdw_data_statistics_now import get_now_data# 处理好友消息
@itchat.msg_register(itchat.content.TEXT)
def text_reply(msg):if msg['Text'].startswith('命令:'):message = msg['Content'].split('命令:')[1]msg.user.send('正在处理你的命令:%s' %(message))if '最新数据' == msg['Text']:message = get_now_data()msg.user.send(message)# 处理群聊消息
@itchat.msg_register(itchat.content.TEXT, isGroupChat=True)
def text_reply(msg):#itchat.send(u'@%s\u2005I received: %s' % (msg['ActualNickName'], msg['Content']), msg['FromUserName'])if '最新数据' == msg['Text']:message = get_now_data()msg.user.send(message)#message = getMessage()
#itchat.send(message, toUserName='filehelper')itchat.auto_login(True, enableCmdQR=True)
itchat.run(True)
复制代码

微信公众号自动回复

设想一个应用场景,如果有很多人需要这个数据怎么处理呢?让他们都加一下我的微信或把他们都给加到一个群里固然可以,只是不够优雅,这里想到了微信公众号,当用户关注公众号后,回复“最新数据”可把最新数据自动回复给用户是不是就优雅很多了。然后就写了个机器人自动处理,主要借助werobot模块实现。

微信公众号可以配置为开发者模式,也就是开发者可以提供一个http接口,公众号会把收到的所有消息发送给开发者提供的接口,服务器接收到数据后判断数据类型,对数据做处理,这里需要用到web服务,所以引入Django

  • url
from django.urls import pathfrom werobot.contrib.django import make_view
from official.robot import roboturlpatterns = [path('robot/', make_view(robot)),
]
复制代码
  • 机器人程序
# cat official/robot.py
import refrom werobot import WeRoBot
from werobot.replies import ImageReplyfrom official.backends.get_tdw_data import get_now_datarobot = WeRoBot(enable_session=False,token='',APP_ID='',APP_SECRET='')# 新用户关注自动回复
@robot.subscribe
def subscribe(message):return '''来了?坐,好戏马上开始回复[最新数据]获取最新数据更新'''# 联系二维码,用户输入"联系"关键字回复作者二维码
@robot.filter(re.compile(".*?联系.*?"))
def contact(message):return ImageReply(message=message,media_id="DBO8qVu-8bwNF9O7o8wCyRs4awfVTjA_WuPoLkj33B1C8ZX9JVdmw30zZo9l8ovx")# 处理文本消息
@robot.text
def hello(message):try:msg = message.content.strip().lower()if re.compile("最新.*").match(msg):tdw_zx_now_data = get_now_data()if tdw_zx_now_data:return tdw_zx_now_dataelse:return '暂时无法获取数据,请稍后再试'else:return '请输入[ 最新数据 ]获取智享数据更新\n\n如有疑问可以回复[ 联系作者 ]与我联系'except Exception as e:print(e)
复制代码
  • 后台处理程序
import json
import datetimefrom django_redis import get_redis_connection
cache = get_redis_connection('default')def get_now_data():now_time = datetime.datetime.now()prev_time = now_time - datetime.timedelta(minutes=1)# 直接去缓存取数据redis_value = cache.get('tdw_zx_now_'+prev_time.strftime('%Y%m%d%H%M'))if redis_value:jsondata = json.loads(redis_value.decode())daihuan = '今日待还金额:%s万元' %jsondata.get('daihuan')chengjiao = '当前已成交金额:%s万元' %jsondata.get('chengjiao')avg_hour_money = '完成还款预估每小时需要成交:%s万元' %jsondata.get('avg_hour_money')return '''%s\n%s\n%s\n%s''' %(prev_time.strftime('%Y-%m-%d %H:%M'), daihuan, chengjiao, avg_hour_money)else:return None
复制代码

总结

  1. 学会投资理财
  2. 别人赚钱的方式可能跟自己想象的不一样
  3. 用技术解决生活中的实际问题,不仅能提高能力,还能获得更大的满足

python如何帮我在投资中获取更高收益相关推荐

  1. APP运营如何实现流量变现,获取更高收益?

    在进行APP开发时,许多从业人员有着"等用户量大了,还愁收益问题吗"的心理.然而,当用户数量达到一定规模时,许多APP开发者开始担心流量实现的问题.甚至一些知名的APP也可能因缺乏 ...

  2. python爬虫爬猎聘网获取多条职责描述中有Linux需求的招聘信息

    python爬虫爬猎聘网获取多条职责描述中有Linux需求的招聘信息 下列是我爬虫的作业 摘 要 随着现代化社会的飞速发展,网络上巨大信息量的获取给用户带来了许多的麻烦.由于工作和生活节奏的需求,人们 ...

  3. python能帮我们实现什么用_你都用 Python 来做什么?

    「除了生孩子,Python 啥都能做!!!」这句话最近实在是有些火啊,难道 Python 就真的这么强吗?当然,不信咱们可以看一下数据 这是近期 TIOBE 公布的 2019 年 10 月编程语言排行 ...

  4. 刷金币全自动脚本 | 让Python每天帮你薅一个早餐钱(送源码)

    刷金币全自动脚本 | 让Python每天帮你薅一个早餐钱(送源码) 测试开发社区  6天前 文章转载自公众号  AirPython , 作者 星安果 阅读文本大概需要 12 分钟. 1 目 标 场 景 ...

  5. 买不到口罩怎么办?Python爬虫帮你时刻盯着自动下单!| 原力计划

    作者 | 菜园子哇 编辑 | 唐小引 来源 | CSDN 博客 马上上班了,回来的路上,上班地铁上都是非常急需口罩的. 目前也非常难买到正品.发货快的口罩,许多药店都售完了. 并且,淘宝上一些新店口罩 ...

  6. struts2 redirect 获取参数null_社会化登录支持授权域以便于获取更大权限

    使用 Authing 可以轻松接入许多社会化登录,同时无需翻看社会化登录提供方的繁琐接入文档,让开发者更加专注业务从而提升开发效率. 这看起来很方便,But,通过 Authing 登录的社会化登录用户 ...

  7. python爬虫怎么挣钱_买不到口罩怎么办?Python爬虫帮你时刻盯着自动下单!| 原力计划...

    作者 | 菜园子哇编辑 | 唐小引来源 | CSDN 博客马上上班了,回来的路上,上班地铁上都是非常急需口罩的.目前也非常难买到正品.发货快的口罩,许多药店都售完了.并且,淘宝上一些新店口罩库存写着非 ...

  8. 买不到口罩怎么办?Python 爬虫帮你时刻盯着自动下单!| 原力计划

    作者 | 菜园子哇 责编 | 唐小引 头图 | 下载自东方 IC 出品 | CSDN 博客 马上上班了,回来的路上,上班地铁上都是非常急需口罩的. 目前也非常难买到正品.发货快的口罩,许多药店都售完了 ...

  9. python编程入门 适合于零基础朋友-Python不能帮你找到女朋友,却能让你成为有钱的单身狗。...

    原标题:Python不能帮你找到女朋友,却能让你成为有钱的单身狗. 王者荣耀的团队年终奖是100个月工资.华为的员工房租补贴就有8000块.BAT校招起步价年薪20万--如果你看到这些消息的第一反应就 ...

最新文章

  1. JAVA正则表达式的学习
  2. TCP三次握手Render Tree页面渲染=从输入URL到页面显示的过程?
  3. 再学 GDI+[79]: 区域(8) - Transform - 区域的 Matrix 变换
  4. C语言使用1到9求出所有k个数字的所有组合的算法(附完整源码)
  5. Codeforces Round #717 (Div. 2) D. Cut 倍增
  6. 7 centos 时钟跟物理机同步_centos7上使用chrony自动同步时间
  7. javascript-引入-函数的定义与使用-多值传参-ao对象
  8. Dirichlet Distribution(狄利克雷分布)与Dirichlet Process(狄利克雷过程)
  9. PDFlib使用实例
  10. 详细认识一下CSS盒子模型
  11. 手推机器学习公式(一) —— BP 反向传播算法
  12. iis 运行时错误_新手必看,17个常见的Python运行时错误
  13. foobar2000 for mac(经典音乐播放器)
  14. Java技术栈(跳槽,面试必备)
  15. 通过Cmd窗口按照指定浏览器打开网页
  16. java 密码库_JCA-Java加密框架
  17. About the ball Technical support
  18. 虎书学习笔记2:图形学基础数学(向量、点积、叉积、)
  19. 今日踩坑Maven:omitted for duplicate
  20. jQuery插件autoComplete介绍(10级学员 张帅鹏总结)

热门文章

  1. 如何在 Xcode 中修改应用的名字
  2. 操作系统实验之作业调度算法
  3. 安装Exchange Server2016管理工具
  4. 我们应该怎么使用网络中赋予我们的权限
  5. 【UIKit】解决iOS7状态栏问题
  6. 检查点重做检查点队列简单总结Strut2教程-java教程
  7. 阿里员工吐槽:杭州22k拿到头条35k和shopee33k的offer,怎么选?
  8. Java中栈、堆和常量池
  9. 使用KiWi Syslog Daemon构建日志服务器
  10. (linux)查看及修改文件权限以及相关