前面文章 价值十万的代码之二---手把手教你获取数据篇 中,手把手教大家如何获取股票行情的实时数据,大家自己亲自动手实现了吗?首先感谢大家一贯的支持和鼓励,给我了持续分享的动力。本篇将接着上一篇的内容,为大家讲解一下如何获取所有个股的历史数据。

选定目标

上篇我们是通过网易财经的行情页来获取股票的实时行情数据的,那么我们最好还是在网易财经获取历史数据,避免不同平台一些股票标识不一样,导致数据需要进行转换。

在网易财经上左翻右翻,左看右看,终于被我找到了我们的目标。我们首先进入股票实时行情页面(上一篇我们的目标页面):

点击某只股票名称,进入股票详情页面:

我们可以看到这里面是按照季度来展现股票的历史交易数据的。细心的你肯定发现了旁边的“下载数据”的链接按钮,是不是突然有点兴奋了,仿佛点击这个按钮就可以获取到数据了,希望就在眼前。我们点击这个按钮看看:

哇!我看到了起始日期和截止日期,选择开始日期和截止日期,就可以下载一只股票的所有历史交易数据,so easy~

我仿佛看到了各位脸上兴奋的笑容,只需要模拟这个下载操作,我就可以获取一只股票的数据了,所有的 A 股数据也只需要获取几千次而已。

没错,这个思路确实很正确,我之前也是这么操作的。不过好景不长,从今年的某个时间起,我的程序通过这种操作获取不到数据了,每次获取到的只有一行标题,当时我就有点迷茫了,这么好的一个渠道失去了,意味着我又需要重新寻找获取数据的方法。当然了,如果你不嫌麻烦并且时间充裕,可以一只只股票点进来,然后点击下载数据,也可以将所有数据下载到本地,只是机械操作比较多而已。

既然“下载数据”这个入口已经不适合程序操作了,那我们回到股票详情页面,这个页面是按照季度来查询历史交易数据的,那我们把这个页面的数据解析出来,不就获取了这只股票一个季度的数据了吗?然后写个循环,逐个季度获取,不就完事了吗?

分析目标页面

我们选择2020年三季度,然后点击“查询”按钮,查看“天迈科技”2020年三季度的历史交易数据:

我们可以看到第一个请求 URL,就很像是这个页面的请求,再看看返回预览是这个页面的数据,看来这个大概率是我们的目标请求了。

我们再接着看这个请求的返回,显示是一个 html 页面的代码,想要知道这个 HTML 页面中是否包含我们的目标数据(主要是为了区分这页面是及时返回数据,还是页面加载后通过 ajax 请求再来获取数据),我们只需要将这个页面代码复制到文本编辑器,然后用交易数据的表格中的一个数据项搜索页面代码,如果能搜索到,说明页面的数据都在这个页面代码中,如果获取不到,我们再去研究页面代码,找到加载数据的请求。通过搜索,我们发现可以搜到,说明是及时加载的,也给我们提供了方便,不用再去研究延时加载了。

既然这样,我们就可以直接通过解析这个 HTML 页面内容来解析出我们需要的股票数据了。

多说一句,很多人学Python过程中会遇到各种烦恼问题,没有人解答容易放弃。小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。

代码实现

通过上面的分析,我们知道,我们获取一只股票的历史交易数据,需要逐个季度的请求解析,然后拼凑在一起。所以,我们的第一步是获取目前 A 股所有的股票,还记得我们上篇文章的输出吗?全部的 A 股股票就在那里。我们当时是存入 MySQL 数据库的,现在可以获取出来为我所用了:

def query_lcode(self, day):        query_sql = "select code,name from stock_info where day='%s'" % day        try:            lcode = self.cur.execute_sql(query_sql)            return lcode        except Exception:            #输出异常信息            traceback.print_exc()

接着,我们以获取一只股票的一个季度的数据为例,来说说怎么解析这个页面获取数据。

第一步,我们获取页面 HTML 内容:

def get_data(self, code, year, season):        url = 'http://quotes.money.163.com/trade/lsjysj_%s.html?year=%s&season=%d' % (code, year, season)        ua_header = {"Connection": "keep-alive",                     "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36",                     "Host": "quotes.money.163.com",                     "Cookie": "vjuids=2453fea.1759e01b4ef.0.c69c7922974aa; _ntes_nnid=99f0981d725ac03af6da5eec0508354e,1604673713410; _ntes_nuid=99f0981d725ac03af6da5eec0508354e; _ntes_stock_recent_=1300033; _ntes_stock_recent_=1300033; _ntes_stock_recent_=1300033; ne_analysis_trace_id=1604846790608; s_n_f_l_n3=20f075946bacfe111604846790626; _antanalysis_s_id=1604933714338; vjlast=1604673713.1605015317.11; pgr_n_f_l_n3=20f075946bacfe1116050154486829637; vinfo_n_f_l_n3=20f075946bacfe11.1.0.1604846790623.0.1605015456187",                     "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",                     "Accept-Encoding": "gzip, deflate",                     "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,fr;q=0.7",                     "Cache-Control": "no-cache",                     "Pragma": "no-cache",                     "Referer": "http://quotes.money.163.com/trade/lsjysj_%s.html" % code,                     "Upgrade-Insecure-Requests": "1",                     }        response = requests.get(url, headers=ua_header, verify=False)        content = response.content.decode("utf-8")        return content

