分享好友 最新动态首页 最新动态分类 切换频道
Python爬虫系列-获取每天黄金价格(编写爬虫的过程和编写代码思路详细解析)
2024-12-29 09:14

        最近因为经济形势不好,黄金这样的硬通货价格持续走高,而且现在已经到了相当之高的程度。介于理财投资的低迷,黄金的长期投资说不定可以跑赢通胀。对于我们新手的投资,本着低买高卖的原则,总不会亏太多,这样我们就需要一个可以每天获取黄金价格的python脚本,每天爬取我们需要的黄金价格,然后大家可以根据需要添加发送邮件给自己等功能,做一个自动推送黄金价格的小工具。

Python爬虫系列-获取每天黄金价格(编写爬虫的过程和编写代码思路详细解析)

        先在网上随便找一个黄金价格的网站,比如下面的这个链接:

如上图,我们可以看到,这个网站有每天的黄金基础价、零售价、回收价,下面的列表中有我们需要金价,点击上面的黄金基础价、零售价、回收价,下面的列表也会切换到相应的项目的价格上去,而我们的目标就是获取下面的列表中每天的金价了。

我们先试试edge浏览器的f12开发者调试模式,如下图:

那我们使用Fiddler直接抓包看看(你也可以使用Chrome浏览器的开发者模式抓包,这个网页不会报错,我想介绍给大家更通用的方法,所以使用了Fiddler)。打开我们的Fiddler Classic,随便选择一个左侧列表中嗅探出的网页项目,点击右上方Inspectors,并切换到JSON选项卡,如下图:

然后我们不停切换左侧列表嗅探出的网页,并观察右下角的JSON窗口的内容变化,当切换到

 以上链接时,如下图:

可以看到JSON窗口返回了我们需要的黄金单价,和网页中比较下,发现它是和网页的排除顺序相反,最新日期的数据是在最后的,而且通过这个网址传递的参数分析,它的参数如下:

codes=JO_52683

style=3

pageSize=30

time=1708922877928

显然其中的codes是切换黄金基础价、零售价、回收价的,一共有三种格式:

黄金基础价: JO_52683

零售价: JO_52684

回收价: JO_52685

style显示是一个类型,我们暂时不需要,pageSize是每次使用这个网址请求服务器返回数据时,服务器返回的数据条数数,pageSize=30就是返回30条数据,经过我用python的request发包测试,最少可以返回1条,最多返回500条数据。最后的time时间戳没有写明,但显然就是一个毫秒级时间戳(代表当前日期时间),实际测试时发现服务器并不验证这个时间戳,也就是重复传一个固定的时间戳也可以,当然我在我的代码中还是模拟了下当前时间戳。

 

下面是我用python构造了模拟发包获取服务器返回的json数据的函数:

 

 我来解释下这个函数,第一句是使用requests库的get方法,通过传入我们构造的参数url网址和header发包头,来模拟发送给服务器,使之返回我们需要的json结果,其中pageSize(每页数量),pagecount(返回总页数),data_style(金价的类型),header(网页发送时的请求头),time(当前时间戳)都是我们构造函数的模拟参数,通过调用此函数时自定义传入即可。第二句是按照utf-8的格式转码我们获得的服务器返回值。因为服务器返回的是如下面格式字符串(以下的返回值我已做过格式化处理方便大家查看)

 

因此我们需把上面的字符串转换成我们可以操作的json格式,所以先用第三句的去掉这个字符串的参数名'var quote_json =,然后把这个字符串放入json.loads函数中载入成标准的json数据格式方便操作。我们观察下上面的序列构造,显然我们只需要JO_52683数组中的q1和time时间戳(此时间戳是金价数据对应的日期),经过一番构造后,有了如下函数

 

其中,一共4个参数,其他之前后已介绍过,json_data就是我们上一步获得的json格式数据,我们需要在这个函数中,解析出我们需要的数据。因为返回的json是逆序的日期排列,也就是最新的日期金价在最后面,我们我们需要逆循环读取出数据。

