老鱼Python数据分析——篇十五:“选股宝”使用API下载JSON格式数据

从页面读取数据每次都需要定位HTML标签,那么有没有更简洁的办法呢?

当然有,那就是找到页面数据的来源,分析哪些数据是我们想要的,直接通过WebAPI来获得数据。

我使用的是360极速浏览器,按F12后,再点“NetWork”,就可以看到页面加载的相关数据来源。

通过不断的更改日期,对比发现,上面两张图中红框部分就是页面数据产生变化的来源。

逐个点击红框中的链接,观察右侧返回的数据,判断对应页面上的区域。

经过分析,需要的数据在对应以下地址:

大盘涨跌数据:https://flash-api.xuangubao.cn/api/market_indicator/line?fields=rise_count,fall_count

涨停和跌停数据:https://flash-api.xuangubao.cn/api/market_indicator/line?fields=limit_up_count,limit_down_count

炸板率数据:https://flash-api.xuangubao.cn/api/market_indicator/line?fields=limit_up_broken_count,limit_up_broken_ratio

涨停个股列表:https://flash-api.xuangubao.cn/api/pool/detail?pool_name=limit_up

 直接访问上面的地址,发现返回的数据是JSON格式,接下来就简单了,使用Python的JSON处理模块即可。

参考代码如下:

from selenium import webdriver
from _datetime import datetime
import common.xgb_data as xd
import common.sqlite_oper as so
import time,json

#################################################
dapan = []          # 大盘数据
lianbanlist = []    # 涨停数据列表

# ——————判断是否有当天数据——————
# 返回值为0表示没有date日期的数据
def isload(date):
    sql = "select * from dapan where downdate='"+str(date)+"'"
    result = so.select(sql)
    return len(result)

# ——————将数据保存到sqlite数据库——————
# 返回值为0表示没有date日期的数据
def save_to_sqlite():
    # 保存大盘数据
    sql = "insert into dapan values('{0}',{1},{2},{3},{4},'{5}',{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},{16});".format(
        dapan.downdate, dapan.up, dapan.down, dapan.limitUp, dapan.limitDown, dapan.bomb, dapan.ban1, dapan.ban2, dapan.ban3,
        dapan.ban4, dapan.ban5, dapan.ban6, dapan.ban7, dapan.ban8, dapan.ban9, dapan.ban10, dapan.ban10s)
    so.exec(sql)
    # 保存涨停股数据
    for zt in lianbanlist:
        sql = "insert into zhangting values('{0}','{1}','{2}','{3}','{4}',{5});".format(
            zt.downdate, zt.scode, zt.sname, zt.stype, zt.zttime, zt.slevel)
        so.exec(sql)
    print(dapan.downdate+"的数据保存完毕")

# ——————统计每种连板情况的个数——————
def calc_lianban_amount(i):
    if i == 1:
        dapan.ban1 = int(dapan.ban1) + 1
    elif i == 2:
        dapan.ban2 += 1
    elif i == 3:
        dapan.ban3 +=1
    elif i == 4:
        dapan.ban4 += 1
    elif i == 5:
        dapan.ban5 += 1
    elif i == 6:
        dapan.ban6 += 1
    elif i == 7:
        dapan.ban7 += 1
    elif i == 8:
        dapan.ban8 += 1
    elif i == 9:
        dapan.ban9 += 1
    elif i == 10:
        dapan.ban10 += 1
    else:
        dapan.ban10s += 1

