基于Flask+Bootstrap+机器学习的世界杯比赛预测系统

news2024/11/27 3:57:53

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


目录

一、项目介绍

1.1项目简介

1.2技术工具

1.3页面概述 

二、项目步骤

2.1首页模块

2.2查看历年数据板块

2.3预测板块

2.4app.py

三、项目总结


一、项目介绍

1.1项目简介

         本项目使用Flask框架搭建基于机器学习的世界杯比赛预测系统 (简易版)

其中关于Flask知识点可参考文章Flask全套知识点从入门到精通,学完可直接做项目

关于基于机器学习的世界杯比赛预测模型可参考文章基于决策树算法构建世界杯比赛预测模型 

整个项目分为以下几个模块:

  • 1.首页板块
  • 2.展示往届数据板块
  • 3.预测球队胜率板块

项目文件框架如下:

其中manager.py为主程序,password.csv为存储用户账号密码的文件,lianjia是房租价格原始数据集,model.pkl是经过机器学习算法训练出的模型。 

1.2技术工具

IDE编辑器:vscode

后端框架:Flask

前端框架:Bootstrap

1.3页面概述 

运行app.py程序后,浏览器打开http://127.0.0.1:5000/

映入眼帘的就是首页板块,主要就是项目的名称。

 点击导航栏中的查看历年数据页面

 点击导航栏中的预测胜率页面

 在预测页面输入两只球队的名称即可进行预测,比如我这里让他预测阿根廷VS法国的胜率

输入名称后点击预测出现以下预测结果

Chance for Argentina to win France is 48.31226915281593
Chance for France to win Argentina is 30.51025652600164
Chance for Argentina and France draw is 21.17747432118242
 

第一行表示阿根廷赢法国的概率为48.31%

第二行表示法国赢阿根廷的概率为30.51%

第三行表示阿根廷和法国平局的概率为21.18%

二、项目步骤

2.1首页模块

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>首页</title>
    <link rel="stylesheet" href="../static/bootstrap.min.css">
    <link rel="stylesheet" href="../static/main.css">

</head>
<body>
    <div class="container">
        <nav class="navbar navbar-expand-lg navbar-light bg-light">
            <a class="navbar-brand" >首页</a>
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
              <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
              <div class="navbar-nav">
                <a class="nav-link" href="{{url_for('display_data')}}">查看历年数据</a>
                <a class="nav-link" href="{{url_for('my_predict')}}">预测胜率</a>
              </div>
            </div>

          </nav>
          <h1 style="margin-top: 200px;margin-left: 230px;">基于机器学习算法的世界杯比赛预测系统</h1>
    </div>
</body>
</html>

2.2查看历年数据板块

display_data.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>查看历年数据</title>
    <link rel="stylesheet" href="../static/bootstrap.min.css">
    <link rel="stylesheet" href="../static/main.css">
</head>
<body>
    <div class="container">
        <nav class="navbar navbar-expand-lg navbar-light bg-light">
            <a class="navbar-brand" href="{{url_for('index')}}">首页</a>
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
              <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
              <div class="navbar-nav">
                <a class="nav-link active" href="{{url_for('display_data')}}">查看历年数据</a>
                <a class="nav-link" href="{{url_for('my_predict')}}">预测胜率</a>
                
              </div>
            </div>
          </nav>
          <div>
            <section class="counts section-bg">
              <div class="container">
                <table class="table text-nowrap">
                  <tr class="text-center">
                    <td>Year</td>
                    <td>HostCountry</td>
                    <td>Winner</td>
                    <td>Second</td>
                    <td>Third</td>
                    <td>Fourth</td>
                    <td>GoalsScored</td>
                    <td>QualifiedTeams</td>
                    <td>MatchesPlayed</td>
                  </tr>
                  {% for data in datas %}
                  <tr class="text-center">
                    <td>{{ data.Year }}</td>
                    <td>{{ data.HostCountry }}</td>
                    <td>{{ data.Winner }}</td>
                    <td>{{ data.Second }}</td>
                    <td>{{ data.Third }}</td>
                    <td>{{ data.Fourth }}</td>
                    <td>{{ data.GoalsScored }}</td>
                    <td>{{ data.QualifiedTeams }}</td>
                    <td>{{ data.MatchesPlayed }}</td>
                  </tr>
                  {% endfor %}
                </table>
              </div>
            </section><!-- End Counts Section -->
          </div>
    </div>
</body>
</html>

2.3预测板块

