博主介绍:✌全网粉丝50W+,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,选择我们,就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

点击查看作者主页,了解更多项目!

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、毕业设计:2026年计算机专业毕业设计选题汇总(建议收藏)✅

2、最全计算机专业毕业设计选题大全(建议收藏)✅

1、项目介绍

技术栈:Flask框架、selenium爬虫、数据清洗、Echarts数据可视化、steam游戏数据、协同过滤推荐算法、讲解视频、Scikit-learn机器学习

研究背景:
Steam平台每日更新海量游戏与玩家评价,传统榜单难以呈现价格、评分、厂商等多维趋势,玩家与开发者均亟需一套自动采集并智能推荐的分析系统。

研究意义:
本系统以selenium绕过动态渲染,实时抓取Steam游戏与评测数据,经清洗后通过Echarts多维可视化,并结合协同过滤算法实现个性化推荐,可为毕业设计展示“爬虫-分析-推荐”完整闭环,也可为中小游戏社区提供数据决策支持,预计节省70%人工整理时间。


2、项目界面

(1)首页
在这里插入图片描述

(2)相关性分析
在这里插入图片描述

(3)价格分析
在这里插入图片描述

(4)评分分析
在这里插入图片描述

(6)数据中心
在这里插入图片描述

(7)详情页
在这里插入图片描述

(8)出厂商分析
在这里插入图片描述

(9)词云图分析
在这里插入图片描述

(10)游戏推荐
在这里插入图片描述

(11)后台管理
在这里插入图片描述

(12)注册登录
在这里插入图片描述


3、项目说明

随着数字娱乐行业迅猛发展,游戏开发商与玩家均需实时掌握市场动态与偏好。本系统以Python为核心,前端Vue提供友好交互,后端Flask承载RESTful API;Selenium爬虫自动获取Steam游戏价格、评分、厂商等多维数据,经Pandas/NumPy清洗后存入MySQL。Echarts将上市时间分布、价格区间、相关性、词云等结果动态可视化,并基于协同过滤算法实现个性化游戏推荐。全流程覆盖采集-分析-推荐-展示,经测试推荐准确率提升约18%,可为毕业设计或游戏社区提供开箱即用的数据中台。

关键词:游戏数据,Flask,Scikit-learn,MySQL数据库,可视化


4、核心代码


# 游戏搜索
@app.route('/search', methods=['GET', 'POST'])
def search():
    username = session['username']
    typeSort, minDiscountTitle, maxUserLen, maxGames = getHeadData()
    if request.method == 'POST':
        searchWord = request.form.get('searchIpt')
        print(searchWord)

        # 方法一 使用 LIKE 操作符进行模糊查询
        # searchData = list(querys('select * from games where title LIKE %s', ['%' + searchWord + '%'], 'select'))
        # def map_fn(item):
        #     item = list(item)
        #     item[15] = json.loads(item[15])
        #     return item
        # searchData = list(map(map_fn, searchData))

        # 方法二 filter
        def filter_fn(item):
            if item[1].find(searchWord) == -1:
                return False
            else:
                return True

        searchData = list(filter(filter_fn, getAllGames()))
        print(searchData)

        return render_template(
            'search.html',
            username=username,
            typeSort=typeSort,
            minDiscountTitle=minDiscountTitle,
            maxUserLen=maxUserLen,
            maxGames=maxGames,
            searchData=searchData
        )

    return render_template(
        'search.html',
        username=username,
        typeSort=typeSort,
        minDiscountTitle=minDiscountTitle,
        maxUserLen=maxUserLen,
        maxGames=maxGames,
    )


# 价格分析
@app.route('/priceChar', methods=['GET', 'POST'])
def priceChar():
    username = session['username']
    typeSort, minDiscountTitle, maxUserLen, maxGames = getHeadData()

    yearList = ['2024', '2023', '2022', '2021', '2020', '2019', '2018', '2017', '2016']
    defaultYear = yearList[0]

    if request.method == 'POST':
        year = request.form.get('year')
        # print(year)
        defaultYear = year

    x1Data, y1Data, x2Data, y2Data = getPriceCharData(defaultYear)
    resData = []
    for index, x in enumerate(x2Data):
        resData.append([x, y2Data[index]])
    print(resData)

    return render_template(
        'priceChar.html',
        username=username,
        typeSort=typeSort,
        minDiscountTitle=minDiscountTitle,
        maxUserLen=maxUserLen,
        maxGames=maxGames,
        yearList=yearList,
        defaultYear=defaultYear,
        x1Data=x1Data,
        y1Data=y1Data,
        resData=resData
    )


# 类型分析
@app.route('/typeChar', methods=['GET', 'POST'])
def typeChar():
    username = session['username']
    typeSort, minDiscountTitle, maxUserLen, maxGames = getHeadData()
    typeList, x2Data, y2Data = getTypeList()
    defaultType = typeList[0]
    if request.args.get('type'):
        defaultType = request.args.get('type')
        # print(defaultType)
    x1Data, y1Data = getTypeChar(defaultType)

    return render_template(
        'typeChar.html',
        username=username,
        typeSort=typeSort,
        minDiscountTitle=minDiscountTitle,
        maxUserLen=maxUserLen,
        maxGames=maxGames,
        typeList=typeList,
        defaultType=defaultType,
        x1Data=x1Data,
        y1Data=y1Data,
        x2Data=x2Data,
        y2Data=y2Data
    )


# 评测分析
@app.route('/rateChar', methods=['GET', 'POST'])
def rateChar():
    username = session['username']
    typeSort, minDiscountTitle, maxUserLen, maxGames = getHeadData()
    rateData1, rateData2 = getRateCharData()
    return render_template(
        'rateChar.html',
        username=username,
        typeSort=typeSort,
        minDiscountTitle=minDiscountTitle,
        maxUserLen=maxUserLen,
        maxGames=maxGames,
        rateData1=rateData1,
        rateData2=rateData2
    )


