Python爬虫实战:实时微信推送奥运奖牌榜信息

news2024/12/24 2:52:09

最近奥运会正在巴黎如火如荼地进行。为了能第一时间获得我国运动健儿的获奖情况,我给大家分享一个python爬虫项目——实时微信推送奥运奖牌榜信息。
爬虫每隔 5 分钟抓取一次奥林匹克官网奖牌榜数据,对比上次抓取的数据,如果 奖牌数量 或者 排名 有变化,就将新的获奖信息推送到微信中。


1. 概述

项目大概分为 网络爬虫微信推送 两个部分。总体流程示意图如下。

爬虫部分,需要爬取最新的奥运奖牌数据,跟本地缓存数据比较。判断 奖牌数量排名 是否有变化,如果有变化,便更新本地缓存数据,并向微信推送。

微信推送部分,由于 Access Token 有效时间 2 小时,并且接口每日请求次数有限制,所以最好将 Token 缓存在本地,过期以后再重新请求获取。获取到 Access Token 以后,获取 用户列表,并向每个用户 推送消息

最后,在电脑(或服务器)上开启一个 定时任务,每隔 5 分钟运行一次代码即可。

2. 网络爬虫

首先确定爬虫的目标网站,即 奥林匹克官网,这样可以获得第一手的原始数据。

网址:https://olympics.com/zh/paris-2024/medals

按 F12 打开 开发者工具 ,切换到 Network 页签,然后刷新网页开始抓包。

经过一番查找,发现这是一个 静态 网页,奖牌数据存储在 html 网页中的 js 脚本里。

我们这里直接使用 正则表达式 ,提取代码中的 medalsTable 这个数组,然后格式化为 json 对象即可。

观察数据的存储结构可以发现,数组中每个元素是一个国家的奖牌榜数据,存储了 国家英文简称国家中文名称国家全称金牌排名总奖牌排名奖牌数量奖牌详情 等信息。

[
    {...},  // 每个元素是一个国家的奖牌数据
    {
        "organisation": "CHN",   // 国家简称
        "description": "中国",  // 国家名称
        "longDescription": "中国", // 国家全称
        "nameOrder": 2330,
        "longNameOrder": 2330,
        "protocolOrder": 41,
        "rank": 2,      // 金牌排名
        "rankEqual": false,
        "sortRank": 2,
        "rankTotal": 2,     // 总奖牌排名
        "rankTotalEqual": false,
        "sortTotalRank": 2,
        "disciplines": {...},   // 奖牌详情
        "medalsNumber": {...}        // 奖牌数量
    },
    {...},
    {...},
]

其中,medalsNumber 中存储的是 奖牌数量 信息,其数据格式如下:

"medalsNumber": [
    {
        "type": "Total",   // 总
        "gold": 19, "silver": 15, "bronze": 11, "total": 45
    },
    {
        "type": "Women",  // 女子
        "gold": 7, "silver": 6, "bronze": 8, "total": 21
    },
    {
        "type": "Mixed",    // 混合
        "gold": 3, "silver": 2, "bronze": 0, "total": 5
    },
    {
        "type": "Men",  // 男子
        "gold": 9, "silver": 7, "bronze": 3, "total": 19
    }
]

包含了 女子比赛男子比赛男女混合比赛 的奖牌获得情况,以及 总奖牌 获得情况数据。

disciplines 中存储的是 奖牌详情 信息,数据格式如下:

"disciplines": [
    {
        "code": "TTE",
        "name": "乒乓球",  // 比赛项目名
        "gold": 3,
        "silver": 1,
        "bronze": 0,
        "total": 4,
        "medalWinners": [
            {
                "disciplineCode": "TTE",
                "eventCode": "TTEMSINGLES-----------",    // 子项目代码
                "eventCategory": "Men",
                "eventDescription": "男子单打",    // 子项目名
                "eventOrder": 1,
                "medalType": "ME_GOLD",        // 奖牌类型
                "official": true,
                "competitorCode": "1902295",
                "competitorType": "A",
                "competitorOrder": 1,
                "competitorDisplayName": "FAN Zhendong",   // 获奖者
                "competitorDisplayPrintInitialName": "",
                "competitorDisplayTvName": "",
                "competitorDisplayPrintName": "",
                "date": "2024-08-04",        // 获奖时间
                "extraData": {
                    "detailUrl": "/zh/paris-2024/athlete/zhendong-fan_1902295"
                }
            },
            { ... }, // 其他获奖者信息
            { ... },
            { ... }
        ]
    },
    { ...... },  // 羽毛球项目 获奖信息
    { ...... },  // 跳水项目 获奖信息
    { ...... }  // 射击项目 获奖信息 ...
]

我们只需要根据自己的需求,解析对应的数据字段即可。

