如何抢到年化50%的理财

目的

市场上有很多互联网金融公司开展了P2P业务,用户购买某P2P产品并持有一定时间后可以转让,用户为了能顺利出让,一般会出让部分收益,因此会出现很高收益的理财产品,本文的目的便是利用爬虫抢到这些高收益的理财产品。

目标

这里选取小牛理财wap作站点为爬取网站[https://www.xiaoniu88.com/weixin]

通过分析该网站的请求,发现理财产品列表是有单独的接口提供json数据,因此不用费劲的爬取页面做元素解析。


image.png

爬虫的大致方案如下:

  • 使用python的urllib2和BeautifulSoup工具
  • 使用sqllite3存储历史数据
  • 自定义抢购理财产品
--使用sqllite3 存储爬虫数据
CREATE TABLE product(id int primary key not null,showDeadline long,showAnnualRate float,borrowAmount float,borrowTitle varchar(100),fullTenderTime long,publishTime long);
调用mac弹窗提醒
osascript -e 'display notification "有推荐的理财" with title "理财来了"'  
##使用yaml读取配制文件提醒购买,例如遇到年花收益率大于15%,金额大于20000元,剩余时间不超过100天则提醒
#cfg.yaml
#showAnnualRate: 15
#borrowAmount: 20000
#showdeadline: 100
import yaml
cfg=yaml.load(f)
annualRate_target = cfg['showAnnualRate']
amount_target = cfg['borrowAmount']
showdeadline = cfg['showdeadline']
#遇到符合配制文件条件的数据调用浏览器打开符合浏览器指向该理财产品页面,并调用mac语音命令提醒
import webbrowser
url_target = 'https://www.xiaoniu88.com/weixin/productDetails/'+str(id)
webbrowser.open(url_target)
print webbrowser.get()
os.system("say '新理财' ")
##爬虫采取urlib2和BeautifulSoup,需要设置完整cookie,否则无法爬取
    req = urllib2.Request(url,None,req_header)
    response = urllib2.urlopen(req)
    data = response.read()
    soup=BeautifulSoup(data,'lxml')
    json1 = json.loads(soup.p.string)

运行爬虫

运行爬虫后,当遇到符合条件的理财产品时,便会提醒,并在浏览器打开该理财产品。


image.png

历史数据分析

通过对爬取的历史数据进行分析,发现大概每天会几十到一百笔左右理财转让。

日期 转让笔数
2017-05-01 36
2017-05-02 93
2017-05-03 25
2017-05-04 44
2017-05-05 139
2017-05-06 59
2017-05-07 55
2017-05-08 119
2017-05-09 30
2017-05-10 85
2017-05-11 81
2017-05-12 119
2017-05-13 65
2017-05-14 43
2017-05-15 139
2017-05-16 158
2017-05-17 70
2017-05-18 88
2017-05-19 89
2017-05-20 54
2017-05-21 35
2017-05-22 187

前十名收益的产品来看,最高收益超过了90%,基本都是秒抢,因此一般还是很难抢到,下一步需要研究下下单的接口,如果能自动下单概率就大很多。

名称 | id | 持有天数 | 年化收益 | 秒抢时间
----|------|----
安心牛Z20160808-203|470506|44|92.78|14
安心牛Z20170112-135|506087|50|79.2|12
安心牛Z20170417-117|523123|118|58.32|7
安心牛Z20170130-040|508817|48|56.07|70
安心牛Z20160811-170|471457|42|50.88|86
安心牛Z20170319-092|518157|49|45.48|36
安心牛Z20170511-060|527610|212|44.15|20
安心牛Z20161219-183|501525|99|40.0|67
安心牛Z20160731-079|468159|111|37.3|9
安心牛Z20170417-118|523124|123|34.86|9

完整代码

# -*- coding: utf-8 -*-
import urllib2
import sys
import os
import gzip
import StringIO
import json
from bs4 import BeautifulSoup
import webbrowser
import pygame
import yaml
import time
import sqlite3
cookie='''referer="https://www.baidu.com/_2017-05-17|https://www.baidu.com/_2017-05-17"; JSESSIONID=2260FFDD0CA3CE64B611C1379EBB09D7.t-9003; _ga=GA1.2.2061273543.1495018863; Hm_lvt_7226b8c48cd07619c7a9ebd471d9d589=1495018863,1495020571; Hm_lpvt_7226b8c48cd07619c7a9ebd471d9d589=1495020778; _jzqx=1.1495459084.1495459084.1.jzqsr=xiaoniu88%2Ecom|jzqct=/weixin/register.-; _jzqckmp=1; _jzqa=1.751493343713972600.1495459084.1495459084.1495459084.1; _jzqc=1; _qzja=1.2047379673.1495459084080.1495459084080.1495459084082.1495459084080.1495459084082..1.0.1.1; _qzjc=1; SESSIONID=38c1567f-4fdb-44f3-a136-7e890cfc7d8f; Hm_lvt_a8083b9357dade16389e88eed86fe3df=1495459013,1495459102,1495459585,1495459595; Hm_lpvt_a8083b9357dade16389e88eed86fe3df=1495468356; sr=334.127.201.43.11.3.123.58.160.131.0.33.20.15.07'''
req_header = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language':'zh-CN,zh;q=0.8,en;q=0.6',
'Accept-Encoding':'gzip, deflate, sdch, br',
'Connection':'keep-alive',
'Cookie':cookie,
'Referer':'https://www.xiaoniu88.com/weixin/productlist/v2/transferable',
'Host':'www.xiaoniu88.com',
'Upgrade-Insecure-Requests':'1',
'Cache-Control':'max-age=0'}
reload(sys)
sys.setdefaultencoding('utf8')
print 'ok'
conn=sqlite3.connect("/Users/jerryliu/soft/sqlite-tools-osx-x86-3180000/test.db")
url_model = "https://www.xiaoniu88.com/weixin/productlist/v2/transferable/{0}/100?1495467410387"
i=0
while 2>1:
    url = url_model.format(i)
    print 'url'+url
    i=i+1
    req = urllib2.Request(url,None,req_header)  
    response = urllib2.urlopen(req)  
    data = response.read() 
    soup=BeautifulSoup(data,'lxml')
    json1 = json.loads(soup.p.string)
    result = json1['data']
    f=open("cfg.yaml")
    cfg=yaml.load(f)
    annualRate_target = cfg['showAnnualRate']
    amount_target = cfg['borrowAmount']
    print 'len:'+str(len(result))
    for d in result:
        id = d['productDTO']['id'] #id
        showdeadline = d['productDTO']['showDeadline']         ##截止时间
        showAnnualRate = d['productDTO']['showAnnualRate']  ##年化收益率
        borrowAmount = d['productDTO']['borrowAmount']         ##金额
        borrowTitle = d['productDTO']['borrowTitle']           ##标记
        fullTenderTime = d['productDTO']['fullTenderTime'] ##满额时间
        publishTime = d['productDTO']['publishTime']
        borrowTitle = d['productDTO']['borrowTitle']
        expireDt = d['productDTO']['expireDt']
        if fullTenderTime==None:
        fullTenderTime=0
        print str(id)+":"+str(showAnnualRate)+":"+str(borrowAmount)+":"+borrowTitle
        sql='''insert into product (id,showDeadline,showAnnualRate,borrowAmount,borrowTitle,fullTenderTime,publishTime) values ({0},{1},{2},{3},'{4}',{5},{6}) '''.format(id,showdeadline,showAnnualRate,borrowAmount,borrowTitle,fullTenderTime,publishTime)
    try:
        conn.execute(sql)
            conn.commit()
    except sqlite3.IntegrityError: 
        print 'dupli'
    if showAnnualRate>=float(annualRate_target) and borrowAmount>=float(amount_target) and fullTenderTime==0:
            cmd = ''' osascript -e 'display notification "有推荐的理财" with title "理财来了"'  '''
            os.system(cmd)
            url_target = 'https://www.xiaoniu88.com/weixin/productDetails/'+str(id)
            webbrowser.open(url_target)
            print webbrowser.get()
            os.system("say '新理财' ")
            break
    time.sleep(10)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容