# ————得到大盘数据————
# 获取当天数据不用加日期,历史数据必须加date=xxxx-xx-xx
def get_today_data(date=datetime.now().date()):
    try:
        if (isload(date)>0):
            print("已经下载过"+str(date)+"的数据")
            return

        # ——创建大盘数据对象——
        global dapan    # 说明该变量是全局变量
        dapan = xd.DaPan(str(date), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

        chrome_options = webdriver.chrome.options.Options()
        chrome_options.add_argument("--headless")
        browser = webdriver.Chrome(chrome_options=chrome_options)
        # browser = webdriver.Chrome()
        # ——大盘涨跌数量——
        url = "https://flash-api.xuangubao.cn/api/market_indicator/line?fields=rise_count,fall_count"
        if (date != datetime.now().date()):
            url += "&date=" + str(date)
        browser.get(url)
        page = str(browser.page_source)  # 得到大盘涨跌数据
        page = page[page.find("{"):-20]
        data = json.loads(page)["data"]
        if(len(data)<=0):
            print("没有"+str(date)+"的数据")
            return
        d = json.loads(page)["data"][-1]    # 得到最后一次数据(收盘数据)
        dapan.up = d["rise_count"]      # 下跌数量
        dapan.down = d["fall_count"]    # 上涨数量

        time.sleep(1)
        # ——大盘涨跌停数量——
        url = "https://flash-api.xuangubao.cn/api/market_indicator/line?fields=limit_up_count,limit_down_count"
        if (date != datetime.now().date()):
            url += "&date=" + str(date)
        browser.get(url)
        page = str(browser.page_source)  # 得到页面源码
        page = page[page.find("{"):-20]
        d = json.loads(page)["data"][-1]     # 得到最后一次数据(收盘数据)
        dapan.limitUp = d["limit_up_count"]
        dapan.limitDown = d["limit_down_count"]

        time.sleep(1)
        # ——炸板率——
        url = "https://flash-api.xuangubao.cn/api/market_indicator/line?fields=limit_up_broken_count,limit_up_broken_ratio"
        if (date != datetime.now().date()):
            url += "&date=" + str(date)
        browser.get(url)
        page = str(browser.page_source)  # 得到页面源码
        page = page[page.find("{"):-20]
        d = json.loads(page)["data"][-1]  # 得到最后一次数据(收盘数据)
        dapan.bomb = str(round(d["limit_up_broken_ratio"]*100))+"%"

        time.sleep(1)

        # ——涨停板个股——
        url = "https://flash-api.xuangubao.cn/api/pool/detail?pool_name=limit_up"
        if(date != datetime.now().date()):
            url += "&date=" + str(date)
        browser.get(url)
        page = str(browser.page_source)  # 得到页面源码
        page = page[page.find("{"):-20]
        ztlist = json.loads(page)["data"]
        for data in ztlist:
            if (data["stock_chi_name"].find("ST") < 0):
                slevel = data["limit_up_days"]
                # 创建涨停对象
                zt = xd.ZhangTing(data["stock_chi_name"], data["symbol"],
                                  (data["surge_reason"]["related_plates"][0]["plate_name"] if(data["surge_reason"]!=None) else "无"),
                                  str(datetime.fromtimestamp(data["last_limit_up"]).time()),
                                  slevel, str(date))
                lianbanlist.append(zt)
                calc_lianban_amount(slevel)   # 计算连板数量

        time.sleep(1)
        browser.quit()

        #保存数据
        save_to_sqlite()
        return True
    except Exception as e:
        print ("出错了,\t", str(e))
        return False
#################################################

if __name__ == "__main__":
    get_today_data()

最后读取到的数据如下图:

 

Python爬取选宝股数据到此结束。

老鱼socks5服务端是一个网络代理服务器软件,可以让用户通过该服务器连接互联网。它采用socks5协议,这是一种支持TCP和UDP传输的代理协议。 老鱼socks5服务端的工作原理如下:当用户请求访问某个网站或服务时,首先用户的浏览器或应用程序会将请求发送给老鱼socks5服务端。服务端会解析请求,并根据用户的配置将请求转发给目标服务器。目标服务器将响应数据返回到老鱼socks5服务端,再由服务端转发给用户。这样用户和目标服务器之间的通信就通过了中间的代理服务器。 老鱼socks5服务端的优点在于它可以实现细粒度的权限控制和灵活的配置。管理员可以根据需求设置不同用户的访问权限,比如限制某些网站的访问或限制某些端口的访问。此外,老鱼socks5服务端支持本地DNS解析,可以避免因网络问题导致无法正常访问某些网站的情况。 老鱼socks5服务端还提供了一些安全性的功能。它支持用户认证,只有经过认证的用户才能连接到服务端。此外,它还支持加密传输,可以通过配置使用TLS/SSL等加密协议来保护数据的安全性。 综上所述,老鱼socks5服务端是一款功能强大、安全可靠的网络代理服务器软件,可以提供方便的访问互联网和灵活的权限控制。无论是个人用户还是企业用户,都可以选择老鱼socks5服务端来搭建自己的代理服务器,以满足不同的需求。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值