predict.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>预测胜率</title>
    <link rel="stylesheet" href="../static/bootstrap.min.css">
    <link rel="stylesheet" href="../static/main.css">
</head>
<body>
    <div class="container">
        <nav class="navbar navbar-expand-lg navbar-light bg-light">
            <a class="navbar-brand" href="{{url_for('index')}}">首页</a>
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
              <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
              <div class="navbar-nav">
                <a class="nav-link" href="{{url_for('display_data')}}">查看历年数据</a>
                <a class="nav-link active" href="{{url_for('my_predict')}}">预测胜率</a>
              </div>
            </div>
          </nav>

          <div class="container-fluid">
            <div class="row">
              <div class="col col-lg-2">
               
              </div>
              <div class="col-md-auto">
                  <form action="/predict/" method="post">
                    <div class="form-group row">
                        <label for="inputPassword" class="col-sm-6 col-form-label">请输入球队1:</label>
                        <div class="col-sm-8">
                          <input type="text" placeholder="Uruguay/Italy/Brazil/..." name="team1" class="form-control">
                        </div>
                      </div>
                    <div class="form-group row">
                        <label for="inputPassword" class="col-sm-6 col-form-label">请输入球队2:</label>
                        <div class="col-sm-8">
                          <input type="text" placeholder="Uruguay/Italy/Brazil/..." name="team2" class="form-control">
                        </div>
                      </div>
                  
                    <button style="margin-left: 10px;" type="submit" class="btn btn-primary">预测</button>
                  </form>
                  {% if error %}
                  <font color="red">{{ error }}</font>
                  {% endif %}
                  {% if prob1 %}
                  <font color="red">
                    预测的结果为:
                  </font>
                  <br>
                  <font color="red">
                    Chance for {{ team1 }} to win {{ team2 }} is {{ prob1 }}
                  </font>
                  <br>
                  <font color="red">
                    Chance for {{ team2 }} to win {{ team1 }} is {{ prob2 }}
                  </font>
                  <br>
                  <font color="red">
                    Chance for {{ team1 }} and {{ team2 }} draw is {{ prob3 }}
                  </font>
                  {% endif %}
              </div>
              <div class="col col-lg-2">
                
              </div>
            </div>
          </div>
    </div>
</body>
</html>

2.4app.py

from flask import Flask,render_template,views,request
import pandas as pd
import numpy as np 
from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from sklearn.svm import SVC
import warnings
warnings.filterwarnings('ignore')
app = Flask(__name__)

@app.route('/')
def index():  
    return render_template('index.html')

@app.route('/display_data')
def display_data(): 
    WorldCupsSummary = pd.read_csv('WorldCupsSummary.csv')
    datas = []
    for item in WorldCupsSummary.values:
        data = {}
        data['Year'] = item[0]
        data['HostCountry'] = item[1]
        data['Winner'] = item[2]
        data['Second'] = item[3]
        data['Third'] = item[4]
        data['Fourth'] = item[5]
        data['GoalsScored'] = item[6]
        data['QualifiedTeams'] = item[7]
        data['MatchesPlayed'] = item[8]
        datas.append(data) 
    return render_template('display_data.html',datas=datas)

