主板指数数据的爬取(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('指数估值的数据存入成功')

 

posted @ 2017-12-12 20:05  hbb360  阅读(982)  评论(0编辑  收藏  举报