关于数据来源

本项目写于2017年七月初,主要使用Python爬取网贷之家以及人人贷的数据进行分析。 网贷之家是国内最大的P2P数据平台,人人贷国内排名前二十的P2P平台。 源码地址

数据爬取

抓包分析

抓包工具主要使用chrome的开发者工具 网络一栏,网贷之家的数据全部是ajax返回json数据,而人人贷既有ajax返回数据也有html页面直接生成数据。

请求实例

从数据中可以看到请求数据的方式(GET或者POST),请求头以及请求参数。 从请求数据中可以看到返回数据的格式(此例中为json)、数据结构以及具体数据。 注:这是现在网贷之家的API请求后台的接口,爬虫编写的时候与数据接口与如今的请求接口不一样,所以网贷之家的数据爬虫部分已无效。

构造请求

根据抓包分析得到的结果,构造请求。在本项目中,使用Python的 requests库模拟http请求 具体代码:

import requests
class SessionUtil():def __init__(self,headers=None,cookie=None):self.session=requests.Session()if headers is None:headersStr={"Accept":"application/json, text/javascript, */*; q=0.01","X-Requested-With":"XMLHttpRequest","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36","Accept-Encoding":"gzip, deflate, sdch, br","Accept-Language":"zh-CN,zh;q=0.8"}self.headers=headersStrelse:self.headers=headersself.cookie=cookie//发送get请求def getReq(self,url):return self.session.get(url,headers=self.headers).textdef addCookie(self,cookie):self.headers['cookie']=cookie//发送post请求def postReq(self,url,param):return self.session.post(url, param).text
复制代码

在设置请求头的时候,关键字段只设置了"User-Agent",网贷之家和人人贷的没有反爬措施,甚至不用设置"Referer"字段来防止跨域错误。

爬虫实例

以下是一个爬虫实例