class PredictView(views.MethodView):    
    def __jump(self,prob1=None,prob2=None,prob3=None,error=None,team1=None,team2=None):      
        return render_template('predict.html',prob1=prob1,prob2=prob2,prob3=prob3,error=error,team1=team1,team2=team2)    
    def get(self, result=None,error=None):        
        return self.__jump()    
    def post(self):
        # 导入数据
        matches = pd.read_csv('WorldCupMatches.csv')
        players = pd.read_csv('WorldCupPlayers.csv')
        cups = pd.read_csv('WorldCupsSummary.csv')
        # 删除缺失值
        matches = matches.dropna()
        players = players.dropna()
        cups = cups.dropna()
        # 用德国取代德国DR和德国FR,用俄罗斯取代苏联
        def replace_name(df):
            if(df['Home Team Name'] in ['German DR', 'Germany FR']):
                df['Home Team Name'] = 'Germany'
            elif(df['Home Team Name'] == 'Soviet Union'):
                df['Home Team Name'] = 'Russia'
            if(df['Away Team Name'] in ['German DR', 'Germany FR']):
                df['Away Team Name'] = 'Germany'
            elif(df['Away Team Name'] == 'Soviet Union'):
                df['Away Team Name'] = 'Russia'
            return df
            
        matches = matches.apply(replace_name, axis='columns')
        # 创建一个存储足球队的字典
        team_name = {}
        index = 0
        for idx, row in matches.iterrows():
            name = row['Home Team Name']
            if(name not in team_name.keys()):
                team_name[name] = index
                index += 1
            name = row['Away Team Name']
            if(name not in team_name.keys()):
                team_name[name] = index
                index += 1
        # 删除不必要的列
        dropped_matches = matches.drop(['Datetime', 'Stadium', 'Referee', 'Assistant 1', 'Assistant 2', 'RoundID',
                    'Home Team Initials', 'Away Team Initials', 'Half-time Home Goals', 'Half-time Away Goals',
                    'Attendance', 'City', 'MatchID', 'Stage'], 1)
        # 计算每支球队成为世界杯赛冠军的次数
        championships = cups['Winner'].map(lambda p: 'Germany' if p=='Germany FR' else p).value_counts()
        # 加上“主队冠军”和“客场冠军”:获取世界杯冠军的次数
        dropped_matches['Home Team Championship'] = 0
        dropped_matches['Away Team Championship'] = 0
        def count_championship(df):
            if(championships.get(df['Home Team Name']) != None):
                df['Home Team Championship'] = championships.get(df['Home Team Name'])
            if(championships.get(df['Away Team Name']) != None):
                df['Away Team Championship'] = championships.get(df['Away Team Name'])
            return df

        dropped_matches = dropped_matches.apply(count_championship, axis='columns')
        # 定义一个函数用于找出谁赢了:主场胜:1,客场胜:2,平局:0
        dropped_matches['Winner'] = '-'
        def find_winner(df):
            if(int(df['Home Team Goals']) == int(df['Away Team Goals'])):
                df['Winner'] = 0
            elif(int(df['Home Team Goals']) > int(df['Away Team Goals'])):
                df['Winner'] = 1
            else:
                df['Winner'] = 2
            return df
        dropped_matches = dropped_matches.apply(find_winner, axis='columns')
        # 将team_name字典中的团队名称替换为id
        def replace_team_name_by_id(df):
            df['Home Team Name'] = team_name[df['Home Team Name']]
            df['Away Team Name'] = team_name[df['Away Team Name']]
            return df
        teamid_matches = dropped_matches.apply(replace_team_name_by_id, axis='columns')
        # 删除不必要的列
        teamid_matches = teamid_matches.drop(['Year', 'Home Team Goals', 'Away Team Goals'], 1)
        X = teamid_matches[['Home Team Name', 'Away Team Name', 'Home Team Championship','Away Team Championship']]
        X = np.array(X).astype('float64')
        # 附加数据:只需将“主队名称”替换为“客场球队名称”,将“主队冠军”替换为“客场球队冠军”,然后替换结果
        _X = X.copy()
        _X[:,0] = X[:,1]
        _X[:,1] = X[:,0]
        _X[:,2] = X[:,3]
        _X[:,3] = X[:,2]
        y = dropped_matches['Winner']
        y = np.array(y).astype('int')
        y = np.reshape(y,(1,850))
        y = y[0]
        _y = y.copy()
        for i in range(len(_y)):
            if(_y[i]==1):
                _y[i] = 2
            elif(_y[i] ==2):
                _y[i] = 1     
        X = np.concatenate((X,_X), axis= 0)
        y = np.concatenate((y,_y))
        # 打乱数据,然后拆分数据集为训练集和测试集
        X,y = shuffle(X,y)
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)
        # 用SVM支持向量机模型进行训练
        svm_model = SVC(kernel='rbf', class_weight='balanced', probability=True)
        svm_model.fit(X_train, y_train)
        # 定义一个预测函数,需要传递两个球队名称,输出两个获胜的概率
        def prediction(team1, team2):
            id1 = team_name[team1]
            id2 = team_name[team2]
            championship1 = championships.get(team1) if championships.get(team1) != None else 0
            championship2 = championships.get(team2) if championships.get(team2) != None else 0
            x = np.array([id1, id2, championship1, championship2]).astype('float64')
            x = np.reshape(x, (1,-1))
            _y = svm_model.predict_proba(x)[0]
            return _y[1]*100,_y[2]*100,_y[0]*100
        try:
            team1 = request.form['team1']      
            team2 = request.form['team2']     
            # 预测比赛
            prob1, prob2, prob3 = prediction(team1, team2)       
            return self.__jump(prob1=prob1,prob2=prob2,prob3=prob3,team1=team1,team2=team2) 
        except Exception as e:
            print(EnvironmentError)
            return self.__jump(error='输入数据格式不对,请重新输入!')        
    

