最近奥运会正在巴黎如火如荼地进行。为了能第一时间获得我国运动健儿的获奖情况,我给大家分享一个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}},我国奖牌获得情况如下:
🥇金牌:{{gold_num.DATA}}
🥈银牌:{{silver_num.DATA}}
🥉铜牌:{{bronze_num.DATA}}
总奖牌数:{{total_num.DATA}}
当前排名:{{rank_index.DATA}}
-
参数名可以自定义,只要跟调用接口处传递的参数名一致即可。
-
模板提交以后,就不能编辑了,如果需要修改,可以删除以后重新添加。
-
每个消息模板会有一个
模板ID
,用于接口调用。 -
暂时想到这么些,如果遇到其他问题了可以找我交流。
最后是 体验接口权限表
,显示了各种类目和功能的接口,以及每日调用限制。并且附带有接口的详细使用说明。
关于python技术储备
由于文章篇幅有限,文档资料内容较多,需要这些文档的朋友,可以加小助手微信免费获取,【保证100%免费】,中国人不骗中国人。
**(扫码立即免费领取)**
全套Python学习资料分享:
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,还有环境配置的教程,给大家节省了很多时间。
三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
四、入门学习视频全套
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
五、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
如有侵权,请联系删除。