最新最全巴黎奧運會獎牌數(shù)據(jù)獲取粘室,獲獎分析與展現(xiàn)

1 獲取的數(shù)據(jù)展示

獎牌明細數(shù)據(jù)
基于明細數(shù)據(jù)統(tǒng)計過濾中國金牌數(shù)據(jù)
統(tǒng)計金牌榜

2 實現(xiàn)原理

網(wǎng)上查詢了一圈榄檬,要么是付費接口,要么是殘缺文章衔统,一氣之下自己開發(fā)實現(xiàn)鹿榜,現(xiàn)將核心原理和代碼發(fā)出來,方便需要的朋友锦爵。

原理
通過python爬取遍歷爬取百度獎牌榜舱殿,xpath解析網(wǎng)頁數(shù)據(jù),并將獲取的數(shù)據(jù)清洗入庫到mysql险掀。后面就可以隨心統(tǒng)計展示了沪袭。

數(shù)據(jù)網(wǎng)頁截圖

3核心代碼實現(xiàn)

3.1獲取金牌榜與獲取國家ID數(shù)據(jù)列表

數(shù)據(jù)示例:
{'get_time': '2024-08-09 09:28:04', 'countryAbbr': 'ZAM', 'countryName': '贊比亞', 'delegationId': '151', 'gold': 0, 'silver': 0, 'total': 1, 'rank': 80}
數(shù)據(jù)說明:其中delegationId 為國家id號,gold 金牌數(shù)樟氢,silver 銀牌冈绊,total 獎牌總數(shù)侠鳄,rank 獎牌排名。

代碼實現(xiàn)

def get_current_medalList():
    # 爬取的百度接口URL
    url = 'https://tiyu.baidu.com/al/major/home?page=home&match=2024%E5%B9%B4%E5%B7%B4%E9%BB%8E%E5%A5%A5%E8%BF%90%E4%BC%9A&tab=%E5%A5%96%E7%89%8C%E6%A6%9C'

    # 調(diào)用GET接口
    response = requests.get(url)

    # 調(diào)用POST接口
    # response = requests.post(url, data=data)

    html = etree.HTML(response.text)
    script_json = html.xpath('//script[@type="application/json"]')

    # 金牌數(shù)
    format_medalList = []

    for per in script_json[0:1]:
        json_str = json.loads(per.text)
        medalList = json_str['data']['data']['tabsList'][1]['data']['medalList'][0]
        # 獲取時間
        current_time = json_str['data']['common']['requestStart']
        dt = datetime.datetime.fromtimestamp(current_time / 1000)
        new_dt = dt.strftime('%Y-%m-%d %H:%M:%S')

        # 當前獲取獎牌數(shù)
        for list in medalList:
            format_list = {
                'get_time': new_dt,
                'countryAbbr': list['countryAbbr'],
                'countryName': list['countryName'],
                'delegationId': list['delegationId'],
                'gold': list['gold'],
                'silver': list['silver'],
                'total': list['total'],
                'rank': list['rank']
            }
            print(format_list)
            format_medalList.append(format_list)
            # medalList-seasonList
            # "本屆獎牌榜",
            # "2020東京",
            # "2016里約熱內(nèi)盧",
            # "2012倫敦",
            # "2008北京",
            # "2004雅典",
            # "2000悉尼",
            # "1996亞特蘭大",
            # "1992巴塞羅那"

    return format_medalList

3.2 獲取單個國家(例如:中國 id 為 29)獎牌數(shù)據(jù)明細列表

數(shù)據(jù)示例:
{'id': '1a9a2bfdb9a015662622c4e674ca3d65', 'get_time': '08月08日', 'country': '中國', 'medal': '第28金', 'medalType': 'gold', 'playerName': '羅詩芳', 'smallMatch': '女子59公斤級', 'time': '23:05', 'bigMatch': '舉重'}
數(shù)據(jù)說明: get_time 獲獎日期死宣,time 獲獎時間伟恶,country 國家名字,playerName 運動員名稱

代碼實現(xiàn)

def get_history_medalList(delegationId):
    # 接口URL
    url = 'https://tiyu.baidu.com/al/major/delegation?page=delegation&match=2024%E5%B9%B4%E5%B7%B4%E9%BB%8E%E5%A5%A5%E8%BF%90%E4%BC%9A&tab=%E8%8E%B7%E5%A5%96%E5%90%8D%E5%8D%95&id=' + delegationId

    # 調(diào)用GET接口
    response = requests.get(url)

    # 調(diào)用POST接口
    # response = requests.post(url, data=data)

    html = etree.HTML(response.text)
    script_json = html.xpath('//script[@type="application/json"]')

    output_data = []

    for per in script_json[0:1]:
        json_str = json.loads(per.text)
        # 0 賽程 1 獲獎名單 2 運動員
        tabData = json_str['data']['data']['tabsList'][1]['data'][0]['tabData']

        # print(tabData)

        # 當前獲取獎牌數(shù)
        for perdata in tabData:
            date_str = perdata['date']
            for data in perdata['dateList']:
                format_data = {
                    "id": hashlib.md5(str(date_str + data["country"] + data["playerName"]).encode('utf-8')).hexdigest(),
                    "get_time": date_str,
                    "country": data["country"],
                    "medal": data["medal"],
                    "medalType": data["medalType"],
                    "playerName": data["playerName"],
                    "smallMatch": data["smallMatch"],
                    "time": data["time"],
                    "bigMatch": data["bigMatch"]
                }
                print(format_data)
                output_data.append(format_data)

        return output_data

