本篇文章是使用python抓取数据的第二篇,使用urllib方法对人人贷网站贷款列表页进行抓取。并从中获取贷款用户,金额和期限的分布情况。
首先是准备工作,导入需要使用的库文件,re用于通过正则提取数据,time用于设置Sleep时间,numpy用于数值计算,pandas用于数据汇总和分析,urllib用于数据抓取,matplotlib用于数据可视化。
#导入所需库文件 import re import time import numpy as np import pandas as pd import urllib.request import matplotlib.pyplot as plt
开始抓取前设置列表页的URL地址,其中page-后面的部分是页码,将在后面动态生成。
url=’http://www.we.com/loan#page-‘
设置请求的头文件信息,这部分内容可以在Chrome的开发者工具中获得,或者在网站搜索头文件信息。
#设置请求头文件信息 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11', 'Accept':'text/html;q=0.9,*/*;q=0.8', 'Accept-Charset':'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'Connection':'close', 'Referer':'http://bzclk.baidu.com/' }
列表页共有52个页面,使用for循环每次输出一个页码,与之前设置的URL地址拼接成要抓取的列表页URL,并进行抓取。每次抓取间休息2秒针。将抓取的到的页面保存在html中。
#循环抓取列表页信息 for i in range(0,52): i=str(i) if i==0: req=urllib.request.Request(url=url+i,headers=headers) resq=urllib.request.urlopen(req,timeout=2) html=resq.read() else: req=urllib.request.Request(url=url+i,headers=headers) resq=urllib.request.urlopen(req,timeout=2) html2=resq.read() html = html + html2 time.sleep(2) print(url+i)
抓取到的页面需要进行解析,然后使用正则提取关键信息,以便后续的分析过程。
#对页面进行解析 html=html.decode('utf-8')
#使用正则提取title字段 title=re.findall(r'"title":(.*?),',html)
#使用正则提取amount字段 amount=re.findall(r'"amount":(.*?),',html) #使用正则提取interest字段 interest=re.findall(r'"interest":(.*?),',html) #使用正则提取months字段 months=re.findall(r'"months":(.*?),',html)
将提取的字段拼接在一起创建用于分析的数据透视表。并对数据进行清洗和预处理。
#拼接字段创建名为rrd的数据表 rrd=pd.DataFrame({'title':title,'amount':amount,'interest':interest,'months':months})
#查看表的维度,1020行,4列 rrd.shape (1020, 4)
#查看数据表前5行 rrd.head()
#查看字段类型 rrd.dtypes amount object interest object months object title object dtype: object
#更改amount,interest和months字段的格式 rrd[['amount','interest','months']]=rrd[['amount','interest','months']].astype(np.float64)
#再次查看更改后的字段格式 rrd.dtypes amount float64 interest float64 months float64 title object dtype: object
查看数据表中的贷款数据的关键指标,如贷款总金额,总笔数,人均贷款金额和贷款金额范围等等。
#总贷款金额和笔数 rrd['amount'].sum(),rrd['amount'].count() (95390400.0, 1020) #平均贷款金额 rrd['amount'].sum()/rrd['amount'].count() 93520.0 #贷款金额的最大值和最小值 rrd['amount'].max(),rrd['amount'].min() (262000.0, 15400.0)
贷款总金额9539万元,笔数1020笔。每一笔的平均贷款金额为93520元。贷款金额最大值为262000元,最小值为15400元。
按贷款目的对比贷款金额及笔数的分布情况,首先分别按贷款目的汇总贷款金额和笔数数据。
#按贷款目的汇总贷款笔数 title_count=rrd.groupby('title')['amount'].agg('count') #按贷款目的汇总贷款金额 title_sum=rrd.groupby('title')['amount'].agg('sum')
绘制图表查看金额和笔数分布情况。从图表中可以看出日常生活消费的贷款笔数最多,但总金额较低,而资金周转的贷款笔数较低,但总贷款金额较大。
#绘制贷款用户金额及笔数分布图 plt.rc('font', family='STXihei', size=15) a=np.array([1,2,3,4,5]) plt.figure() plt.barh([1,2,3,4,5],title_count,color='#99CC01',alpha=0.8,align='center',edgecolor='white') plt.barh([1,2,3,4,5],-rrd_title,color='#39A2E1',alpha=0.8,align='center',edgecolor='white') plt.ylabel('贷款用途分类') plt.title('贷款用户金额及笔数') plt.xticks(a,('')) plt.yticks(a,('资金周转','装修','增购新车','购买货物','日常生活消费')) plt.show()
贷款期限分布
按贷款期限对贷款笔数进行汇总,查看不同期限的贷款笔数分布情况。首先对数据按期限进行汇总。
#按期限汇总贷款笔数 month_count=rrd.groupby('months')['amount'].agg('count')
绘制图表,查看贷款期限分布情况,大部分贷款期限为36个月,24个月和48个月的贷款数量明显较少。
#汇总不同期限贷款笔数分布图 plt.rc('font', family='STXihei', size=15) a=np.array([1,2,3]) plt.bar([1,2,3],month_count,color='#99CC01',alpha=0.8,align='center',edgecolor='white') plt.xlabel('期限分布') plt.ylabel('贷款笔数') plt.title('不同期限的贷款笔数分布') plt.legend(['贷款笔数'], loc='best') plt.grid(color='#95a5a6',linestyle='--', linewidth=1,axis='y',alpha=0.4) plt.xticks(a,(['24个月','36个月','48个月'])) plt.show()
贷款金额分布
对贷款金额进行分组,5万元一组,共分为6组。然后查看各个分组内贷款金额的情况。首先对贷款金额进行分组,然后按分组对金额进行汇总。
#对贷款金额进行分组 bins = [0, 50000, 100000, 150000, 200000, 250000, 300000] amount_group = ['0-5万', '5-10万', '10-15万', '15-20万','20-25万','25-30万'] rrd['amount_group'] = pd.cut(rrd['amount'], bins, labels=amount_group)
#查看分组后的数据表 rrd.head()
#按贷款金额分组汇总笔数 amount_group=rrd.groupby('amount_group')['amount_group'].agg(len)
绘制贷款用户金额分布图,从图表中可以看出,5-10万元的贷款笔数做多,其次为0-5万元。大金额的贷款笔数较少。
#绘制贷款用户金额分布图 plt.rc('font', family='STXihei', size=13) a=np.array([1,2,3,4,5,6]) plt.bar([1,2,3,4,5,6],amount_group,color='#99CC01',alpha=0.8,align='center',edgecolor='white') plt.xlabel('金额分组') plt.ylabel('贷款笔数') plt.title('贷款用户金额分布') plt.legend(['笔数'], loc='upper right') plt.grid(color='#95a5a6',linestyle='--', linewidth=1,axis='y',alpha=0.4) plt.xticks(a,('0-5万', '5-10万', '10-15万', '15-20万','20-25万','25-30万')) plt.show()
—【所有文章及图片版权归 蓝鲸(王彦平)所有。欢迎转载,但请注明转自“蓝鲸网站分析博客”。】—