导言

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

查看网页源码

首先我们F12打开东方财富网网页源码,以指南针(300803)为例:

我们先点击网络,再点击300803.html,再选择右边弹出来的预览响应,可以发现,源码中并没有我们想要的股票数据,但是再网页中又有我们想要的收盘价等数据,说明这很可能数据是Ajax动态加载出来的,一般而言数据会存储再一个json文件之中。

找出储存数据的json文件

我们很容易找到当前网页中该股票的当日收盘价,所以我们可以以此为关键词进行搜索,搜索步骤为:在页面右边的网页信息页面,ctrl+F,即可打开搜索框,结果如下图所示,发现有三个url文件包含该数值:

点击进去可以发现里面都有大量的数据,这些数据也是网页所显示的数据来源,根据不同的数据需求,选择某一个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

可以发现里面有许多查询参数,我们需要一个一个进行分析。

cb

该参数值为:

jQuery1123008330414708828249_1669967900108

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

jquery.min.js


因此,打开该js文件,ctr+F搜索jQuery可以发现cb参数的来源,如下图所示。结果表明该参数值是通过JS代码赋值的。往前搜索m可以发现m为一个固定的字符串值1.12.3,这应该是版本号;后面再添加一个0到1随机数组合为一个字符串;最后的replace操作则是对该字符串所有非数字字符替换为空。因此下划线前面的数字已经被解读出来了。

通过上图可以发现,该参数首先被赋值给变量expando,通过搜索我们很快的可以找到下划线后面的数字来源,如下图所示:

因此,这个变量Eb是关键。同理我们搜索变量Eb,可以发现该变量是一个时间戳,考虑其位数,可以联想到对当前书简戳乘以1000再取整,经过检验是正确的。

因而我们解读出了该参数的构成,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参数的时间戳是一致的。

完整代码

最后,完整爬取代码如下,该代码只是简单的进行了函数包装,有精力的小伙伴可以将其包装为一个类,本人水平有限,代码仅供参考:

#爬虫程序
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 0params={'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动态加载股票数据相关推荐

  1. python爬取东方财富网资金流向数据(在本地生成csv文件)

    今天我们来试着用python爬取东方财富网资金流向的表格数据. 第一步:程序及应用的准备 首先我们需要安装selenium库,使用命令pip install selenium;然后我们需要下载对应的c ...

  2. 利用python爬取东方财富网股吧评论并进行情感分析(一)

    利用python爬取东方财富网股吧评论(一) python-东方财富网贴吧文本数据爬取 分享一下写论文时爬数据用到的代码,有什么问题或者改善的建议的话小伙伴们一起评论区讨论.涉及内容在前人的研究基础之 ...

  3. python培训机构调研最多的股票_使用python爬取东方财富网机构调研数据

    标签: 最近有一个需求,需要爬取东方财富网的机构调研数据.数据所在的网页地址为: 机构调研 网页如下所示: 可见数据共有8464页,此处不能直接使用scrapy爬虫进行爬取,因为点击下一页时,浏览器只 ...

  4. 爬虫学习笔记(用python爬取东方财富网实验)

    参考文章以及视频:(11条消息) 爬虫实战 | 爬取东方财富网股票数据_简说Python的博客-CSDN博客.手把手教你从东方财富网上获取股票数据_哔哩哔哩_bilibili.[Python爬虫案例] ...

  5. python爬取东方财富网中的资金流向表

    因为东方财富网中的资金流向表是一个动态的数据,所以采用selenium模块进行爬取. 爬取东方财富网的资金流向表的具体步骤: 1.获取初始的URL 2.爬取对应的URL地址的网页,获取新的URL地址 ...

  6. 使用python爬取东方财富网机构调研数据

    最近有一个需求,需要爬取东方财富网的机构调研数据.数据所在的网页地址为: 机构调研 网页如下所示: 可见数据共有8464页,此处不能直接使用scrapy爬虫进行爬取,因为点击下一页时,浏览器只是发起了 ...

  7. python财务报表分析-用Python爬取东方财富网上市公司财务报表

    ♚ 作者:苏克,零基础.转行python爬虫与数据分析 博客:https://www.makcyun.top 摘要: 现在很多网页都采取JavaScript进行动态渲染,其中包括Ajax技术.有的网页 ...

  8. 用python爬取东方财富网网页信息_爬取东方财富网数据的网页分析

    自学Python已有3个月之多,浏览无数大神的佳作,收获颇丰.当初自学python就是为了学习爬虫,爬取网站上好看妹子的图片--[流口水][流口水] 言归正传,近期学习量化交易知识,发现东方财富网(e ...

  9. python爬取东方财富网,并将数据导入mysql

    1.首先使用xpath获取网页中的表格数据,需要下载谷歌及与之版本相同的相关程序, 链接如下:ChromeDriver Mirror 我下载的正好是压缩过后就是如下程序: 2.然后就是连接mysql数 ...

最新文章

  1. Caffe框架GPU与MLU计算结果不一致请问如何调试?
  2. 面试官:为什么要尽量避免使用 IN 和 NOT IN 呢?
  3. Public Prize
  4. C#中Split函数的使用
  5. 解决依赖的moduleBuildConfig.DEBUG总是未false的问题
  6. 安卓没删干净导致报错
  7. Ubuntu 14.04 python3.6 安装
  8. python变量作用域 for_python变量作用域
  9. 关于Exchange管理控制台报“您的权限不足,无法此查看数据”的解决办法
  10. Redis面试常问4-- 如何实现异步队列 Blpop key timeout
  11. ubuntu 创建桌面图标快捷方式
  12. LeetCode 590. N叉树的后序遍历(N-ary Tree Postorder Traversal)
  13. 在写易买网时产生的错误 JSTL标签库中c:choose/c:choose不能放JSP页面!-- --注释...
  14. 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。
  15. 通过Keepalived实现Redis Failover自动故障切换功能[实践分享]
  16. 并发编程学习之生产者消费者模式 - 使用Condition实现
  17. passenger+nginx框架部署
  18. 你是否还记得自己的手机号在哪些网站上面注册过呢?
  19. matlab 两个数中取小,matlab中取两个数中的较小值
  20. maya渲染序列文件存在检测工具

热门文章

  1. Interaction triggers in WPF
  2. 制作Mac Lion系统U盘启动
  3. 线程与蓝牙:物联网连接的 VHS 与 Betamax?
  4. linux挂载安卓手机,安卓USB设备U盘挂载工具(StickMount Pro)
  5. 重学数据结构与算法系列:这玩意叫跳表?
  6. Android 注入 看雪
  7. CSS中visibility 属性
  8. 2022年南京Java培训机构排名,实力突出遥遥领先
  9. Java学到什么程度才算精通?(2),学海无涯
  10. 【枚举】Broken Necklace