Python爬取东方财富网任意股票任意时间段的Ajax动态加载股票数据

这篇具有很好参考价值的文章主要介绍了Python爬取东方财富网任意股票任意时间段的Ajax动态加载股票数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

导言

最近由于需求想爬取以下东方财富网的股票数据,但是发现没有想象那么简单,接下来我会讲述一下我遇到的问题以及是如何解决,最后成功的爬出了想要的数据。

查看网页源码

首先我们F12打开东方财富网网页源码,以指南针(300803)为例:
Python爬取东方财富网任意股票任意时间段的Ajax动态加载股票数据
我们先点击网络,再点击300803.html,再选择右边弹出来的预览响应,可以发现,源码中并没有我们想要的股票数据,但是再网页中又有我们想要的收盘价等数据,说明这很可能数据是Ajax动态加载出来的,一般而言数据会存储再一个json文件之中。

找出储存数据的json文件

我们很容易找到当前网页中该股票的当日收盘价,所以我们可以以此为关键词进行搜索,搜索步骤为:在页面右边的网页信息页面,ctrl+F,即可打开搜索框,结果如下图所示,发现有三个url文件包含该数值:
Python爬取东方财富网任意股票任意时间段的Ajax动态加载股票数据
点击进去可以发现里面都有大量的数据,这些数据也是网页所显示的数据来源,根据不同的数据需求,选择某一个url进行数据提取,接下来的数据提取以第二个URL为例,即K线图的原始数据

解析URL地址

该URL地址为:

https://push2his.eastmoney.com/api/qt/stock/kline/get?cb=jQuery1123008330414708828249_1669967900108&fields1=f1%2Cf2%2Cf3%2Cf4%2Cf5%2Cf6&fields2=f51%2Cf52%2Cf53%2Cf54%2Cf55%2Cf56%2Cf57%2Cf58%2Cf59%2Cf60%2Cf61&ut=b2884a393a59ad64002292a3e90d46a5&klt=101&fqt=1&secid=0.300803&beg=20201202&end=20500000&_=1669967900117

可以发现里面有许多查询参数,我们需要一个一个进行分析。
Python爬取东方财富网任意股票任意时间段的Ajax动态加载股票数据

cb

该参数值为:

jQuery1123008330414708828249_1669967900108

通过查看其他股票代码的网页可以发现,前缀jQuery是不变的,后面的一串数字有变化。点击上一张图负载旁边的发起程序,可以发现发送操作异步加载操作的来源是

jquery.min.js

Python爬取东方财富网任意股票任意时间段的Ajax动态加载股票数据
因此,打开该js文件,ctr+F搜索jQuery可以发现cb参数的来源,如下图所示。结果表明该参数值是通过JS代码赋值的。往前搜索m可以发现m为一个固定的字符串值1.12.3,这应该是版本号;后面再添加一个0到1随机数组合为一个字符串;最后的replace操作则是对该字符串所有非数字字符替换为空。因此下划线前面的数字已经被解读出来了。
Python爬取东方财富网任意股票任意时间段的Ajax动态加载股票数据
通过上图可以发现,该参数首先被赋值给变量expando,通过搜索我们很快的可以找到下划线后面的数字来源,如下图所示:
Python爬取东方财富网任意股票任意时间段的Ajax动态加载股票数据
因此,这个变量Eb是关键。同理我们搜索变量Eb,可以发现该变量是一个时间戳,考虑其位数,可以联想到对当前书简戳乘以1000再取整,经过检验是正确的。
Python爬取东方财富网任意股票任意时间段的Ajax动态加载股票数据
因而我们解读出了该参数的构成,python代码实现如下:

jq = re.sub('\D','','1.12.3'+str(random.random()))
tm = int(time.time()*1000)
'jQuery{}_{}'.format(jq,tm)

fields1,fields2,ut,klt1,fqt

经过对多个不同股票数据查询的参数对比,容易发现,这些参数都是一个固定值,只需要赋值即可

secid

显而易见,该参数值小数点后是股票代码。经过对上交所,深交所,北交所的股票数据查询发现,若为上交所股票,小数点前为1,否则为0,所以python代码构建该参数如下:

 c = 1 if code[0]=='6' else 0
 {}.{}'.format(c,code)

