吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3821|回复: 40
收起左侧

[Python 转载] python获取东京奥运会金牌排行榜及获奖人员并部署云函数每天邮件发送

  [复制链接]
致远啊 发表于 2021-7-26 12:57

python获取东京奥运会金牌排行榜及获奖人员

前言

别人的00后,征战奥运会,我的00后,在家睡大觉。

作为编程爱好者,刚刚用 python 写了查询奥运会金牌排行榜,并通过云函数发送邮件,查看每天实时数据的小功能,为奥运会做些力所能及的事,助力奥运,中国加油!

image-20210726115236399

排行榜代码

央视网官网数据

金牌排行榜:https://2020.cctv.com/medal_list/

中国奖牌榜获得者:https://2020.cctv.com/medal_list/details/index.shtml?spm=0.Pe9yiMu0gzhD.ES3pdHUFxT0w.1&countryid=CHN

截止到目前(2021年7月26日11:48),东京奥运会比赛第三天,我国金牌6,银牌2,铜牌5,名次第一!

image-20210726114935554

image-20210726115002712

图中"跳水女子双人3米跳板"项目金牌获得者是:施廷懋/王涵夺

通过央网链接,打开F12,分析发现两个链接获取数据

话不多说,上代码

medals.py

import requests
import json

def getMedalsList(url, replaceTxt):
    try:
        r = requests.get(url)
        r.raise_for_status()
        r.encoding = r.apparent_encoding

        # 替换多余的内容
        data = str.replace(r.text, replaceTxt + "(", "")
        data = str.replace(data, ");", "")
        # 解码json,转成字典
        medals = json.loads(data)

        return medals

    except:
        return "Failed!"

# 获取排行榜数据
def getRanking():
    url = "https://api.cntv.cn/olympic/getOlyMedals?serviceId=pcocean&itemcode=GEN-------------------------------&t=jsonp&cb=omedals1"
    medals = getMedalsList(url, "omedals1")
    # 获取数据列表
    medalList = medals['data']['medalsList']
    res = ""
    for i in range(5):
        res += "第" + medalList[i]["rank"] + "名:" + medalList[i]["countryname"] + "(" + medalList[i]["countryid"] + ")\n"
        res += "金牌/银牌/铜牌:" + medalList[i]["gold"] + "/" + medalList[i]["silver"] + "/" + medalList[i]["bronze"] + "\n\n"
    return res

# 中国奖牌获得者数据
def getWinners():
    url = "https://api.cntv.cn/Olympic/getOlyMedalList?t=jsonp&cb=OM&serviceId=pcocean&countryid=CHN"
    owners = getMedalsList(url, "OM")
    # 获取数据列表
    ownerList = owners['data']['medalList']
    gold = ""  # 金牌
    silver = ""  # 银牌
    bronze = ""  # 铜牌
    for owner in ownerList:
        medaltype = owner['medaltype']  # 奖牌类型
        startdatecn = owner['startdatecn']  # 日期CN
        item = owner['itemcodename'] + " " + owner['subitemname']  # 项目
        playname = owner['playname']  # 运动员
        if medaltype == "ME_GOLD":
            gold += "日期:" + startdatecn + "\n项目:" + item + "\n获得者:" + playname+"\n\n"
        elif medaltype == "ME_SILVER":
            silver += "日期:" + startdatecn + "\n项目:" + item + "\n获得者:" + playname+"\n\n"
        elif medaltype == "ME_BRONZE":
            bronze += "日期:" + startdatecn + "\n项目:" + item + "\n获得者:" + playname+"\n\n"

    res = "\n-------金牌:---------\n" + gold+"\n-------银牌:---------\n" + silver+"\n-------铜牌:---------\n"+ bronze
    return res

if __name__ == '__main__':
    print(getRanking())
    print(getWinners())

输出结果:

image-20210726102903905

发送邮件代码

mail.py

import smtplib
from email.mime.text import MIMEText
from email.header import Header
from medals import getWinners, getRanking

def sendmail():
    sender = '*****@qq.com'  # 发送邮箱
    senderName = "致远"  # 发送者昵称
    password = '*****'  # 发送方QQ邮箱授权码
    receivers = ['*****@qq.com',"*****@qq.com"]  # 接收邮件

    # 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
    str = getRanking() + getWinners()
    message = MIMEText(str, 'plain', 'utf-8')
    message['From'] = Header(senderName, 'utf-8')  # 发送者昵称

    # 主题
    subject = '东京奥运会金牌排行榜及获奖人员'
    message['Subject'] = Header(subject, 'utf-8')

    try:
        client = smtplib.SMTP_SSL('smtp.qq.com', smtplib.SMTP_SSL_PORT)
        print("连接到邮件服务器成功")

        client.login(sender, password)
        print("登录成功")

        client.sendmail(sender, receivers, message.as_string())
        print("邮件发送成功")
    except smtplib.SMTPException:
        print("Error: 无法发送邮件")

if __name__ == '__main__':
    sendmail()

部署云函数方法

登录阿里云,找到函数计算 FC :https://fc.console.aliyun.com/

1、创建服务及函数,选择python环境

2、上传两个代码文件,medals.py 和 mail.py

3、编辑 index.py

# -*- coding: utf-8 -*-
import logging
from mail import sendmail

# To enable the initializer feature (https://help.aliyun.com/document_detail/158208.html)
# please implement the initializer function as below:
# def initializer(context):
#   logger = logging.getLogger()
#   logger.info('initializing')

def handler(event, context):
    sendmail()

在 “触发器” 中可选择定时触发器,具体操作可查看官方文档

免费评分

参与人数 8吾爱币 +8 热心值 +7 收起 理由
kvttt_2021 + 1 + 1 我很感谢楼主!!!
georgefan + 1 + 1 我很赞同!
QZGF + 1 + 1 学习学习
QingYi. + 3 我来学习
zzzj + 1 我很赞同!
hj170520 + 1 + 1 热心回复!
hshcompass + 1 + 1 我很赞同!
user13 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Harry132 发表于 2021-7-28 08:02
我觉得最好的学习方法就是自己先按照自己的想法写代码,然后和楼主的对比,这样就能发现差距,然后有针对性地提升。看到题干,自己先做题,再对答案,嘿嘿

免费评分

参与人数 1吾爱币 +1 收起 理由
QingYi. + 1 这是正确的

查看全部评分

头像被屏蔽
源啊呢哈 发表于 2021-8-1 22:30
busyjie 发表于 2021-7-26 14:59
lcllfj233 发表于 2021-7-26 15:21
顶顶顶,这个好,支持楼主
kim3352 发表于 2021-7-26 15:31
666,与时俱进
279826138 发表于 2021-7-26 15:31
不错不错,这个很好。
j717013225 发表于 2021-7-26 15:32
学习的路上,不知道多久能达到这个水平
wtflxk 发表于 2021-7-26 15:37
小伙子真帅,
MHao008 发表于 2021-7-26 16:21
速度真快
zhpsxq 发表于 2021-7-26 16:42
科技回报社会,你已经很厉害了!能够运用于当前实际问题!
hshcompass 发表于 2021-7-26 17:43

酷,支持一个
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 15:14

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表