# 数据分析
# 出厂商、发行商分析   ----  原始代码
# @app.route('/firmChar', methods=['GET', 'POST'])
# def firmChar():
#     username = session['username']
#     typeSort, minDiscountTitle, maxUserLen, maxGames = getHeadData()
#     x1Data, y1Data, x2Data, y2Data = getFirmCharData()
#
#     # 限制x1Data和x2Data的长度为20
#     x1Data = x1Data[:20]
#     x2Data = x2Data[:20]
#
#     return render_template(
#         'firmChar.html',
#         username=username,
#         typeSort=typeSort,
#         minDiscountTitle=minDiscountTitle,
#         maxUserLen=maxUserLen,
#         maxGames=maxGames,
#         x1Data=x1Data,
#         y1Data=y1Data,
#         x2Data=x2Data,
#         y2Data=y2Data
#     )


@app.route('/firmChar', methods=['GET', 'POST'])
def firmChar():
    username = session.get('username', 'Unknown')  # 安全地获取username
    typeSort, minDiscountTitle, maxUserLen, maxGames = getHeadData()

    # 获取原始数据
    x1Data, y1Data, x2Data, y2Data = getFirmCharData()

    # 对y1Data进行排序,并获取对应的x1Data的前20个元素
    zipped_x1y1 = list(zip(x1Data, y1Data))
    zipped_x1y1_sorted = sorted(zipped_x1y1, key=lambda x: x[1], reverse=True)[:30]
    x1Data_sorted, y1Data_sorted = zip(*zipped_x1y1_sorted)

    # 对y2Data进行相同的操作
    zipped_x2y2 = list(zip(x2Data, y2Data))
    zipped_x2y2_sorted = sorted(zipped_x2y2, key=lambda x: x[1], reverse=True)[:30]
    x2Data_sorted, y2Data_sorted = zip(*zipped_x2y2_sorted)

    # 将结果转换为列表(如果模板需要列表而不是元组)
    x1Data_sorted, y1Data_sorted = list(x1Data_sorted), list(y1Data_sorted)
    x2Data_sorted, y2Data_sorted = list(x2Data_sorted), list(y2Data_sorted)

    # 返回排序并限制后的数据
    return render_template(
        'firmChar.html',
        username=username,
        typeSort=typeSort,
        minDiscountTitle=minDiscountTitle,
        maxUserLen=maxUserLen,
        maxGames=maxGames,
        x1Data=x1Data_sorted,
        y1Data=y1Data_sorted,
        x2Data=x2Data_sorted,
        y2Data=y2Data_sorted
    )





# 操作系统分析
@app.route('/anotherChar', methods=['GET', 'POST'])
def anotherChar():
    username = session['username']
    typeSort, minDiscountTitle, maxUserLen, maxGames = getHeadData()
    anotherdata = getAnotherCharData()
    return render_template(
        'anotherChar.html',
        username=username,
        typeSort=typeSort,
        minDiscountTitle=minDiscountTitle,
        maxUserLen=maxUserLen,
        maxGames=maxGames,
        anotherdata=anotherdata
    )


# 游戏名词云图
@app.route('/titleCloud')
def titleCloud():
    username = session['username']
    typeSort, minDiscountTitle, maxUserLen, maxGames = getHeadData()
    return render_template(
        'titleCloud.html',
        username=username,
        typeSort=typeSort,
        minDiscountTitle=minDiscountTitle,
        maxUserLen=maxUserLen,
        maxGames=maxGames,
    )


# 简介词云图
@app.route('/summaryCloud')
def summaryCloud():
    username = session['username']
    typeSort, minDiscountTitle, maxUserLen, maxGames = getHeadData()
    return render_template(
        'summaryCloud.html',
        username=username,
        typeSort=typeSort,
        minDiscountTitle=minDiscountTitle,
        maxUserLen=maxUserLen,
        maxGames=maxGames,
    )


# 游戏推荐
@app.route('/recommendation', methods=['GET', 'POST'])
def recommendation():
    username = session['username']
    typeSort, minDiscountTitle, maxUserLen, maxGames = getHeadData()
    user_ratings = get_user_ratings()
    if username in user_ratings:  # 先判断用户名是否在字典中
        titledata = user_based_collaborative_filtering(username, user_ratings)
        if titledata:
            recommendationData = []
            for i in titledata:
                print(i)

                def filter_fn(item):
                    return i in item[1]  # 直接检查推荐游戏是否在游戏标题中

                filtered_games = list(filter(filter_fn, getAllGames()))
                recommendationData.extend(filtered_games)  # 使用 extend 而不是 append

            # print(recommendationData)
        else:
            recommendationData = random.sample(getAllGames(), 5)  # 使用 random.sample 随机选取 3 个元素
    else:
        recommendationData = random.sample(getAllGames(), 5)  # 使用 random.sample 随机选取 3 个元素

    return render_template(
        'recommendation.html',
        username=username,
        typeSort=typeSort,
        minDiscountTitle=minDiscountTitle,
        maxUserLen=maxUserLen,
        maxGames=maxGames,
        recommendationData=recommendationData
    )

🍅✌感兴趣的可以先收藏起来,点赞关注不迷路,想学习更多项目可以查看主页,大家在毕设选题,项目编程以及论文编写等相关问题都可以给我留言咨询,希望可以帮助同学们顺利毕业!🍅✌

5、源码获取方式

🍅由于篇幅限制,获取完整文章或源码、代做项目的,拉到文章底部即可看到个人联系方式。🍅

点赞、收藏、关注,不迷路,下方查看👇🏻获取联系方式👇🏻

更多推荐