专栏名称: 大数据分析和人工智能
以传播大数据、解读行业趋势、数据化运营为核心的新媒体平台,已有150多万行业人士关注,荣获2013年新浪微博百强自媒体、2016年中国十大大数据领域影响力平台,关注我就是关注数据
目录
相关文章推荐
数据派THU  ·  一文解析 DeepSeek ... ·  2 天前  
软件定义世界(SDX)  ·  觉醒学院&流量坊:DeepSeek:7大场景 ... ·  3 天前  
大数据文摘  ·  使用AI的成本每12个月下降10倍,“奥特曼 ... ·  5 天前  
51好读  ›  专栏  ›  大数据分析和人工智能

手把手教你使用python和tableau对数据进行抓取及可视化

大数据分析和人工智能  · 公众号  · 大数据  · 2017-09-24 07:33

正文

本篇文章介绍使用python抓取贷款及理财平台的数据,并将数据拼接和汇总。最终通过tableau进行可视化。与之前的python爬虫文章 不同之处在于之前是一次性抓取生产数据表,本次的数据需要每天重复抓取及存储,并汇总在一起进行分析和可视化。

开始前的准备工作

开始之前先导入所需使用的库文件,各个库文件在整个抓取和拼表过程中负责不同的部分。Requests负责页面抓取,re负责从抓取下来的页面中提取有用的信息,pandas负责拼接并生成数据表以及最终的数据表导出。


#导入requests库(请求和页面抓取)

import requests

#导入正则库(从页面代码中提取信息)

import re

#导入科学计算库(拼表及各种分析汇总)

import pandas as pd


设置一个头文件信息,方便后面的抓取。这个头文件有两个作用,第一防止抓取时被封,第二方便后面对页面源文件的转码。


#设置请求中头文件的信息

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':'https://www.bluewhale.cc/'

}



抓取贷款及理财信息

准备工作完成后开始对贷款和理财信息进行抓取,这里我们偷个懒,直接抓取p2peye.com的信息。p2peye.com是一个网贷咨询及数据平台,内容很丰富。他们定期更新各平台的贷款及理财数据。


因为所有的网贷平台信息都在一页上,所以抓取起来比较简单,不需要翻页。下面是抓取并保存页面信息的代码。


#抓取并保存页面信息

r=requests.get('http://www.p2peye.com/shuju/ptsj/',headers=headers)

html=r.content


抓取下来的信息需要进行转码才能变成有用的信息,下面对页面源代码进行GBK转码。


#对抓取的页面进行编码

html=str(html, encoding = "GBK")


查看一下转码后的页面,我们需要的信息都包含在里面了。后面只需要使用正则表达式逐个提取出来就可以了。


#查看抓取的页面源码

html



提取信息并进行数据清洗

使用正则表达式对应着页面中的字段逐个将关键数据从页面源码中提取出来,下面是具体的过程,首先提取的是平台名称字段。在页面源码中平台名称在title中。


#使用正则提取title字段信息

title=re.findall(r'"return false".*?title="(.*?)"',html)


提取后查看下结果,内容很干净,不需要进行清洗可以直接使用。


#查看title字段信息

title


这里有一点要注意的是每个提取出来的字段最好都要检查下,并且查看下数据的条目。因为有时候提取的条目中包含有其他的信息,导致字段间条目数量不一致,这种情况下后面是无法拼接成数据表的。


#查看title字段数量

len(title)

607


按照提取平台名称title的方法,后面我们依次提取了贷款利率,贷款金额,满标时间等关键信息。下面是具体的代码。


#使用正则提取total字段信息

total=re.findall(r'"total">(.*?)万

#使用正则提取rate字段信息

rate=re.findall(r'"rate">(.*?)

#使用正则提取pnum字段信息

pnum=re.findall(r'"pnum">(.*?)人

#使用正则提取cycle字段信息

cycle=re.findall(r'"cycle">(.*?)月

#使用正则提取plnum字段信息

p1num=re.findall(r'"p1num">(.*?)人

#使用正则提取fuload字段信息

fuload=re.findall(r'"fuload">(.*?)分钟

#使用正则提取alltotal字段信息

alltotal=re.findall(r'"alltotal">(.*?)万

#使用正则提取captial字段信息

capital=re.findall(r'"capital">(.*?)万


由于后面我们要对数据进行累计追加及趋势分析,因此在这里导入time库生成当天的日期,并将日期作为一个字段一起放在数据表中。


#导入time库(获取日期)

import time

date=time.strftime('%Y-%m-%d',time.localtime(time.time()))


当天的日期信息将和数据一起生成数据表。


#日期

date

'2017-04-13'



创建贷款及理财数据表

将前面提取出来的数据和日期信息一起生成数据表,首先使用columns参数设置数据表中各字段的排列顺序。


#设置数据表各字段顺序

columns = ['采集日期','平台名称','成交额(万)','综合利率','投资人(人)','借款周期(月)','借款人(人)','满标速度(分钟)','累计贷款余额(万)','净资金流入(万)']


然后设置各字段的名称,并生成数据表。


#创建数据表

table=pd.DataFrame({'采集日期':date,

'平台名称':title,

'成交额(万)':total,

'综合利率':rate,

'投资人(人)':pnum,

'借款周期(月)':cycle,

'借款人(人)':p1num,

'满标速度(分钟)':fuload,

'累计贷款余额(万)':alltotal,

'净资金流入(万)':capital},

columns=columns)


查看生成的数据表,字段顺序与我们设置的一致,下一步把数据表导出为csv文件。便于后续的处理和分析。


#查看数据表

table



导出及追加数据

将生成的数据表导出为csv文件。这里有两种导出方式。第一是新建数据表。但比较麻烦,后续要需要手动将每天的数据进行拼接。因此还有第二种导出方式就是在一个数据表中不断追加新数据。


第一种方式将数据表导出为一个新的csv文件,文件名为wdty加上数据抓取的具体日期,也就是date中的值。


#导出csv文件

table.to_csv('C:\\Users\\ Desktop\\wdty'+date+'.csv',index=False)


第二种方式是在一个csv文件中持续追加导出新的数据表。这里我们建立一个wdty的csv文件,每天抓取的数据都会追加到这个csv文件中。代码与之前的新建csv文件类似,唯一的区别是增加了mode参数,这个参数默认值是w,也就是新建。把值改为a就是追加导出。


#在历史csv文件中追加新信息

table.to_csv('wdty.csv',index=False,mode='a')


以下是导出后的数据表截图。内容与前面创建的数据表内容一致。



创建自定义函数

从导入所需的库文件,到提取数据拼接和导出,我们一共进行了30+步的操作。为了简化步骤,我们把这些步骤放在一个loan_data自定义函数中。以后每次只需要执行以下这个自定义函数就可以将数据抓取下来并导出到csv里了。下面是具体的代码,其中为了获得代码执行中的过程信息,我们在一些关键步骤后使用print输出了一些状态信息。并计算了整个代码执行所耗费的时间。


def loan_data():

import os

import requests

import re

import pandas as pd

import time

start = time.clock()

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':'https://www.bluewhale.cc/'

}

r=requests.get('http://www.p2peye.com/shuju/ptsj/',headers=headers)

status=r.status_code

if status == 200:

print('页面抓取状态正常。')

else:

os._exit(0)

html=r.content

html=str(html, encoding = "GBK")

print('编码转换完成!')

title=re.findall(r'"return false".*?title="(.*?)"',html)

total=re.findall(r'"total">(.*?)万

rate=re.findall(r'"rate">(.*?)







请到「今天看啥」查看全文