99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀使用python和tableau對數(shù)據(jù)進(jìn)行抓取及可視化
使用python和tableau對數(shù)據(jù)進(jìn)行抓取及可視化
2017-10-15
收藏

使用pythontableau對數(shù)據(jù)進(jìn)行抓取及可視化

本篇文章介紹使用python抓取貸款及理財平臺的數(shù)據(jù),并將數(shù)據(jù)拼接和匯總。最終通過tableau進(jìn)行可視化。與之前的python爬蟲文章 不同之處在于之前是一次性抓取生產(chǎn)數(shù)據(jù)表,本次的數(shù)據(jù)需要每天重復(fù)抓取及存儲,并匯總在一起進(jìn)行分析和可視化。


開始前的準(zhǔn)備工作
開始之前先導(dǎo)入所需使用的庫文件,各個庫文件在整個抓取和拼表過程中負(fù)責(zé)不同的部分。Requests負(fù)責(zé)頁面抓取,re負(fù)責(zé)從抓取下
來的頁面中提取有用的信息,pandas負(fù)責(zé)拼接并生成數(shù)據(jù)表以及最終的數(shù)據(jù)表導(dǎo)出。

</pre>
#導(dǎo)入requests庫(請求和頁面抓取)
import requests
#導(dǎo)入正則庫(從頁面代碼中提取信息)
import re
#導(dǎo)入科學(xué)計算庫(拼表及各種分析匯總)
import pandas as pd
<pre>

設(shè)置一個頭文件信息,方便后面的抓取。這個頭文件有兩個作用,第一防止抓取時被封,第二方便后面對頁面源文件的轉(zhuǎn)碼。

</pre>
#設(shè)置請求中頭文件的信息
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/'
}
<pre>

抓取貸款及理財信息

準(zhǔn)備工作完成后開始對貸款和理財信息進(jìn)行抓取,這里我們偷個懶,直接抓取p2peye.com的信息。p2peye.com是一個網(wǎng)貸咨詢及數(shù)據(jù)
平臺,內(nèi)容很豐富。他們定期更新各平臺的貸款及理財數(shù)據(jù)。

因為所有的網(wǎng)貸平臺信息都在一頁上,所以抓取起來比較簡單,不需要翻頁。下面是抓取并保存頁面信息的代碼。

</pre>
#抓取并保存頁面信息
r=requests.get('http://www.p2peye.com/shuju/ptsj/',headers=headers)
html=r.content
<pre>

抓取下來的信息需要進(jìn)行轉(zhuǎn)碼才能變成有用的信息,下面對頁面源代碼進(jìn)行GBK轉(zhuǎn)碼。

</pre>
#對抓取的頁面進(jìn)行編碼
html=str(html, encoding = "GBK")
<pre>

查看一下轉(zhuǎn)碼后的頁面,我們需要的信息都包含在里面了。后面只需要使用正則表達(dá)式逐個提取出來就可以了。

</pre>
#查看抓取的頁面源碼
html
<pre>

使用pythontableau對數(shù)據(jù)進(jìn)行抓取及可視化-數(shù)據(jù)分析網(wǎng)
提取信息并進(jìn)行數(shù)據(jù)清洗

使用正則表達(dá)式對應(yīng)著頁面中的字段逐個將關(guān)鍵數(shù)據(jù)從頁面源碼中提取出來,下面是具體的過程,首先提取的是平臺名稱字段。在頁
面源碼中平臺名稱在title中。

</pre>
#使用正則提取title字段信息
title=re.findall(r'"return false".*?title="(.*?)"',html)
<pre>

提取后查看下結(jié)果,內(nèi)容很干凈,不需要進(jìn)行清洗可以直接使用。

</pre>
#查看title字段信息
title
<pre>

使用pythontableau對數(shù)據(jù)進(jìn)行抓取及可視化-數(shù)據(jù)分析網(wǎng)
這里有一點要注意的是每個提取出來的字段最好都要檢查下,并且查看下數(shù)據(jù)的條目。因為有時候提取的條目中包含有其他的信息,
導(dǎo)致字段間條目數(shù)量不一致,這種情況下后面是無法拼接成數(shù)據(jù)表的。

</pre>
#查看title字段數(shù)量
len(title)
607
<pre>

按照提取平臺名稱title的方法,后面我們依次提取了貸款利率,貸款金額,滿標(biāo)時間等關(guān)鍵信息。下面是具體的代碼。