第二步,我们来解析数据:

def parse_data(self, code, name, content):        soup = BeautifulSoup(content, 'html.parser')        table = soup.find("table", class_="table_bg001 border_box limit_sale").prettify()        tb_soup = BeautifulSoup(table, 'html.parser')        tr_list = tb_soup.find_all('tr')        stock_list = []        if len(tr_list):            del tr_list[0]            for tr in tr_list:                items = tr.text.split('')                if len(items):                    del items[0]                    stock = {}                    stock['day'] = items[0].replace(' ', '').replace(' ', '')                    stock['code'] = code                    stock['name'] = name                    stock['open_price'] = self.trans_float(items[1].replace(' ', '').replace(' ', ''))                    stock['top_price'] = self.trans_float(items[2].replace(' ', '').replace(' ', ''))                    stock['low_price'] = self.trans_float(items[3].replace(' ', '').replace(' ', ''))                    stock['close_price'] = self.trans_float(items[4].replace(' ', '').replace(' ', ''))                    # stock['last_price'] = self.trans_float(items[7])                    stock['add_point'] = self.trans_float(items[5].replace(' ', '').replace(' ', ''))                    stock['add_percent'] = self.trans_float(items[6].replace(' ', '').replace(' ', ''))                    stock['volumn'] = self.trans_float(items[7].replace(' ', '').replace(' ', '').replace(',', ''))                    stock['turnover'] = self.trans_float(items[8].replace(' ', '').replace(' ', '').replace(',', ''))                    stock['amplitude'] = self.trans_float(items[9].replace(' ', '').replace(' ', ''))                    stock['exchange_rate'] = self.trans_float(items[10].replace(' ', '').replace(' ', ''))                    # stock['market_value'] = self.trans_float(items[13])                    # stock['flow_market_value'] = self.trans_float(items[14])                    stock_list.append(stock)        return stock_list

这里我先用 bs4 来解析 HTML 页面,定位到数据表格,然后再解析表格的内容就可以获取每一个日期的数据项了。但是这里相对于我们上一篇的实时行情数据,会少几项,例如前一个交易日的收盘价,市场成交额等,不过这几项数据是可以通过所有的历史数据计算出来的,所以即使以后要用我们也有办法。

解析完数据之后,我们就可以存储到数据库了:

def insertdb(self, data_list):        attrs = ['day', 'code', 'name', 'open_price', 'top_price', 'low_price', 'close_price', 'add_point',                 'add_percent', 'volumn', 'turnover', 'amplitude', 'exchange_rate']        insert_tuple = []        for obj in data_list:            insert_tuple.append((obj['day'], obj['code'], obj['name'], obj['open_price'], obj['top_price'], obj['low_price'], obj['close_price'], obj['add_point'], obj['add_percent'], obj['volumn'], obj['turnover'], obj['amplitude'], obj['exchange_rate']))        values_sql = ['%s' for v in attrs]        attrs_sql = '('+','.join(attrs)+')'        values_sql = ' values('+','.join(values_sql)+')'        sql = 'insert into %s' % 'stock_info'        sql = sql + attrs_sql + values_sql        try:            print(sql)            for i in range(0, len(insert_tuple), 20000):                self.cur.executemany(sql, tuple(insert_tuple[i:i+20000]))                self.conn.commit()        except pymysql.Error as e:            self.conn.rollback()            error = 'insertMany executemany failed! ERROR (%s): %s' % (e.args[0], e.args[1])            print(error)

这个没什么好说的,就是一个数据库批量插入操作而已。

到这里,我们就把一只股票的一个季度的数据获取到了。那么如何获取所有股票的历史数据呢?相信聪明的你已经有了答案了。一种办法是获取股票的详细信息,然后解析出上市日期,然后从上市日期所在年度季度开始,逐个季度获取数据。另一种办法是从 A 股开市时间开始,沪市的开市日期是1990-12-20,深市的开市日期是1991-01-03,创业板的开市日期是2009-10-30,科创板的开市日期是2019-07-22。四个板块的股票分别从这几个日期开始获取,不管这只股票是什么时候上市的,都可以获取全这只股票的历史数据。

总结

本文教大家如何从网易财经的个股历史交易数据页面获取到全市场个股的历史交易数据,大家可以根据文中的方法自己去实践一下。

到此为止,获取股票的数据这个环节我就介绍完了,接下来就是如何利用手中的数据去分析出有价值的东西。