要逆向循环,即从高到低循环,你可以使用函数的三个参数:起始值、结束值和步长。当步长为负数时,可以实现逆向循环。如果你想要从开始到结束(包含,你可以这样做:

 

这里的解释如下

  • 是循环的起始值,因为在Python中是包含起始值、不包含结束值的,所以要从开始。
  • 是循环应该停止的值的前一个位置。由于不包括这个值本身,如果你想循环到,你需要写作为结束值。
  • 是每次循环中索引减少的量,即步长。

然后我们构造一个item变量,读取data键值中的"JO_52683"数组,也就是前面序列中的

 

然后我们通过使用item["q1"]和item["time"]取出每个数组中的金价和日期时间戳就行了,然后通过下面的函数把时间戳转换成相应的日期格式

 

其中因为时间戳是UTC格式,是美国东时间,所以还要增加24小时*60分钟*60秒,因为是毫秒级需除以1000转换成秒,因此最终格式为timestamp = time / 1000 + 24 * 60 * 60,然后通过datetime.utcfromtimestamp函数的strftime转换成2024-02-26这样的格式即可。

最后我们只要把所有函数串联起来调用即可,如下面的完整代码:

 

其中的pageMax是你需要爬取的页数,取的大一点不要紧,因为爬取不到数据会报错停下。请看如下的爬取结果: 

以上是我的爬虫教程,给大家学习参考用,请不要把爬虫用于不良目的,爬取测试时请添加延时,不要增加服务器负担,谢谢观看

2024.04.07更新代码(增加数据写入EXCEL文档功能、修复utcfromtimestamp不在可用bug):


最新文章
百度手机卫士2024最新版本
百度手机卫士APP是一款百度推出的手机安全的软件,它可以给用户免费提供系统优化,垃圾清理,手机上网流量保护,骚扰电话拦截等等功能,它将会竭力全力保护用户手机安全,它是让用户尊享轻巧、智能、快速、纯净的产品体验的软件,是新时代
百度推广全攻略,高效优化策略,助力品牌价值飞跃
本文全面解析了优化百度推广策略,通过精准关键词、高质量内容、数据分析等多维度手段,助力企业实现品牌价值最大化。从定位策略到效果监控,提供实战技巧,助您在激烈的市场竞争中脱颖而出。在互联网时代,百度作为最大的搜索引擎,拥有庞
用简单程序替换 MySQL 窗口函数
A 1 set @i1=null, @i2=0, @i3=0, @d1=null; 2 select curr_month, t1.province, curr_sales, sale_rank,if(count1, (sale_rank-1)/(count-1), 0) as `percent_rank` from (select prev_month, curr_month, province, @i2:=if(p
推荐给你三款主流Docker可视化工具
1 前言Docker 提供了命令行工具来管理 Docker 的镜像和运行 Docker 的容器。我们也可以使用图形工具来管理 Docker。目前,主流的 Docker 图形工具有 Docker Ul、Portainer 和 Shipyard。基于 Spring Boot + MyBatis Plus + VueElement 实现
江西历年考研报名人数
作为考研党的一员,我们都知道江西考研历年报名人数统计是我们关注的重点之一。每年的考研报名人数都直接影响到我们的竞争压力和录取概率,因此及时了解江西考研历年报名人数统计数据对于我们制定合理的备考策略至关重要。**江西考研历年报
菜单路由
前端项目基于 vue-element-plus-admin 实现,它的 路由和侧边栏是组织起一个后台应用的关键骨架。 侧边栏和路由是绑定在一起的,所以你只有在 @/router/index.js下面配置对应的路由,侧边栏就能动态的生成了,大大减轻了手动重复编辑侧边栏
怎么做抖音短视频seo排名优化?效果怎么样?
抖音作为当下最流行的短视频平台之一,拥有庞大的用户基础和广阔的市场潜力。在这个竞争激烈的平台上,如何进行短视频的SEO排名优化成为了许多创作者和营销人员关注的重点。本文将介绍如何进行抖音短视频的SEO排名优化,以及其效果和一些系
绿色清理管家
绿色清理管家app是一款专业的手机垃圾清理软件,能够有效解决手机使用过程中的一切卡顿、耗电、内存不足等问题,一键清理加速,让你的手机更畅快。有需要的欢迎下载使用!绿色清理管家是一款通过手机加速、垃圾清理、超强省电以及CPU降温等
现代领动1.6l自动精英型怎么操作
1、熄火开关没开,熄火线短路。缺机油保护器自动保护。2、传感器:拔掉机油传感器连接线,汽油机能启动的换机油传感器。3、点火系统问题:拔掉火花塞空拉启动,观察火花情况,火花为白红色正常若无火花就换火花塞或点火器。4、供油系统1、
董定虎详析福彩3D和排列3投注技巧:交集处理大底
  所谓大底,就是指运用软件将各自的数据、图表、条件等转化为能保证中直选的一定注数的号码。在制作大底时,一般情况下未进行任何过滤前,大底的注数为1000注,也可称为原始大底。   大底的作用--随着博彩技术的不断发展,除了定位
相关文章
推荐文章
发表评论
0评