</pre>
#使用正則提取total字段信息
total=re.findall(r'"total">(.*?)萬<',html)

#使用正則提取rate字段信息
rate=re.findall(r'"rate">(.*?)<',html)

#使用正則提取pnum字段信息
pnum=re.findall(r'"pnum">(.*?)人<',html)

#使用正則提取cycle字段信息
cycle=re.findall(r'"cycle">(.*?)月<',html)

#使用正則提取plnum字段信息
p1num=re.findall(r'"p1num">(.*?)人<',html)

#使用正則提取fuload字段信息
fuload=re.findall(r'"fuload">(.*?)分鐘<',html)

#使用正則提取alltotal字段信息
alltotal=re.findall(r'"alltotal">(.*?)萬<',html)

#使用正則提取captial字段信息
capital=re.findall(r'"capital">(.*?)萬<',html)
<pre>

由于后面我們要對數(shù)據(jù)進(jìn)行累計追加及趨勢分析,因此在這里導(dǎo)入time庫生成當(dāng)天的日期,并將日期作為一個字段一起放在數(shù)據(jù)表。

</pre>
#導(dǎo)入time庫(獲取日期)
import time
date=time.strftime('%Y-%m-%d',time.localtime(time.time()))
<pre>

當(dāng)天的日期信息將和數(shù)據(jù)一起生成數(shù)據(jù)表。

</pre>
#日期
date
'2017-04-13'
<pre>

創(chuàng)建貸款及理財數(shù)據(jù)表

將前面提取出來的數(shù)據(jù)和日期信息一起生成數(shù)據(jù)表,首先使用columns參數(shù)設(shè)置數(shù)據(jù)表中各字段的排列順序。