beg,end,_

很显然,这两个参数就是股票数据查询的起始日期和终止日期;可以发现,下划线参数与前面的cb参数的时间戳是一致的。

完整代码

最后,完整爬取代码如下,该代码只是简单的进行了函数包装,有精力的小伙伴可以将其包装为一个类,本人水平有限,代码仅供参考:文章来源地址https://www.toymoban.com/news/detail-461435.html

#爬虫程序
import requests
from lxml import etree
#from fake_useragent import UserAgent
import random
import time
import urllib
import json
#ua = UserAgent()

def Spider_stock(code_list,begin,end='20500000'):
    url = 'https://push2his.eastmoney.com/api/qt/stock/kline/get?'
    header ={'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.62",
                'Cookie':'qgqp_b_id=e66305de7e730aa89f1c877cc0849ad1; qRecords=%5B%7B%22name%22%3A%22%u6D77%u9E25%u4F4F%u5DE5%22%2C%22code%22%3A%22SZ002084%22%7D%5D; st_pvi=80622161013438; st_sp=2022-09-29%2022%3A47%3A13; st_inirUrl=https%3A%2F%2Fcn.bing.com%2F; HAList=ty-1-000300-%u6CAA%u6DF1300%2Cty-0-002108-%u6CA7%u5DDE%u660E%u73E0%2Cty-1-600455-%u535A%u901A%u80A1%u4EFD%2Cty-0-002246-%u5317%u5316%u80A1%u4EFD',
                'Referer':'https://data.eastmoney.com/',
                'Host':'push2his.eastmoney.com'}
    stock_df = pd.DataFrame(columns=['股票代码','股票名称',"时间",'开盘价','收盘价','最高价','最低价',"涨跌幅",'涨跌额',
                                        "成交量","成交额","振幅","换手率"])
    for code in code_list:
        #构建url参数
        jq = re.sub('\D','','1.12.3'+str(random.random()))
        tm = int(time.time()*1000)
        c = 1 if code[0]=='6' else 0
        params={'cb':'jQuery{}_{}'.format(jq,tm),
                'fields1':urllib.request.unquote('f1%2Cf2%2Cf3%2Cf4%2Cf5%2Cf6',encoding='utf-8'),
                'fields2':urllib.request.unquote('f51%2Cf52%2Cf53%2Cf54%2Cf55%2Cf56%2Cf57%2Cf58%2Cf59%2Cf60%2Cf61',encoding='utf-8'),
                'ut':'b2884a393a59ad64002292a3e90d46a5',
                'klt':'101',
                'fqt':'1',
                'secid':'{}.{}'.format(c,code),
                'beg':begin,
                'end':end,
                '_':'{}'.format(tm)
        }
        #发送请求
        res = requests.get(url.format(code),headers=header,params=params)
        res.encoding="utf-8"
        #去除js数据中的无关字符,以便符合json数据格式
        html = res.text.lstrip('jQuery{}_{}'.format(jq,tm)+'(')
        html = html.rstrip(');')
        #转换为json数据
        js_html = json.loads(html)
        js_data = js_html['data']
        js_klines = js_data['klines']
        day_num = len(js_klines)
        for num in range(day_num):
            stock_df.loc[len(stock_df)]=[str(js_data['code']),js_data['name'],js_klines[num].split(",")[0],js_klines[num].split(",")[1],
                                         js_klines[num].split(",")[2],js_klines[num].split(",")[3],js_klines[num].split(",")[4],
                                         js_klines[num].split(",")[8],js_klines[num].split(",")[9],js_klines[num].split(",")[5],
                                         js_klines[num].split(",")[6],js_klines[num].split(",")[7],js_klines[num].split(",")[10]
                                        ]
        time.sleep(0.1)
    return stock_df
if __name__ == '__main__':
	stock_df = Spider_stock(code_list,begin='20220915')