import json
import time
from databaseUtil import DatabaseUtil
from sessionUtil import SessionUtil
from dictUtil import DictUtil
from logUtil import LogUtil
import traceback
def handleData(returnStr):jsonData=json.loads(returnStr)platData=jsonData.get('data').get('platOuterVo')return platData
def storeData(jsonOne,conn,cur,platId):actualCapital=jsonOne.get('actualCapital')aliasName=jsonOne.get('aliasName')association=jsonOne.get('association')associationDetail=jsonOne.get('associationDetail')autoBid=jsonOne.get('autoBid')autoBidCode=jsonOne.get('autoBidCode')bankCapital=jsonOne.get('bankCapital')bankFunds=jsonOne.get('bankFunds')bidSecurity=jsonOne.get('bidSecurity')bindingFlag=jsonOne.get('bindingFlag')businessType=jsonOne.get('businessType')companyName=jsonOne.get('companyName')credit=jsonOne.get('credit')creditLevel=jsonOne.get('creditLevel')delayScore=jsonOne.get('delayScore')delayScoreDetail=jsonOne.get('delayScoreDetail')displayFlg=jsonOne.get('displayFlg')drawScore=jsonOne.get('drawScore')drawScoreDetail=jsonOne.get('drawScoreDetail')equityVoList=jsonOne.get('equityVoList')experienceScore=jsonOne.get('experienceScore')experienceScoreDetail=jsonOne.get('experienceScoreDetail')fundCapital=jsonOne.get('fundCapital')gjlhhFlag=jsonOne.get('gjlhhFlag')gjlhhTime=jsonOne.get('gjlhhTime')gruarantee=jsonOne.get('gruarantee')inspection=jsonOne.get('inspection')juridicalPerson=jsonOne.get('juridicalPerson')locationArea=jsonOne.get('locationArea')locationAreaName=jsonOne.get('locationAreaName')locationCity=jsonOne.get('locationCity')locationCityName=jsonOne.get('locationCityName')manageExpense=jsonOne.get('manageExpense')manageExpenseDetail=jsonOne.get('manageExpenseDetail')newTrustCreditor=jsonOne.get('newTrustCreditor')newTrustCreditorCode=jsonOne.get('newTrustCreditorCode')officeAddress=jsonOne.get('officeAddress')onlineDate=jsonOne.get('onlineDate')payment=jsonOne.get('payment')paymode=jsonOne.get('paymode')platBackground=jsonOne.get('platBackground')platBackgroundDetail=jsonOne.get('platBackgroundDetail')platBackgroundDetailExpand=jsonOne.get('platBackgroundDetailExpand')platBackgroundExpand=jsonOne.get('platBackgroundExpand')platEarnings=jsonOne.get('platEarnings')platEarningsCode=jsonOne.get('platEarningsCode')platName=jsonOne.get('platName')platStatus=jsonOne.get('platStatus')platUrl=jsonOne.get('platUrl')problem=jsonOne.get('problem')problemTime=jsonOne.get('problemTime')recordId=jsonOne.get('recordId')recordLicId=jsonOne.get('recordLicId')registeredCapital=jsonOne.get('registeredCapital')riskCapital=jsonOne.get('riskCapital')riskFunds=jsonOne.get('riskFunds')riskReserve=jsonOne.get('riskReserve')riskcontrol=jsonOne.get('riskcontrol')securityModel=jsonOne.get('securityModel')securityModelCode=jsonOne.get('securityModelCode')securityModelOther=jsonOne.get('securityModelOther')serviceScore=jsonOne.get('serviceScore')serviceScoreDetail=jsonOne.get('serviceScoreDetail')startInvestmentAmout=jsonOne.get('startInvestmentAmout')term=jsonOne.get('term')termCodes=jsonOne.get('termCodes')termWeight=jsonOne.get('termWeight')transferExpense=jsonOne.get('transferExpense')transferExpenseDetail=jsonOne.get('transferExpenseDetail')trustCapital=jsonOne.get('trustCapital')trustCreditor=jsonOne.get('trustCreditor')trustCreditorMonth=jsonOne.get('trustCreditorMonth')trustFunds=jsonOne.get('trustFunds')tzjPj=jsonOne.get('tzjPj')vipExpense=jsonOne.get('vipExpense')withTzj=jsonOne.get('withTzj')withdrawExpense=jsonOne.get('withdrawExpense')sql='insert into problemPlatDetail (actualCapital,aliasName,association,associationDetail,autoBid,autoBidCode,bankCapital,bankFunds,bidSecurity,bindingFlag,businessType,companyName,credit,creditLevel,delayScore,delayScoreDetail,displayFlg,drawScore,drawScoreDetail,equityVoList,experienceScore,experienceScoreDetail,fundCapital,gjlhhFlag,gjlhhTime,gruarantee,inspection,juridicalPerson,locationArea,locationAreaName,locationCity,locationCityName,manageExpense,manageExpenseDetail,newTrustCreditor,newTrustCreditorCode,officeAddress,onlineDate,payment,paymode,platBackground,platBackgroundDetail,platBackgroundDetailExpand,platBackgroundExpand,platEarnings,platEarningsCode,platName,platStatus,platUrl,problem,problemTime,recordId,recordLicId,registeredCapital,riskCapital,riskFunds,riskReserve,riskcontrol,securityModel,securityModelCode,securityModelOther,serviceScore,serviceScoreDetail,startInvestmentAmout,term,termCodes,termWeight,transferExpense,transferExpenseDetail,trustCapital,trustCreditor,trustCreditorMonth,trustFunds,tzjPj,vipExpense,withTzj,withdrawExpense,platId) values ("'+actualCapital+'","'+aliasName+'","'+association+'","'+associationDetail+'","'+autoBid+'","'+autoBidCode+'","'+bankCapital+'","'+bankFunds+'","'+bidSecurity+'","'+bindingFlag+'","'+businessType+'","'+companyName+'","'+credit+'","'+creditLevel+'","'+delayScore+'","'+delayScoreDetail+'","'+displayFlg+'","'+drawScore+'","'+drawScoreDetail+'","'+equityVoList+'","'+experienceScore+'","'+experienceScoreDetail+'","'+fundCapital+'","'+gjlhhFlag+'","'+gjlhhTime+'","'+gruarantee+'","'+inspection+'","'+juridicalPerson+'","'+locationArea+'","'+locationAreaName+'","'+locationCity+'","'+locationCityName+'","'+manageExpense+'","'+manageExpenseDetail+'","'+newTrustCreditor+'","'+newTrustCreditorCode+'","'+officeAddress+'","'+onlineDate+'","'+payment+'","'+paymode+'","'+platBackground+'","'+platBackgroundDetail+'","'+platBackgroundDetailExpand+'","'+platBackgroundExpand+'","'+platEarnings+'","'+platEarningsCode+'","'+platName+'","'+platStatus+'","'+platUrl+'","'+problem+'","'+problemTime+'","'+recordId+'","'+recordLicId+'","'+registeredCapital+'","'+riskCapital+'","'+riskFunds+'","'+riskReserve+'","'+riskcontrol+'","'+securityModel+'","'+securityModelCode+'","'+securityModelOther+'","'+serviceScore+'","'+serviceScoreDetail+'","'+startInvestmentAmout+'","'+term+'","'+termCodes+'","'+termWeight+'","'+transferExpense+'","'+transferExpenseDetail+'","'+trustCapital+'","'+trustCreditor+'","'+trustCreditorMonth+'","'+trustFunds+'","'+tzjPj+'","'+vipExpense+'","'+withTzj+'","'+withdrawExpense+'","'+platId+'")'cur.execute(sql)conn.commit()conn,cur=DatabaseUtil().getConn()
session=SessionUtil()
logUtil=LogUtil("problemPlatDetail.log")
cur.execute('select platId from problemPlat')
data=cur.fetchall()
print(data)
mylist=list()
print(data)
for i in range(0,len(data)):platId=str(data[i].get('platId'))mylist.append(platId)print mylist
for i in mylist:url='http://wwwservice.wdzj.com/api/plat/platData30Days?platId='+itry:data=session.getReq(url)platData=handleData(data)dictObject=DictUtil(platData)storeData(dictObject,conn,cur,i)except Exception,e:traceback.print_exc()
cur.close()
conn.close
复制代码