app.add_url_rule('/predict/',view_func=PredictView.as_view('my_predict'))


if __name__ == '__main__':
    app.run(debug=True)

三、项目总结

        本次我们使用了Flask框架结合了基于机器学习的世界杯比赛预测模型,构建了一个简易版基于机器学习的世界杯比赛预测系统,整个项目还有很多地方可以优化,比如页面美化、模块添加等等,这些就留给学习的小伙伴根据自身需求进行创新升级!喜欢本项目的话就三连支持一下啦!

心得与体会:

通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。原先,学的时候感叹学的资料太难懂,此刻想来,有些其实并不难,关键在于理解。

在这次实战中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自我动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等

在此次实战中,我还学会了下面几点工作学习心态:

1)继续学习,不断提升理论涵养。在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。

2)努力实践,自觉进行主角转化。只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。

3)提高工作用心性和主动性。实习,是开端也是结束。展此刻自我面前的是一片任自我驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。

这次Python实战不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/662390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生安全 - 构建强大的安全基石保障现代化应用

导言&#xff1a; 随着云原生技术的兴起和广泛应用&#xff0c;越来越多的企业将其应用于现代化应用开发和部署。然而&#xff0c;随之而来的安全威胁也随之增加。在这篇文章中&#xff0c;我们将探讨云原生安全的重要性&#xff0c;以及如何构建强大的安全基石来保障现代化应…

hdfs的透明加密记录

1、背景 我们知道&#xff0c;在hdfs中&#xff0c;我们的数据是以block块存储在我们的磁盘上的&#xff0c;那么默认情况下&#xff0c;它是以密文存储的&#xff0c;还是以明文存储的呢&#xff1f;如果是明文存储的&#xff0c;那么是否就不安全呢&#xff1f;那么在hdfs中…

python3 爬虫相关学习10:RE 库/ regex /regular experssion正则表达式学习

目录 1 关于&#xff1a;re / regex / regular expression 1.1 什么是正则表达式 1.2 在python中安装正则模块 1.2.1 python里一般都默认安装了 re正则模块&#xff0c;可以先查看确认下 1.2.2 如果没有安装&#xff0c;可以按照正则库regex, pip install regex 1.3 …

基于PHP的学生管理系统

前言 基于PHP的学生管理系统&#xff1b; 实现 登录、注册、学生信息、修改学生、删除学生、查询学生、添加学生等功能 &#xff1b; 环境准备 开发平台&#xff1a;PhpStrom2022.1.2 、Phpstudy_pro 数据库&#xff1a;MySQL5.7.26 技术架构 Bootstrap PHP7.3.4html5css3 项目…

SpringBoot中配置Https入门

一、生成一个https证书 我们使用Java自带的JDK管理工具keytool来生成一个免费的https证书&#xff0c;在我们的Java安装目录下&#xff0c;在bin目录下我们使用cmd启动命令行窗口,执行如下命令生成一个https证书。 keytool -genkey -alias myhttps -keyalg RSA -keysize 2048…

计算机网络 01 IP协议

01.IP协议&#xff0c;也就是IP报文。 宏观&#xff1a; 首部长度&#xff1a;由于固定部分是20B&#xff0c;所以数值最小是5。 02.IP报文&#xff0c;中的IP地址&#xff0c;常见的是IPV4&#xff0c;也就是四个字节&#xff0c;32位。 常见的IP地址有三种&#xff1a; 第一…

在 Python 中使用requests模块发布表单数据

文章目录 使用 requests 模块在 Python 中发布表单数据POST请求方式介绍在 Python 中安装 requests 模块post() 方法的应用 本篇文章介绍了 Python requests 模块&#xff0c;并说明了我们如何使用该模块在 Python 中发布表单数据。 使用 requests 模块在 Python 中发布表单数据…

由浅入深,详解ViewModel那些事

前言&#xff1a;今年的龙舟雨来了&#xff0c;一场接一场&#xff0c;雨量很大。 前言 以往如果需要在 Activity 或者 Fragment 中保存数据状态则需要重写onSaveInstanceState &#xff0c;使用bundle去存储相应的数据和状态&#xff0c;但是这也只能保存轻量简单的序列化数据…

【STM32】软件I2C

【STM32】软件I2C I2C简介 I2C总线是一种串行、半双工的总线&#xff0c;主要用于近距离、低速的芯片之间的通信。I2C总线有两根双向的信号线&#xff0c;一根数据线SDA用于收发数据&#xff0c;一根时钟线SCL用于通信双方时钟的同步。 在一个i2c通讯总线中&#xff0c;可连接…