html实时时间代码_价值十万代码之三-获取全部历史数据相关推荐

  1. 价值十万代码之三-获取全部历史数据

    前面文章 价值十万的代码之二---手把手教你获取数据篇 中,手把手教大家如何获取股票行情的实时数据,大家自己亲自动手实现了吗?首先感谢大家一贯的支持和鼓励,给我了持续分享的动力.本篇将接着上一篇的内容 ...

  2. 播放失败246106异常代码_燃气壁挂炉故障代码,这个必须得收藏了!

    再好的产品也有可能会出现故障, 如果家里的壁挂炉出现故障了, 显示了一些字母代码, 你知道这些字母代码是什么意思吗? 又该采取什么措施去解决呢? 下面小编总结了一些品牌壁挂炉的故障代码, 供大家参考. ...

  3. 读代码读的什么代码_您的代码应读得像书

    读代码读的什么代码 There's a pandemic among programmers. Long functions, broad and nondescriptive names for f ...

  4. java计分系统编程代码_使用Java代码对实时系统进行编程

    由于许多重要原因,Java语言在实时系统中的使用并不广泛. 这些包括Java语言设计固有的不确定性性能影响,例如动态类加载,以及Java Runtime Environment(JRE)本身,例如垃圾 ...

  5. 同步代码和异步代码_告别异步代码

    同步代码和异步代码 Quasar是一个将真正的轻量级线程(纤维)添加到JVM的库. 它们非常便宜且非常快-实际上,光纤的行为就像Erlang进程或Go goroutines-并允许您编写简单的阻塞代码 ...

  6. python灰色模型代码_几行代码搞定ML模型,低代码机器学习Python库正式开源

    机器之心报道 机器之心编辑部 PyCaret 库支持在「低代码」环境中训练和部署有监督以及无监督的机器学习模型,提升机器学习实验的效率. 想提高机器学习实验的效率,把更多精力放在解决业务问题而不是写代 ...

  7. python低代码_几行代码搞定ML模型,低代码机器学习Python库正式开源

    PyCaret 库支持在「低代码」环境中训练和部署有监督以及无监督的机器学习模型,提升机器学习实验的效率. 想提高机器学习实验的效率,把更多精力放在解决业务问题而不是写代码上?低代码平台或许是个不错的 ...

  8. html5酷炫表白代码_七夕表白代码,樱花特效+爱心特效+花瓣+评论留言功能等

    ___2020/8/25七夕不是快到了嘛,寻思最近没啥活,于是闲暇时间扒一套JQuery代码,做了一下优化 ------- 超级好看的花瓣表白网页源码, ___然后通过gitee(码云)搭建了一套个人 ...

  9. 手游方舟怎么输入代码_方舟自定义代码怎么输入 | 手游网游页游攻略大全

    发布时间:2016-02-16 我的世界手机版代码输入方法 代码怎么用.我的世界手机版代码怎么输入?我的世界手机版代码怎么用?很多玩家对此不是很清楚,下面小编为大家介绍一下我的世界手机版代码怎么用,希 ...

最新文章

  1. AI一分钟 | 传阿里百度京东6月回归A股;汽车合资股比限制将取消,特斯拉或成最大赢家...
  2. JS正则表达式验证数字
  3. Unity3D手机斗地主游戏开发实战(03)_地主牌显示和出牌逻辑
  4. centos7下安装maven
  5. IDEA常用快捷键!!
  6. win10 64位下运行汇编
  7. js深入理解构造函数和原型对象
  8. zabbix mysql 脚本路径_Zabbix监控MySQL脚本
  9. PG基于repmgr实现自动和手动故障切换
  10. maven项目动态替换配置中的值
  11. 在Microsoft VS.net 2005下开发Linux环境的网站应用
  12. 【转】使用oschina的git服务器
  13. MessageDialog MessageDialogPage
  14. Midletinfo-探索手机javaME系统信息的实用工具
  15. 2019年PMP考试模拟题(附答案解析)
  16. 图片服务器-存储图片技巧
  17. 一学校出150名在校“老板”
  18. 【每天读一点英文】gnuhpc:The World As I See It(节选)
  19. 常用的14个获取数据的网站。
  20. One_DPLayer -一款简单好用的在线播放器[DPLayer]

热门文章

  1. Spring boot配置Dubbo三种方式
  2. Quartz框架架构
  3. Mybatis的selectKey使用
  4. Outlook邮箱重新配置
  5. MySQL事务的特性
  6. 笔记本敲代码真香,包邮送一个!
  7. 通过XML设置屏幕方向(android:screenOrientation)详解
  8. 在Eclipse上安装插件springsource-tool-suite详解,完美不报错!以及yml无自动提示?
  9. oracle+手工创建pfile,oracle 手工创建数据库
  10. 笔记 - AliCloud 云上安全防护 简介