首页 > 编程语言 >Python爬虫实战:实时微信推送奥运奖牌榜信息

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

时间:2024-08-08 14:52:12浏览次数:15  
标签:... 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}},我国奖牌获得情况如下: 

标签:...,Python,微信,奖牌,接口,奖牌榜,推送,模板
From: https://blog.csdn.net/2401_85855266/article/details/141026859

相关文章

  • 基于Python实现可视化分析中国500强排行榜数据的设计与实现
    基于Python实现可视化分析中国500强排行榜数据的设计与实现“DesignandImplementationofVisualAnalysisforChina’sTop500CompaniesRankingDatausingPython”完整下载链接:基于Python实现可视化分析中国500强排行榜数据的设计与实现文章目录基于Python......
  • 【uniapp】uniapp+vue2微信小程序实现分享功能
    uniapp+vue2做的微信小程序实现分享功能问题描述uniapp+vue2做的微信小程序,发布以后点击右上角三个点,分享小程序的时候,转发和分享按钮都是灰色解决方案转发、分享、复制链接这几个功能需要自己来手动写方法,考虑到每个页面都需要能够实现分享功能,以下我会使用Vue.js的......
  • python使用selenium和PyPDF2保存多个html页面为pdf
    检索资料时看到比较完备的资料,想着要把所有页面保存下来。正好使用下requests和BeautifulSoup库获取和解析所有的静态页,把静态页保存为单个pdf文件,然后再把所有的pdf文件合并起来生成1个PDF文档。本来想使用python子进程调用wkhtmltopdf工具把静态页生成为单个pdf,然而如此一来pdf......
  • Python编码规范常用技巧
    Python编码规范常用技巧开场白:Python编码规范的艺术从一团乱麻到井然有序:我的Python代码进化史PEP8:Python编码规范的圣经为什么遵循编码规范如此重要命名约定:给你的代码起个好名字变量名:不只是标识符那么简单函数命名:让意图一目了然类与方法:面向对象的命名艺术代码结......
  • Python实现游戏中的音效制作与环境声音设计
    Python实现游戏中的音效制作与环境声音设计开场白:让声音活起来——游戏音频的魅力为什么游戏中的声音如此重要?个人体验分享:那些让人难忘的游戏音效Python在音频处理中的应用概览基础篇:Python环境搭建与音频库介绍快速入门:安装Python及必备音频处理库库推荐:pydub、soundf......
  • ASP.NET CORE微信支付回调示例代码
    ASP.NETCORE微信支付回调示例代码 ///<summary>///接收微信支付异步通知///</summary>///<returns></returns>publicasyncTask<ActionResult>NotifyUrl(){//读取请求体中的数据/*......
  • python拆分PDF文件
    先占个空,后面在慢慢更新下面这个代码实现讲一个PDF文件拆分成多个文件importPyPDF2defsplit_pdf(input_pdf_path,output_prefix,start_page,end_page):"""分割PDF文件为多个小的PDF文件,每个文件包含原始文档的一部分页面。:paraminput_pdf_path:输入......
  • Python动态执行代码
    在Python中,动态执行代码是一个强大的特性,它允许程序在运行时编译和执行字符串或存储在文件、数据库等中的代码。这种能力使得Python在需要高度灵活性和动态性的应用中特别有用,比如科学计算、数据分析、Web开发以及自动化脚本等。下面,我将详细介绍Python中动态执行代码的几种......
  • 在Python中,模块(Module)和包(Package)
    在Python中,模块(Module)和包(Package)是组织代码、提高代码复用性、促进代码维护的两种重要机制。它们各自扮演着不同的角色,但又紧密相连,共同构成了Python程序架构的基础。以下将详细阐述Python中模块和包的概念及其区别。一、模块(Module)的概念在Python中,模块是一个包含了Pyth......
  • 工地安全帽智能识别系统 Python
    工地安全帽智能识别系统通过AI深度学习技术,工地安全帽智能识别系统实现对工地人员的安全帽反光衣穿戴进行自动实时识别和检测,当工地安全帽智能识别系统发现现场人员违规未按要求戴安全帽反光衣及不安全行为时,不需人为干预,工地安全帽智能识别系统自动抓拍触发告警,提醒安全管理人......