怎么显示文件后缀名?查看文件后缀名可以这样做!

案例&#xff1a;在我的电脑上&#xff0c;看不到文件的后缀名&#xff0c;这会导致命名时出现重复文件后缀的情况&#xff0c;给我带来了不好的体验。怎么才能看到文件的后缀名呢&#xff1f;如何操作&#xff1f; 在日常使用电脑的过程中&#xff0c;我们经常需要查看文件的…

实习记录(二)Java常用工具库

一.Lombok 1.背景概述 Lombok是一个非常高效的专用于Java的自动构建插件库&#xff0c;其简化了 JavaBean 的编写&#xff0c;避免了冗余和样板式代码的出现&#xff0c;让编写的类更加简洁明了&#xff0c;可以帮助大家节省很多重复低效的代码编写。比如重复性的Setter、Gett…

【c语言】五道经典练习题④

目录 ①、年月日经过n天后的日期 ②、坐标排序 ③、统计文件中出现某个单词的次数 ④、输出含for的行 ⑤、比较两个文本是否相等 ①、年月日经过n天后的日期 题述&#xff1a;定义包含年月日表示的日期的结构体&#xff0c;写程序实现计算某年某月某日过n天后的日期是哪年…

肠道细菌阻碍阿卡波糖的降血糖作用

我们知道&#xff0c;口服抗糖尿病药是治疗糖尿病的有效方式之一。然而&#xff0c;患者对抗糖尿病药的反应程度各不相同&#xff0c;例如&#xff0c;有些患者在长期使用阿卡波糖后会产生耐药性。 阿卡波糖通常在饭前口服。它抑制人α-葡萄糖苷酶达到降血糖作用&#xff0c;包…

GWO-VMD-近似熵-极限学习机的轴承故障诊断软件,以西储大学轴承数据为例,采用MATLABAPP开发

采用灰狼算法优化VMD两个参数&#xff0c;以包络熵为最小适应度值&#xff0c;在最佳参数下提取采用近似熵指标提取西储大学轴承数据的特征向量&#xff0c;最后选用极限学习机ELM进行故障诊断。将以上程序集成在MATLABAPP进行开发。 首先是这个软件的各个界面展示。 软件启动…

云安全技术(四)之云计算安全的设计原则

计算安全的设计原则 Understand Design Principles of Secure Cloud Computing 1.1 云安全数据生命周期 Cloud secure data lifecycle 数据始终是安全保护的首要问题。必须深刻了解数据生命周期&#xff0c;以便正确制定和遵守安全策略&#xff0c;把握正确的步骤顺序&#xf…

万博智云与品高股份完成产品兼容性互认证,持续助力国产化生态建设

近日&#xff0c;万博智云的HyperBDR云容灾软件与广州市品高股份有限公司&#xff08;简称&#xff1a;品高股份&#xff09;旗下产品品高基础架构云资源管理软件V9.0完成了产品兼容性认证。 经万博智云和品高云双方人员的共同测试&#xff0c;得出结论&#xff1a; HyperBDR…

【C/C++数据结构与算法】C语言链表

目录 一、单链表 二、双向循环链表 三、判断链表是否带环 四、链表的回文结构判断 五、复制带随机指针的链表 一、单链表 优点&#xff1a;头部增删效率高&#xff0c;动态存储无空间浪费 缺点&#xff1a;尾部增删、遍历效率低&#xff0c;不支持随机访问节点 头结点&…

【夜深人静学习数据结构与算法 | 第六篇】贪心算法

目录 前言&#xff1a; 引入: 贪心算法&#xff1a; 455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 376. 摆动序列 - 力扣&#xff08;LeetCode&#xff09; 53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 122. 买卖股票的最佳时机 II - 力扣&a…

【Python 随练】统计字符类型个数

题目&#xff1a; 输入一行字符&#xff0c;分别统计出其中英文字母、空格、数字和其它字符的个数。 简介&#xff1a; 在本篇博客中&#xff0c;我们将解决一个字符统计问题&#xff1a;输入一行字符&#xff0c;统计其中英文字母、空格、数字和其他字符的个数。我们将提供…

学习python爬虫需要掌握哪些库?

Python爬虫是指使用Python编写的程序&#xff0c;用来自动化地获取互联网上的数据。通过爬取网站的HTML内容&#xff0c;并解析和提取所需的数据&#xff0c;可以实现自动化地收集、分析和处理大量的在线数据。 学习Python爬虫需要掌握以下几个核心库&#xff1a; Requests&am…