整个过程中 我们 构造请求,然后把解析每个请求的响应,其中json返回值使用json库进行解析,html页面使用BeautifulSoup库进行解析(结构复杂的html的页面推荐使用lxml库进行解析),解析到的结果存储到mysql数据库中。

爬虫代码

爬虫代码地址(注:爬虫使用代码Python2与python3都可运行,本人把爬虫代码部署在阿里云服务器上,使用Python2 运行)

数据分析

数据分析主要使用Python的numpy、pandas、matplotlib进行数据分析,同时辅以海致BDP。

时间序列分析

数据读取

一般采取把数据读取pandas的DataFrame中进行分析。 以下就是读取问题平台的数据的例子

problemPlat=pd.read_csv('problemPlat.csv',parse_dates=True)#问题平台
复制代码

数据结构

时间序列分析

eg 问题平台数量随时间变化

problemPlat['id']['2012':'2017'].resample('M',how='count').plot(title='P2P发生问题')#发生问题P2P平台数量 随时间变化趋势
复制代码

图形化展示

地域分析

使用海致BDP完成(Python绘制地图分布轮子比较复杂,当时还未学习)

各省问题平台数量

各省平台成交额

规模分布分析

eg 全国六月平台成交额分布 代码

juneData['amount'].hist(normed=True)
juneData['amount'].plot(kind='kde',style='k--')#六月份交易量概率分布
复制代码

核密度图形展示

成交额取对数核密度分布

np.log10(juneData['amount']).hist(normed=True)
np.log10(juneData['amount']).plot(kind='kde',style='k--')#取 10 对数的 概率分布
复制代码

图形化展示

可看出取10的对数后分布更符合正常的金字塔形。

相关性分析

eg.陆金所交易额与所有平台交易额的相关系数变化趋势

lujinData=platVolume[platVolume['wdzjPlatId']==59]
corr=pd.rolling_corr(lujinData['amount'],allPlatDayData['amount'],50,min_periods=50).plot(title='陆金所交易额与所有平台交易额的相关系数变化趋势')
复制代码

图形化展示

分类比较

车贷平台与全平台成交额数据对比

carFinanceDayData=carFinanceData.resample('D').sum()['amount']
fig,axes=plt.subplots(nrows=1,ncols=2,sharey=True,figsize=(14,7))
carFinanceDayData.plot(ax=axes[0],title='车贷平台交易额')
allPlatDayData['amount'].plot(ax=axes[1],title='所有p2p平台交易额')
复制代码

趋势预测

eg预测陆金所成交量趋势(使用Facebook Prophet库完成)

lujinAmount=platVolume[platVolume['wdzjPlatId']==59]
lujinAmount['y']=lujinAmount['amount']
lujinAmount['ds']=lujinAmount['date']
m=Prophet(yearly_seasonality=True)
m.fit(lujinAmount)
future=m.make_future_dataframe(periods=365)
forecast=m.predict(future)
m.plot(forecast)
复制代码

趋势预测图形化展示

数据分析代码

数据分析代码地址(注:数据分析代码智能运行在Python3 环境下) 代码运行后样例(无需安装Python环境 也可查看具体代码解图形化展示)

后记

这是本人从 Java web转向数据方向后自己写的第一项目,也是自己的第一个Python项目,在整个过程中,也没遇到多少坑,整体来说,爬虫和数据分析以及Python这门语言门槛都是非常低的。 如果想入门Python爬虫,推荐《Python网络数据采集》

如果想入门Python数据分析,推荐 《利用Python进行数据分析》