放回的html數(shù)據(jù)相對比較復(fù)雜毅该,結(jié)構(gòu)嵌套層數(shù)較多知押。程序代碼中已經(jīng)實現(xiàn)了解析過程,可忽略解析過程鹃骂,直接摘取果實享用台盯。

3.3 獎牌數(shù)據(jù)明細寫入關(guān)系型數(shù)據(jù)庫,mysql

基于明細數(shù)據(jù)創(chuàng)建mysql表單
明細數(shù)據(jù)示例:{'id': '1a9a2bfdb9a015662622c4e674ca3d65', 'get_time': '08月08日', 'country': '中國', 'medal': '第28金', 'medalType': 'gold', 'playerName': '羅詩芳', 'smallMatch': '女子59公斤級', 'time': '23:05', 'bigMatch': '舉重'}

mysql DDL參考:

-- colin.paris_2024 definition

CREATE TABLE `paris_2024` (
  `id` varchar(100) NOT NULL,
  `get_time` varchar(100) DEFAULT NULL,
  `country` varchar(100) DEFAULT NULL,
  `medal` varchar(100) DEFAULT NULL,
  `medalType` varchar(100) DEFAULT NULL,
  `playerName` varchar(100) DEFAULT NULL,
  `smallMatch` varchar(100) DEFAULT NULL,
  `time` varchar(100) DEFAULT NULL,
  `bigMatch` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

代碼實現(xiàn)

def import_mysql(data_list):

    host = 'your ip addr'
    port = 3306
    dbName = 'databasesName'
    user = 'user'
    password = 'yourPassword'
    db = pymysql.connect(host=host, port=port, user=user, passwd=password, db=dbName, charset='utf8')
    # 創(chuàng)建一個游標對象畏线,通過游標對象來進行數(shù)據(jù)的增刪改查静盅。
    cursor = db.cursor()
    num = 0

    for data in data_list:
        id = data['id']
        get_time = data['get_time']
        country = data['country']
        medal = data['medal']
        medalType = data['medalType']
        playerName = data['playerName']
        smallMatch = data['smallMatch']
        time_data = data['time']
        bigMatch = data['bigMatch']

        # 構(gòu)造insert into 語句,使用到了format 占位符
        sql = "replace INTO colin.paris_2024(id, get_time, country, medal, medalType, playerName, smallMatch, `time`, bigMatch)VALUES('{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}')".format(id, get_time, country, medal, medalType, playerName, smallMatch, time_data, bigMatch)
        # print("當前時間戳===", sql)
        cursor.execute(sql)
        num=num+1
        #提交事務(wù)
    db.commit()
    cursor.close()
    db.close()
    print("輸入條數(shù)",num)

4 各個代碼塊調(diào)用main

需要python包

import json
import requests
from lxml import etree
import datetime
import hashlib
import pymysql

main 函數(shù)

import json
import requests
from lxml import etree
import datetime
import hashlib
import pymysql

def  3.1 核心函數(shù)(copy到此)
def  3.2 核心函數(shù)(copy到此)
def  3.3 核心函數(shù)(copy到此)

if __name__ == '__main__':
    # 獲取當天數(shù)據(jù)寝殴,包含delegationId
    format_medalList = get_current_medalList()
    all_data=[]

    # 遍歷獲取歷史數(shù)據(jù)
    for medalList in format_medalList:
        delegationId = medalList['delegationId']

        # print(delegationId)
        # 遍歷國家 獲獎信息

        output_data = get_history_medalList(delegationId)
        all_data.extend(output_data)

    # 寫入數(shù)據(jù)庫
    import_mysql(all_data)

    print("寫入完成")

以上是整個巴黎奧運會獎牌數(shù)據(jù)獲取實現(xiàn)原理和明細代碼蒿叠。
感謝給個關(guān)注,點個贊蚣常!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末市咽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子抵蚊,更是在濱河造成了極大的恐慌施绎,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贞绳,死亡現(xiàn)場離奇詭異谷醉,居然都是意外死亡,警方通過查閱死者的電腦和手機冈闭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門俱尼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人萎攒,你說我怎么就攤上這事遇八。” “怎么了耍休?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵刃永,是天一觀的道長。 經(jīng)常有香客問我羹应,道長揽碘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮雳刺,結(jié)果婚禮上劫灶,老公的妹妹穿的比我還像新娘。我一直安慰自己掖桦,他們只是感情好本昏,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枪汪,像睡著了一般涌穆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雀久,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天宿稀,我揣著相機與錄音,去河邊找鬼赖捌。 笑死祝沸,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的越庇。 我是一名探鬼主播罩锐,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼卤唉!你這毒婦竟也來了涩惑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤桑驱,失蹤者是張志新(化名)和其女友劉穎竭恬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碰纬,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡萍聊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年问芬,在試婚紗的時候發(fā)現(xiàn)自己被綠了悦析。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡此衅,死狀恐怖强戴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挡鞍,我是刑警寧澤骑歹,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站墨微,受9級特大地震影響道媚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一最域、第九天 我趴在偏房一處隱蔽的房頂上張望谴分。 院中可真熱鬧,春花似錦镀脂、人聲如沸牺蹄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沙兰。三九已至,卻和暖如春翘魄,著一層夾襖步出監(jiān)牢的瞬間鼎天,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工暑竟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留训措,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓光羞,卻偏偏與公主長得像绩鸣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纱兑,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容