主板指数数据的爬取(selenium处理JS)
在进行股票量化分析的时候,尤其是股票新手,指数型股票是一个简单并且风险较小的选择,在对指数分析的时候,通常需要某指数的市盈率,市净值和股息率。我们可以通过对三个指数的历史数据来量化分析,从而获得或者验证投资策略。
但是不好的是,我百度了好久也没有找出获得历史数据的途径,wind资讯的客户端可以拿到数据,但是体验版的没法下载,东方财富的chioce更有需要付费来获得账号密码,所有就尴尬了。
在中证指数的官网上,可以查到每天收盘后的数据情况,但是仅仅能获得一天的数据,无法获得之前的数据。
所以我就想,能不能把每天的数据都获取下载,并保存,这样长期以后,就会得到很多的历史数据,可以用来分析或者提供给需要的朋友。因此初步想法就是固定每天爬取数据,然后储存下来。
首先来看看数据的获取情况。
网站:http://www.csindex.com.cn/zh-CN/downloads/index-information
通过初步踩点看网址变化和查看网页源代码,可以得出:
1.网址的链接,在点击关键类别的数据过程中,没有发生变化。
2.通过‘检查’可以看到数据,但是网页源代码中无法看到数据。网页采用了js加载。
对策:
使用selenium访问网站,将数据浮现出来,然后按照常规方法进行爬取即可。
# 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('指数估值的数据存入成功')