3. 微信推送

为了实现微信消息推送,我们需要使用到微信公众号的 发送消息-模板消息(业务通知) 功能。

目前该接口仅 微信认证服务号 有权限使用。

不过好在,微信提供了 微信公众平台接口测试账号,可以免费体验和测试所有的功能接口。

网址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

使用微信账号扫码登录以后,会进入 测试号管理 后台页面。

下面简单介绍一下测试号管理界面。

最顶部是 测试号信息 ,是测试号的 appIDappsecret

这两个参数可以用来获取 Access_Token ,后面会用到,请务必保管好,不要泄露。

下面是 接口配置信息 ,如果我们的代码需要接收和处理微信主动发来的消息,那么这里需要填入你的 url 和 Token 进行相应配置。由于我们只需要单向给微信推送消息,所以这里用不到,空着即可。

再往下是 测试号二维码,微信扫码可以关注测试公众号,当前关注的用户列表会显示在右侧。

这里我们可以看到用户的 昵称微信号

后续我们给用户推送消息时,需要根据 微信号 来确定具体推送给谁。

再下面是 模板消息接口,点击新增测试模板 按钮后即可添加需要推送的消息模板。

其中,需要注意的几点:

  1. 模板标题 是固定文本,不可以设置参数,且长度不超过 10 个字符。

  2. 模板内容 可以设置参数,参数填入格式为 {{参数名.DATA}} ,如:

截至{{date.DATA}},我国奖牌获得情况如下: 
🥇金牌:{{gold_num.DATA}} 
🥈银牌:{{silver_num.DATA}} 
🥉铜牌:{{bronze_num.DATA}} 
总奖牌数:{{total_num.DATA}} 
当前排名:{{rank_index.DATA}}
  1. 参数名可以自定义,只要跟调用接口处传递的参数名一致即可。

  2. 模板提交以后,就不能编辑了,如果需要修改,可以删除以后重新添加。

  3. 每个消息模板会有一个 模板ID,用于接口调用。

  4. 暂时想到这么些,如果遇到其他问题了可以找我交流。

最后是 体验接口权限表,显示了各种类目和功能的接口,以及每日调用限制。并且附带有接口的详细使用说明。

关于python技术储备

由于文章篇幅有限,文档资料内容较多,需要这些文档的朋友,可以加小助手微信免费获取,【保证100%免费】,中国人不骗中国人。

在这里插入图片描述

                                     **(扫码立即免费领取)**

全套Python学习资料分享:

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,还有环境配置的教程,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频全套

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

如有侵权,请联系删除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1991798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux学习】深入理解软硬链接

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 🎈软硬链接🐧软链接🐬硬链接 🐸总结软硬链接的原理🐍软硬链接的应用场景&…

stm32入门学习11-硬件I2C和MPU

(一)I2C硬件电路 stm32内部有I2C的硬件电路,我们可以使用stm32的标准库函数来实现I2C,这可以为我们减少对软件资源的占用 I2C硬件电路常用的标准库函数 void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct); /…

萤石开放平台 P套餐和E套餐的切换方法

本文将详述P套餐和E套餐的切换方法 注:套餐切换成功后立即生效,次日开始扣费,企业版套餐按日计消耗扣费,第二天计算前一天的费用并在余额扣除对应金额 一. E套餐切换成P套餐 请提工单联系我们: 萤石开放…

centos7.9安装k8s 1.3

centos7.9安装k8s 1.3 k8s环境规划:初始化修改网卡配置两台服务器都执行 配置阿里yum源 安装containerd服务安装初始化k8s需要的软件包kubeadm初始化k8s集群 扩容k8s集群-添加第一个工作节点安装kubernetes网络组件-Calico测试在k8s创建pod是否可以正常访问网络和co…

数据结构(邓俊辉)学习笔记】词典 02—— 散列函数

文章目录 1. 冲突难免2. 何为优劣3. 整除留余4. 以禅为师5. M A D6. 平方取中7. 折叠汇总8. 伪随机数9. 多项式10. Vorldmort 1. 冲突难免 好,接下来的这一节我们就来介绍散列策略中的第一项,也是最重要的技术,散列函数的设计与定制。 在上…

免杀笔记 ---> 函数踩踏 PEB寻址

又鸽了一段时间了,最近在写这个武器,感兴趣的师傅们可以去看看(顺便给我点个Star) whoami-juruo/InjectTools: 一款集成了DLL-Session0注入,APC注入,映射注入,线程劫持,函数踩踏自提…

电脑开机出现checking media presence原因分析及解决方法

最近有网友反馈电脑开机出现checking media presence?电脑开机出现checking media presence原因有很多:分区类型不对、双硬盘选择的第一启动项不对等等原因,下面小编就教大家电脑开机出现checking media presence详细解决方法。 电脑开机出现…