到了这里,关于Python爬取东方财富网任意股票任意时间段的Ajax动态加载股票数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 常用的时间段的时间戳

    获取 昨天这个时间的时间戳 计算今天0点的时间戳 计算今天23点59分59秒的时间戳 计算昨天0点的时间戳 计算昨天23:59:59 秒的时间戳 计算近7日 0点的时间戳(不包含当天) 计算近30天 0点的时间戳(不包含当天) 计算上月第一天 0点的时间戳 计算上月最后一天 23点的时间戳 计算上周

    2024年02月10日
    浏览(36)
  • 查找接口成功率最优时间段(100%用例)C卷(Java&&Python&&C++&&Node.js&&C语言)

    服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示,数组中每个元素都是单位时间内失败率数值, 数组中的数值为0~100的整数,给定一个数值(minAverageLost)表示某个时间段内平均失败率容忍值, 即平均失败率小于等于minAver

    2024年01月25日
    浏览(46)
  • 【华为OD机考 统一考试机试C卷】会议室占用时间段(C++ Java JavaScript Python C语言)

    目前在考C卷,经过两个月的收集整理, C卷真题已基本整理完毕 抽到原题的概率为2/3到3/3, 也就是最少抽到两道原题。 请注意:大家刷完C卷真题,最好要把B卷的真题刷一下,因为C卷的部分真题来自B卷。 另外订阅专栏还可以联系笔者开通在线OJ进行刷题,提高刷题效率。

    2024年02月01日
    浏览(55)
  • 【华为OD机考 统一考试机试C卷】查找接口成功率最优时间段(C++ Java JavaScript Python)

    2023年11月份,华为官方已经将 华为OD机考:OD统一考试(A卷 / B卷)切换到 OD统一考试(C卷)和 OD统一考试(D卷) 。根据考友反馈:目前抽到的试卷为B卷或C卷/D卷,其中C卷居多 ,按照之前的经验C卷部分考题会复用A卷,B卷题,博主正积极从考过的同学收集C卷和D卷真题。

    2024年01月15日
    浏览(51)
  • uniapp 实现时间段选择器

    u-popup结合picker-view搭配使用实现时间段选择器 效果图:  

    2024年02月15日
    浏览(50)
  • 判断两个时间段是否有交集

    前言:项目中遇到了类似会议室预约的时间段被占用,预约车辆时间段被占用等。 start:预约开始时间。 end:预约结束时间。 必备条件:start = end 思考🤔: 怎么判断是否被占用呢? 预约的时间,与目标数据库中任意一条的存在交集,则可以视为占用。 有交集的情况有那几

    2024年02月03日
    浏览(67)
  • 获取两个时间段之间的年月

     //获取两个时间段之间的年月         getMonthBetween(start,end){               var result = [];               var s = start.split(\\\"-\\\");               var e = end.split(\\\"-\\\");               var min = new Date();               var max = new Date();               min.setFullYear(s[0],s[1]);          

    2024年03月21日
    浏览(62)
  • 【华为OD机考 统一考试机试C卷】查找接口成功率最优时间段(C++ Java JavaScript Python C语言)

    目前在考C卷,经过两个月的收集整理, C卷真题已基本整理完毕 抽到原题的概率为2/3到3/3, 也就是最少抽到两道原题。 请注意:大家刷完C卷真题,最好要把B卷的真题刷一下,因为C卷的部分真题来自B卷。 另外订阅专栏还可以联系笔者开通在线OJ进行刷题,提高刷题效率。

    2024年02月20日
    浏览(45)
  • hive sql,年月日 时分秒格式的数据,以15分钟为时间段,找出每一条数据所在时间段的上下界限时间值(15分钟分区)

    获取当前的年月日 时分秒 date_format(时间字段, ‘yyyy-MM-dd HH:mm:ss’) 将时间字段转为 2023-10-18 18:14:16 这种格式 在指定时间上增加15分钟 unix_timestamp:获取当前时间的UNIX时间戳(从 1970-01-01 00:00:00 UTC 到指定时间的秒数),然后加上 15*60 秒,即15分钟,就得到了15分钟后的时间戳

    2024年02月08日
    浏览(48)
  • docker查询某时间段的日志

    参考:docker logs 查看docker容器日志详解_Mym_zuoyan_Tmac的博客-CSDN博客_docker logs 查找

    2024年02月16日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包