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

最近奥运会正在巴黎如火如荼地进行。为了能第一时间获得我国运动健儿的获奖情况,我给大家分享一个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电子书

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

四、入门学习视频全套

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

五、实战案例

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


在这里插入图片描述

如有侵权,请联系删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值