网贷数据爬取及据分析相关推荐

  1. python爬人人贷代码视频_【IT专家】人人贷网的数据爬取(利用python包selenium)

    本文由我司收集整编,推荐下载,如有疑问,请与我司联系 人人贷网的数据爬取(利用 python 包 selenium ) 2016/12/31 0 记得之前应同学之情,帮忙爬取人人贷网的借贷人信息,综合 ...

  2. 【爬虫+数据可视化毕业设计:英雄联盟数据爬取及可视化分析,python爬虫可视化/数据分析/大数据/大数据屏/数据挖掘/数据爬取,程序开发-哔哩哔哩】

    [爬虫+数据可视化毕业设计:英雄联盟数据爬取及可视化分析,python爬虫可视化/数据分析/大数据/大数据屏/数据挖掘/数据爬取,程序开发-哔哩哔哩] https://b23.tv/TIoy6hj

  3. 人人贷网的数据爬取(利用python包selenium)

    记得之前应同学之情,帮忙爬取人人贷网的借贷人信息,综合网上各种相关资料,改善一下别人代码,并能实现数据代码爬取,具体请看我之前的博客:http://www.cnblogs.com/Yiutto/p/5 ...

  4. python如何爬虫股票数据_简单爬虫:东方财富网股票数据爬取(python_017)

    需求:将东方财富网行情中心的股票数据爬取下来,包括上证指数.深圳指数.上证A股.深圳A股.新股.中小板.创业板 等 一.目标站点分析 东方财富网的行情中心页面包含了所有股票信息.在左侧的菜单栏中包含了 ...

  5. 金投网煤炭数据爬取-精进版

    金投网数据爬取-加强版 注:博主经过一个暑假的游手好闲,学习到了xpath及一些其他的有意思的小东西.对于之前爬取金投网的课题有了一些新的思路,特此卷土重来,让我们开始吧! 目录标题 金投网数据爬取- ...

  6. 数据爬取到可视化分析

    文章目录 一.数据爬取 1.python简介 2.什么是网路爬虫 3.网页解析 4.数据爬取流程 二.数据清洗 1.数据格式统一处理 2.信息标题特殊字符处理 三.数据分析以及可视化 1.什么是pan ...

  7. 基于python的自媒体和官媒数据爬取、可视化分析及云词图制作

    创作不易,如果以下内容对你有帮助,别忘了点一个赞,让更多的小伙伴能看到吧~~ 1. 问题描述 为了研究自媒体和官媒的传播新闻<武汉快递小哥汪勇的先进事迹>的及时性和传播力度,对比两种传播途 ...

  8. 大数据 爬取网站并分析数据

    大数据+爬取前程无忧校园招聘+flume+hive+mysql+数据可视化 自己搭建的hadoop博客 1.爬取前程无忧网页和校园招聘 1.1用scrapy爬取前途无忧网站,我爬了10w多条数据,在存 ...

  9. 数据可视化课程设计——北京新发地官网数据分析与可视化展示【内容在jupyter notebook里面展示】包含数据爬取与可视化分析详解

    目录 一.课题说明 1.1.设计原因: 1.2.设计目标: 1.3.开发环境: 1.4.爬取网站链接 二.准备工作 2.1.数据获取: 2.2.爬取的数据说明: 2.3.爬虫程序设计的思路: 三.详细 ...

最新文章

  1. python3.x下 smtp发送html邮件和附件
  2. matlab索引程序,Matlab索引到逻辑索引
  3. Keil 函数内联 inline
  4. 怎么把数据存到MySQL_怎样将Arduino数据直接存储到MySQL
  5. ITK:重新采样分割图像
  6. SocketIO---bio2---带线程池处理任务
  7. CODEVS——T 1049 棋盘染色
  8. BZOJ2038 : [2009国家集训队]小Z的袜子(hose)(莫队算法)
  9. java一个接口可以继承另外一个接口吗
  10. C语言之反序数组和求最大值和最小值
  11. vue表单中批量导入功能_vue实战(11)——vue+element UI实现表格数据导出Excel功能
  12. HTML fieldset 标签
  13. Windows系统备份方法解答
  14. MVPArms框架学习遇到的一个问题——普通Activity配合Fragment出现空指针
  15. 树莓派做无线打印服务器,用树莓派和 CUPS 打印服务器将你的打印机变成网络打印机...
  16. Magisk 安装error
  17. 黑鲨重装计算机安装无法继续,黑鲨装机大师一键重装系统失败
  18. 计算机启动方式如何选择USB启动,如何设置电脑从usb启动详细方法
  19. HDU 5698 瞬间移动 (2016百度之星 - 初赛(Astar Round2B) 1003)
  20. Outlook 365 添加企业Exchange邮箱(亲测)

热门文章

  1. windows下-phpstrom下搜狗输入法光标不一致的解决方案
  2. 怎么用计算机管理权限删除文件,管理员权限删除文件方法介绍
  3. KDB_Database_Link 使用介绍
  4. 飞桨领航团双城记|南京深圳开发者都来听的技术talk到底多精彩
  5. 解决zadig装错驱动导致电脑鼠标用不了的情况
  6. oracle修改分区条件,请问能不能更改已经建好的范围分区表的分区规则呢?
  7. 探索PADS layout高级使用技巧:通过BOM 反标记layout中的 元件值
  8. 英伟达Nvidia TX1 TX2 串口通信方法
  9. 编译原理中LR(0)项目集规范族的构造
  10. 机器人避障之滑动窗口处理数据