• 主板指数数据的爬取(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('指数估值的数据存入成功')
  • 相关阅读:
    CSDN博客QQ加群、微信
    Angularjs 中的 controller
    hdu 1728 逃离迷宫 bfs记转向
    【BLE】CC2541之加入自己定义任务
    asp.net给文件分配自己主动编号,如【20140710-1】
    <html>
    机器学习入门阶段程序猿易犯的5个错误
    时间复杂度
    Jackcard类似度和余弦类似度(向量空间模型)的java实现
    【分层图】分层图学习笔记
  • 原文地址:https://www.cnblogs.com/hanbb/p/8029515.html
Copyright © 2020-2023  润新知