【ARM】CMSIS 软件标准接口

目录 CMSIS:Cortex Microcontroller Software Interface Standard1. 概述2. CMSIS-Core2.1 概述2.2 关键组件2.3 示例代码2.4 详细解释 3. CMSIS-DSP3.1 概述3.2 关键组件3.3 示例代码3.4 详细解释 4. CMSIS-RTOS4.1 概述4.2 关键组件4.3 示例代码4.4 详细解释 5. C…

java之equals的使用区别

public class SystermDemo3 {public static void main(String[] args) {String s"abc";StringBuilder sbnew StringBuilder("abc");System.out.println(s.equals(sb));//false//equals方法是被s调用的,而s是字符串//所以equals要看String类中//字符串中的e…

大模型笔记5 Extractive QA任务评估

目录 Extractive QA任务评估 Extractive QA评测指标 precision, recall, f1 ROUGE 划分训练与评估数据集 token位置评估 单个token位置评估 输入label的token位置 预测token位置 评估 Wandb 共享机器同时登录 样本类别平衡 标记token label时对窗口进行筛选 训练…

亚马逊日本站认证 硅藻土商品

商品说明和商品照片 硅藻土商品,是指以硅藻土为主要原料而制作的商品。其中,针对浴室脚垫和杯垫等呈板状的商品,因需确认其石棉含有率符合相关安全基准规定,请您提交相关证明资料。 防止石棉损害健康条例以及相关法令 可证明该产…

[算法题]课程表/课程表 II

题目链接: 课程表 课程表 II 通过拓扑排序求解, 首先认识有向无环图: 入度表示有多少点指向自己, 出度表示自己指向多少点, 拓扑排序的思想则为选出入度为 0 的点排, 然后将被选出的点指向的点的入度减 1, 当入度被减到 0 时表示该点可以被选出, 一直循环直到全部点被选出或…

书生大模型实战营-基础关卡-2-8G 显存玩转书生大模型 Demo

Cli Demo 部署 InternLM2-Chat-1.8B 模型 先简单试试 InternLM2-Chat-1.8B 模型的能力 生成 300 字的小故事 我的prompt:写一个300字以内的小故事,故事符合中国特色. 模型输出:故事整体性还是很好的。 在一个小镇上,住着一只名叫小明的猫咪…

基于Dijkstra的校园导游系统

目录 一. 设计目的 二. 设计背景 三. 系统功能 四. 系统算法实现 五. 系统调试与结果分析 六. 完整源代码 一. 设计目的 通过设计并实现校园导游系统,使学生对数据结构有更深入的了解。该系统综合性非常广,能够极大提高学生的设计,编程及…

数据库中的约束,聚合函数以及联合查询

目录 数据库中的约束 not null unique default primary key foreign key 表的设计 聚合函数(查询) 分组 联表查询(多表查询) 内连接 外连接 左外连接 右外连接 自连接 子查询 合并查询 数据库中的约束 为了保证…

用python获取系统的硬件信息(python实例二十九)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.获取系统信息 3.1 代码构思 3.2 代码示例 3.3 运行部分结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的…

计算机组成原理面试-核心概念-问题理解

目录 1.怎么理解计算机组成原理中存储器、控制器、运算器、输入输出设备之间的协作关系和工作流程 2.比、比特等类似几种表示信息存储的单位具体换算 3.介绍计算机的五大功能-数据传送功能、数据存储功能、数据处理功能、操作控制功能、操作判断功能 4.计算机的工作过程/指令…

【Linux基础】Linux基本指令(一)

目录 前言1, ls指令2,pwd指令三,cd指令3.1 当前目录与上级目录3.2 绝对路径和相对路径3.3 tree指令 四,创建一个普通文件或目录4.1 touch指令4.2 mkdir指令 五,删除目录或文件5.1 rmdir指令5.2 rm 指令 六,…

华大基因阿尔茨海默病风险基因检测,助力阿尔茨海默病早预防

中国正面临日益加剧的老龄化挑战。据统计,2020年我国60岁以上的老年人口已达2.6亿,其中轻度认知障碍患者超过3800万,而阿尔茨海默病患者近千万。随着这一趋势的延续,如何早期发现和预防阿尔茨海默病已成为公共卫生领域的重要议题。…

为什么建议从二维向三维GIS开发方向拓展?

GIS开发是地理信息系统领域中一个薪资待遇较高的职业方向,吸引了众多来自测绘、遥感和城市规划等相关专业的学生转型投身于WebGIS开发工作。 那么,今天从技术角度出发,探讨为何鼓励大家超越WebGIS的范畴,继续深入学习三维GIS开发…