从页面读取数据每次都需要定位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) + 1elif i == 2:dapan.ban2 += 1elif i == 3:dapan.ban3 +=1elif i == 4:dapan.ban4 += 1elif i == 5:dapan.ban5 += 1elif i == 6:dapan.ban6 += 1elif i == 7:dapan.ban7 += 1elif i == 8:dapan.ban8 += 1elif i == 9:dapan.ban9 += 1elif i == 10:dapan.ban10 += 1else: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)+"的数据")returnd = 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 Trueexcept Exception as e:print ("出错了,\t", str(e))return False
#################################################if __name__ == "__main__":get_today_data()

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

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

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

  1. 老鱼Python数据分析——篇十三:“选股宝”数据下载代码优化

    今天在测试下载本月(5月)数据时发现,只有6号.7号.9号和15号有数据,其他日期的数据都是完全相同的. 如何解决这个问题? 通过观察发现,没有数据或数据读取很慢时,页面上会出现这样的进度条: 所以修 ...

  2. 老鱼Python数据分析——篇十八:消息推送(一)

    需求分析 这两天想把分析处理之后的数据,做一个定时发送,按照自己设想和百度搜索,发现有以下几种办法.(只是我发现比较大众化的办法,不代表只有这几种方法) 发送邮件 QQ机器人 微信机器人 极光API ...

  3. 老鱼Python数据分析——篇十四:读取“选股宝”的热点板块信息并存为excel文件

    热点板块页面:https://xuangubao.cn/dingpan/redian 一.首先分析板块名对应的标签 二.根据板块名在excel文件中创建对应的sheet,excel的操作这儿就不细说了 ...

  4. 老鱼Python数据分析——篇十八:消息推送(二)

    任务三:使用微信机器人和极光API推送消息 一.微信机器人推送消息 使用微信机器人的本质其实就是使用Web端微信,所以有不少的限制,比如 近几个月申请的新微信号是不能登录的 (亲测证实),要注意. 在 ...

  5. 老鱼Python数据分析——篇十:使用selenium获取历史数据并保存

    具体实现步骤如下: 一.打开打开盯盘页面,分析日期控件. 二.点击该区域,出现年-月-日界面. 三.点击"1"号,判断日期是否已改变,改变后下载数据. 四.重复步骤一.二.三,一直 ...

  6. 老鱼Python数据分析——篇十二:使用selenium+BeautifulSoup获取淘股吧数据

    在淘股吧发现有位大牛每天都有数据整理,地址:湖南人的博客 所以直接下载他的博客文章即可. 分析发现,他复盘的数据都是使用的图片,所以只需要把博客文章里面的图片下载到本地. 第一步:分析首页数据: 通过 ...

  7. 老鱼Python数据分析——篇九:项目重构(代码)

    修改后的结构如下图所示: common目录下是通用文件,test目录下是功能文件,test目录下的agudata用于保存A股每月的数据 一.xgb_data.py,用于保存xgb网站需要的个人信息,如 ...

  8. 老鱼Python数据分析——篇五:将python程序打包成exe

    前一篇的多线程程序写好后,就可以挂在后台执行了,但在编写后面代码时,总是容易中断 所以我们可以把当前处理代理IP的程序打包生成exe文件后运行,这就,就不会影响后面的编码了. 我们可以直接通过pych ...

  9. 老鱼Python数据分析——篇二:系统设计(找代理IP)

    开发环境:win7 x64版本,python 3.6,Anaconda3 (64-bit) 因为频繁访问容易被封IP,所以我们需要使用代理来进行数据的爬取(当然你也可以放慢节奏,比如每5秒爬一条记录) ...

最新文章

  1. linux常用的命令行
  2. python游戏脚本实例-使用Python写一个贪吃蛇游戏实例代码
  3. 批处理检查电脑是否中了冰河木马
  4. 关于英汉混合字符串的分隔方法
  5. 删除按钮_汪涵拜师学艺第七篇:往来单位查询删除按钮和新增判断的设计!
  6. 部门直推!百度大搜索招聘NLP、搜索方向算法工程师!
  7. stone 的 log4j配置详解
  8. 交互系统的构建之(二)Linux下鼠标和键盘的模拟控制
  9. R40gpio输出无高低电平变化【原创】
  10. python读取excel_Python简单读取Excel示例
  11. 掌门教育微服务体系 Solar(中)
  12. java复制数组函数_java 数组复制:System.arrayCopy 深入解析
  13. git输入 ssh-keygen -t rsa 后只显示Generating public/private rsa key pair. 然后就直接跳出了
  14. Cisco.Packet.Tracer思科模拟器浮动路由讲解(含实例步骤)
  15. 给class类加css样式,addClass()
  16. android中的简单animation(三)accelerate(加速),decelerate(减速),anticipate,overshoot,bounce...
  17. 搜索引擎Google的小秘密
  18. 服务器租用前如何测试网络速度?
  19. 从零到完成安卓项目实战【安卓端+后端】
  20. Others9_无线路由器说说2.4G和5G Wi-Fi的区别

热门文章

  1. 好好说话之64位格式化字符串漏洞
  2. 工作中那些让人印象深刻的BUG(3)
  3. bc伐木机器人_1+X | 工业机器人操作编程平台(HB-CZBC-C10)
  4. 高老师的架构设计_隽语集(DD_1951)
  5. 手机突然显示无服务器,手机一直无服务是什么原因
  6. 浦发银行c语言上机试题,浦发银行通信技术类招考笔试经验
  7. Google 微数据,快速指引。
  8. 多线程-RGB_LED闪烁灯
  9. $reday和window.onload()
  10. arm云服务器虚拟安卓,ARM搭建云手机