在進行股票量化分析的時候,尤爲是股票新手,指數型股票是一個簡單而且風險較小的選擇,在對指數分析的時候,一般須要某指數的市盈率,市淨值和股息率。咱們能夠經過對三個指數的歷史數據來量化分析,從而得到或者驗證投資策略。html
可是很差的是,我百度了很久也沒有找出得到歷史數據的途徑,wind資訊的客戶端能夠拿到數據,可是體驗版的無法下載,東方財富的chioce更有須要付費來得到帳號密碼,全部就尷尬了。python
在中證指數的官網上,能夠查到天天收盤後的數據狀況,可是僅僅能得到一天的數據,沒法得到以前的數據。web
因此我就想,能不能把天天的數據都獲取下載,並保存,這樣長期之後,就會獲得不少的歷史數據,能夠用來分析或者提供給須要的朋友。所以初步想法就是固定天天爬取數據,而後儲存下來。windows
首先來看看數據的獲取狀況。app
網站:http://www.csindex.com.cn/zh-CN/downloads/index-information網站
經過初步踩點看網址變化和查看網頁源代碼,能夠得出:
1.網址的連接,在點擊關鍵類別的數據過程當中,沒有發生變化。url
2.經過‘檢查’能夠看到數據,可是網頁源代碼中沒法看到數據。網頁採用了js加載。spa
對策:code
使用selenium訪問網站,將數據浮現出來,而後按照常規方法進行爬取便可。orm
# hanbb # come on!!! import re from selenium import webdriver from bs4 import BeautifulSoup import csv import re import pandas as pd from datetime import datetime today = datetime.now().date().strftime('%Y%m%d') def data_appear(url): # 還原js隱藏的信息 driver = webdriver.PhantomJS(executable_path="E:\\python\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe") driver.get(url) data = driver.page_source return data def soup(url): soup = BeautifulSoup(data_appear(url),"html.parser") tr = soup.find_all('tr') return tr def save(name,list,path): text = pd.DataFrame(columns=name,data=list) text.to_csv(path) if __name__ == '__main__': url = 'http://www.csindex.com.cn/zh-CN/downloads/index-information' # 指數表現 獲取 zsbx_list = [] # 構建一個大列表存取數據 for count in range(1,12): # 經過循環將數據都拿出來 info = re.findall(r'"(zsbx%s"|zsbx%s cRed"|zsbx%s cls")>(.+?)</td>'%(count,count,count),str(soup(url))) # 正則提取 list = [] for i in info: list.append(i[1]) zsbx_list.append(list) # 存儲準備 name = ['指數簡稱','收盤','日漲跌','日漲跌幅(%)','今年以來漲跌','今年以來漲跌幅(%)','成交額較昨日增減(億元)','成交額較昨日增減(%)'] path_zsbx="E:\\indexdate\\{}zsbx.csv".format(today) save(name=name,list=zsbx_list,path=path_zsbx) print('數據存入成功') # 指數估值 list_zsgz = [] for count_zsgz in range(1,12): info_zsgz = re.findall(r'"zsgz%s">(.+?)</td>'%count_zsgz,str(soup(url))) list_zsgz.append(info_zsgz) #print(info_zsgz) #print(list_zsgz) name_zsgz = ['指數簡稱','靜態市盈率','滾動市盈率','市淨率','股息率','去年末靜態市盈率','去年末滾動市盈率','去年末市淨率'] path_zsgz = "E:\\indexdate\\{}zsgz.csv".format(today) save(name_zsgz,list_zsgz,path_zsgz) print('指數估值的數據存入成功')