用Python爬取歷年基金數(shù)據(jù)

寫在前面

忙于學(xué)習(xí),我已經(jīng)好久沒有寫過博客了漓概。最近漾月,由于越來越意識到了理財(cái)?shù)闹匾圆∩遥谑俏疫x擇了從最容易入門且風(fēng)險(xiǎn)較低的基金入手,看的同時(shí)也能夠?qū)W習(xí)到一些金融知識梁肿。不過蜓陌,不買就沒有看的欲望,所以我也還是選擇了幾支基金入手了吩蔑,當(dāng)然钮热,最終還是以學(xué)習(xí)為主,收益只能作為一個(gè)檢驗(yàn)學(xué)習(xí)效果的手段烛芬,而不是我當(dāng)前的目的(是未來的目的hhh)隧期。
要想分析基金,少不了歷年的數(shù)據(jù)赘娄,為了分析方便仆潮,我還是覺得先把所有的數(shù)據(jù)爬下來,然后再做進(jìn)一步處理遣臼。

接口分析

爬數(shù)據(jù)需要先思考從哪里爬性置?經(jīng)過一番搜索和考慮,我發(fā)現(xiàn)天天基金網(wǎng)的數(shù)據(jù)既比較全揍堰,又十分容易爬取鹏浅,所以就從它入手了嗅义。

首先,隨便點(diǎn)開一支基金隐砸,我們可以看到域名就是該基金的代碼之碗,十分方便,其次下面有生成的凈值圖凰萨。


基金詳情

打開chrome的開發(fā)者調(diào)試继控,選擇Network,然后刷新一下胖眷,很快我們就能發(fā)現(xiàn)我們想要的東西了武通。可以看到珊搀,這是基金代碼加當(dāng)前時(shí)間的一個(gè)接口冶忱,請求的url是http://fund.eastmoney.com/pingzhongdata/003511.js?v=20190304115823
也就是說我們可以簡單的通過http://fund.eastmoney.com/pingzhongdata/基金代碼.js?v=當(dāng)前時(shí)間這樣一個(gè)接口就能獲取到相應(yīng)的數(shù)據(jù)了。

打開開發(fā)者模式

現(xiàn)在我們來看看這個(gè)文件的具體內(nèi)容是什么境析?
顯然囚枪,這里面的東西就是我們想要的,Data_netWorthTrend里面的"y"就包含了每一天的凈值

獲取數(shù)據(jù)

現(xiàn)在我們的接口已經(jīng)十分明確了劳淆,就是http://fund.eastmoney.com/pingzhongdata/基金代碼.js?v=當(dāng)前時(shí)間

通過基金代碼當(dāng)前時(shí)間我們就能夠獲取到相應(yīng)的數(shù)據(jù)链沼,接下來就是需要將我們想要的數(shù)據(jù)從獲取的文件中提取出來了,也就是我們說的數(shù)據(jù)清洗的過程沛鸵。
這個(gè)網(wǎng)站提供的數(shù)據(jù)不是常見的json格式括勺,因此提取會(huì)有點(diǎn)麻煩,比如通過字符串查找等曲掰,但是由于這個(gè)是js文件疾捍,因此,我找到了更合適的方法——利用了PyExecJs模塊就能很方便地編譯解析js代碼啦栏妖。

現(xiàn)在直接上代碼乱豆。
首先終端里,pip install PyExecJs安裝上該模塊吊趾。然后引入這些模塊

import requests
import time
import execjs

接口構(gòu)造

構(gòu)造一個(gè)url

def getUrl(fscode):
  head = 'http://fund.eastmoney.com/pingzhongdata/'
  tail = '.js?v='+ time.strftime("%Y%m%d%H%M%S",time.localtime())
  
  return head+fscode+tail

獲取凈值

def getWorth(fscode):
    #用requests獲取到對應(yīng)的文件
    content = requests.get(getUrl(fscode))
    
   #使用execjs獲取到相應(yīng)的數(shù)據(jù)
    jsContent = execjs.compile(content.text)
    name = jsContent.eval('fS_name')
    code = jsContent.eval('fS_code')
    #單位凈值走勢
    netWorthTrend = jsContent.eval('Data_netWorthTrend')
    #累計(jì)凈值走勢
    ACWorthTrend = jsContent.eval('Data_ACWorthTrend')

    netWorth = []
    ACWorth = []

   #提取出里面的凈值
    for dayWorth in netWorthTrend[::-1]:
        netWorth.append(dayWorth['y'])

    for dayACWorth in ACWorthTrend[::-1]:
        ACWorth.append(dayACWorth[1])
    print(name,code)
    return netWorth, ACWorth

查看數(shù)據(jù)

這樣我們就可以通過基金代碼來查到對應(yīng)的數(shù)據(jù)啦

netWorth, ACWorth = getWorth('003511')
print(netWorth)

可以看到宛裕,最近一天的凈值是1.0831,從網(wǎng)站上我們也可以驗(yàn)證一下這個(gè)數(shù)據(jù)是否正確


當(dāng)然论泛,我們也可以自己畫一個(gè)走勢圖來驗(yàn)證一下

import matplotlib.pyplot as plt
plt.figure(figsize=(10,5))
plt.plot(netWorth[:60][::-1])
plt.show()

可以看到揩尸,和天天基金網(wǎng)畫的是一樣的。
不過這個(gè)方法獲取的數(shù)據(jù)有個(gè)小問題孵奶,就是無法獲得對應(yīng)的確切日期疲酌。我們?nèi)绻治鲎罱鼛讉€(gè)周、幾個(gè)月的數(shù)據(jù),其實(shí)也可以不需要了解具體某一天的數(shù)據(jù)朗恳,取最近20天湿颅、40天等方式即可棵里。當(dāng)然症概,也可以從當(dāng)天開始逆推回去,給每個(gè)凈值標(biāo)上日期邢锯,不過這個(gè)需要忽略節(jié)假日怀浆,處理起來比較麻煩且必要性不大谊囚,我就沒有做這個(gè)處理。

獲取所有基金數(shù)據(jù)

這里我通過同樣的方式执赡,找到了所有基金列表的接口镰踏。
通過'http://fund.eastmoney.com/js/fundcode_search.js'便可以直接獲取到所有的基金代碼,再通過基金代碼可以遍歷爬取所有基金的數(shù)據(jù)沙合,具體就不再演示了奠伪,下面提供一個(gè)可用的代碼供參考。
我將下載的數(shù)據(jù)存成了csv首懈,方便excel打開或用代碼讀取绊率。當(dāng)然,總共有近8000支基金究履,爬取需要大量的時(shí)間滤否,因此我將它放在了服務(wù)器后臺爬取,如果你想提高效率最仑,可以改寫成多進(jìn)程同步爬取藐俺,時(shí)間將會(huì)大大縮短。

import requests
import time
import execjs

def getUrl(fscode):
  head = 'http://fund.eastmoney.com/pingzhongdata/'
  tail = '.js?v='+ time.strftime("%Y%m%d%H%M%S",time.localtime())
  
  return head+fscode+tail

# 根據(jù)基金代碼獲取凈值
def getWorth(fscode):
    content = requests.get(getUrl(fscode))
    jsContent = execjs.compile(content.text)
    
    name = jsContent.eval('fS_name')
    code = jsContent.eval('fS_code')
    #單位凈值走勢
    netWorthTrend = jsContent.eval('Data_netWorthTrend')
    #累計(jì)凈值走勢
    ACWorthTrend = jsContent.eval('Data_ACWorthTrend')

    netWorth = []
    ACWorth = []

    for dayWorth in netWorthTrend[::-1]:
        netWorth.append(dayWorth['y'])

    for dayACWorth in ACWorthTrend[::-1]:
        ACWorth.append(dayACWorth[1])
    print(name,code)
    return netWorth, ACWorth
  
def getAllCode():
    url = 'http://fund.eastmoney.com/js/fundcode_search.js'
    content = requests.get(url)
    jsContent = execjs.compile(content.text)
    rawData = jsContent.eval('r')
    allCode = []
    for code in rawData:
        allCode.append(code[0])
    return allCode

allCode = getAllCode()



netWorthFile = open('./netWorth.csv','w')
ACWorthFile = open('./ACWorth.csv','w')

for code in allCode:
  try:
    netWorth, ACWorth = getWorth(code)
  except:
    continue
  if len(netWorth)<=0 or len(ACWorth)<0:
    print(code+"'s' data is empty.")
    continue
  netWorthFile.write("\'"+code+"\',")  
  netWorthFile.write(",".join(list(map(str, netWorth))))
  netWorthFile.write("\n")
  
  ACWorthFile.write("\'"+code+"\',")  
  ACWorthFile.write(",".join(list(map(str, ACWorth))))
  ACWorthFile.write("\n")
  print("write "+code+"'s data success.")
  
netWorthFile.close()
ACWorthFile.close()

這是我用服務(wù)器爬取的數(shù)據(jù)盯仪,可以看到紊搪,總共大概35M+35M蜜葱。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末全景,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子牵囤,更是在濱河造成了極大的恐慌爸黄,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揭鳞,死亡現(xiàn)場離奇詭異炕贵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)野崇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門称开,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事鳖轰∏逅郑” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵蕴侣,是天一觀的道長焰轻。 經(jīng)常有香客問我,道長昆雀,這世上最難降的妖魔是什么辱志? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮狞膘,結(jié)果婚禮上揩懒,老公的妹妹穿的比我還像新娘。我一直安慰自己挽封,他們只是感情好旭从,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著场仲,像睡著了一般和悦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渠缕,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天鸽素,我揣著相機(jī)與錄音,去河邊找鬼亦鳞。 笑死馍忽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的燕差。 我是一名探鬼主播遭笋,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼徒探!你這毒婦竟也來了瓦呼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤测暗,失蹤者是張志新(化名)和其女友劉穎央串,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碗啄,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡质和,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了稚字。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饲宿。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厦酬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瘫想,到底是詐尸還是另有隱情弃锐,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布殿托,位于F島的核電站霹菊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏支竹。R本人自食惡果不足惜旋廷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望礼搁。 院中可真熱鬧饶碘,春花似錦、人聲如沸馒吴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饮戳。三九已至豪治,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扯罐,已是汗流浹背负拟。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歹河,地道東北人掩浙。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像秸歧,于是被迫代替她去往敵國和親厨姚。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容