最近奥运会正在巴黎如火如荼地进行。为了能第一时间获得我国运动健儿的获奖情况,我给大家分享一个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
使用微信账号扫码登录以后,会进入 测试号管理
后台页面。
下面简单介绍一下测试号管理界面。
最顶部是 测试号信息
,是测试号的 appID
和 appsecret
。
这两个参数可以用来获取 Access_Token
,后面会用到,请务必保管好,不要泄露。
下面是 接口配置信息
,如果我们的代码需要接收和处理微信主动发来的消息,那么这里需要填入你的 url 和 Token 进行相应配置。由于我们只需要单向给微信推送消息,所以这里用不到,空着即可。
再往下是 测试号二维码
,微信扫码可以关注测试公众号,当前关注的用户列表会显示在右侧。
这里我们可以看到用户的 昵称
和 微信号
。
后续我们给用户推送消息时,需要根据 微信号
来确定具体推送给谁。
再下面是 模板消息接口
,点击新增测试模板
按钮后即可添加需要推送的消息模板。
其中,需要注意的几点:
-
模板标题
是固定文本,不可以设置参数,且长度不超过10
个字符。 -
模板内容
可以设置参数,参数填入格式为{{参数名.DATA}}
,如:
截至{{date.DATA}},我国奖牌获得情况如下:
标签:...,Python,微信,奖牌,接口,奖牌榜,推送,模板
From: https://blog.csdn.net/2401_85855266/article/details/141026859