</pre>
#設(shè)置數(shù)據(jù)表各字段順序
columns = ['采集日期','平臺名稱','成交額(萬)','綜合利率','投資人(人)','借款周期(月)','借款人(人)','滿標(biāo)速度(分鐘)','
累計貸款余額(萬)','凈資金流入(萬)']
<pre>

然后設(shè)置各字段的名稱,并生成數(shù)據(jù)表。

</pre>
#創(chuàng)建數(shù)據(jù)表
table=pd.DataFrame({'采集日期':date,
'平臺名稱':title,
'成交額(萬)':total,
'綜合利率':rate,
'投資人(人)':pnum,
'借款周期(月)':cycle,
'借款人(人)':p1num,
'滿標(biāo)速度(分鐘)':fuload,
'累計貸款余額(萬)':alltotal,
'凈資金流入(萬)':capital},
columns=columns)
<pre>

查看生成的數(shù)據(jù)表,字段順序與我們設(shè)置的一致,下一步把數(shù)據(jù)表導(dǎo)出為csv文件。便于后續(xù)的處理和分析。

</pre>
#查看數(shù)據(jù)表

table
<pre>

使用pythontableau對數(shù)據(jù)進(jìn)行抓取及可視化-數(shù)據(jù)分析網(wǎng)
導(dǎo)出及追加數(shù)據(jù)

將生成的數(shù)據(jù)表導(dǎo)出為csv文件。這里有兩種導(dǎo)出方式。第一是新建數(shù)據(jù)表。但比較麻煩,后續(xù)要需要手動將每天的數(shù)據(jù)進(jìn)行拼接。因
此還有第二種導(dǎo)出方式就是在一個數(shù)據(jù)表中不斷追加新數(shù)據(jù)。

第一種方式將數(shù)據(jù)表導(dǎo)出為一個新的csv文件,文件名為wdty加上數(shù)據(jù)抓取的具體日期,也就是date中的值。

</pre>
#導(dǎo)出csv文件
table.to_csv('C:\\Users\\ Desktop\\wdty'+date+'.csv',index=False)
<pre>

第二種方式是在一個csv文件中持續(xù)追加導(dǎo)出新的數(shù)據(jù)表。這里我們建立一個wdty的csv文件,每天抓取的數(shù)據(jù)都會追加到這個csv文件
中。代碼與之前的新建csv文件類似,唯一的區(qū)別是增加了mode參數(shù),這個參數(shù)默認(rèn)值是w,也就是新建。把值改為a就是追加導(dǎo)出。

</pre>
#在歷史csv文件中追加新信息
table.to_csv('wdty.csv',index=False,mode='a')
<pre>

以下是導(dǎo)出后的數(shù)據(jù)表截圖。內(nèi)容與前面創(chuàng)建的數(shù)據(jù)表內(nèi)容一致。
使用pythontableau對數(shù)據(jù)進(jìn)行抓取及可視化-數(shù)據(jù)分析網(wǎng)
創(chuàng)建自定義函數(shù)

從導(dǎo)入所需的庫文件,到提取數(shù)據(jù)拼接和導(dǎo)出,我們一共進(jìn)行了30+步的操作。為了簡化步驟,我們把這些步驟放在一個loan_data自
定義函數(shù)中。以后每次只需要執(zhí)行以下這個自定義函數(shù)就可以將數(shù)據(jù)抓取下來并導(dǎo)出到csv里了。下面是具體的代碼,其中為了獲得代
碼執(zhí)行中的過程信息,我們在一些關(guān)鍵步驟后使用print輸出了一些狀態(tài)信息。并計算了整個代碼執(zhí)行所耗費(fèi)的時間。

</pre>
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('頁面抓取狀態(tài)正常。')
else:
os._exit(0)
html=r.content
html=str(html, encoding = "GBK")
print('編碼轉(zhuǎn)換完成!')
title=re.findall(r'"return false".*?title="(.*?)"',html)
total=re.findall(r'"total">(.*?)萬<',html)
rate=re.findall(r'"rate">(.*?)<',html)
pnum=re.findall(r'"pnum">(.*?)人<',html)
cycle=re.findall(r'"cycle">(.*?)月<',html)
p1num=re.findall(r'"p1num">(.*?)人<',html)
fuload=re.findall(r'"fuload">(.*?)分鐘<',html)
alltotal=re.findall(r'"alltotal">(.*?)萬<',html)
capital=re.findall(r'"capital">(.*?)萬<',html)
date=time.strftime('%Y-%m-%d',time.localtime(time.time()))
print('數(shù)據(jù)提取完成!')
columns = ['采集日期','平臺名稱','成交額(萬)','綜合利率','投資人(人)','借款周期(月)','借款人(人)','滿標(biāo)速度(分
鐘)','累計貸款余額(萬)','凈資金流入(萬)']
table=pd.DataFrame({'采集日期':date,
'平臺名稱':title,
'成交額(萬)':total,
'綜合利率':rate,
'投資人(人)':pnum,
'借款周期(月)':cycle,
'借款人(人)':p1num,
'滿標(biāo)速度(分鐘)':fuload,
'累計貸款余額(萬)':alltotal,
'凈資金流入(萬)':capital},
columns=columns)
print('數(shù)據(jù)表創(chuàng)建完成!')
table.to_csv('C:\\Users\\cliffwang\\Desktop\\wdty'+date+'.csv',index=False)
print(date+'日數(shù)據(jù)導(dǎo)出完畢!')
table.to_csv('wdty.csv',index=False,mode='a')
print('累計數(shù)據(jù)追加導(dǎo)出完畢!')
end = time.clock()
print ("執(zhí)行時間: %f s" % (end-start))
<pre>

自定義函數(shù)寫好后,每次只需要執(zhí)行l(wèi)oan_data()就可以完成之前的30+步驟的工作了。下面是代碼和輸出的狀態(tài)信息以及代碼執(zhí)行時
間信息。

</pre>
loan_data()

頁面抓取狀態(tài)正常。
編碼轉(zhuǎn)換完成!
數(shù)據(jù)提取完成!
數(shù)據(jù)表創(chuàng)建完成!
2017-04-19日數(shù)據(jù)導(dǎo)出完畢!
累計數(shù)據(jù)追加導(dǎo)出完畢!
執(zhí)行時間: 0.933262 s
<pre>

使用tableau進(jìn)行可視化

導(dǎo)出的數(shù)據(jù)雖然為csv格式,但使用excel進(jìn)行可視化并不理想,主要問題在于excel對圖表行列數(shù)的限制(每張圖最多只能容納255個數(shù)
量列)。因此,我們將數(shù)據(jù)表導(dǎo)入到tableau中進(jìn)行可視化。下面是對600+家網(wǎng)貸平臺數(shù)據(jù)的可視化截圖。尺寸為各平臺總成交額,顏色為綜合利率。


數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }