当前位置:   article > 正文

大数据毕业设计:Spark高考推荐系统 高考信息报名院校推荐系统 协同过滤推荐算法 爬虫(源码+文档)✅_爬虫 阳光高考

爬虫 阳光高考

博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌感兴趣的可以先收藏起来,点赞、关注不迷路✌

毕业设计:2023-2024年计算机毕业设计1000套(建议收藏)

毕业设计:2023-2024年最新最全计算机专业毕业设计选题汇总

1、项目介绍

技术栈:
python语言 pyspark、 django框架、scrapy框架、vue框架、协同过滤推荐算法、HTML
基于用户+物品推荐院校、基于用户+物品推荐专业
阳光高考网—教育部高校招生阳光工程知道平台

2、项目界面

(1)高校信息库模块
在这里插入图片描述

(2)高校详情页面
在这里插入图片描述
(3)高校推荐模块
在这里插入图片描述

(4)专业信息库
在这里插入图片描述

(5)专业详情页面

在这里插入图片描述

(6)开设专业高校
在这里插入图片描述

(7)个性化推荐高校
在这里插入图片描述

(8)高考信息设置
在这里插入图片描述

(9)后台数据管理
在这里插入图片描述

3、项目说明

系统中各个模块的具体实现:

1. 数据抓取模块

该模块使用了Scrapy爬虫框架,通过访问“阳光高考”网站来抓取大学和专业相关数据。在抓取大学数据时,我们将获取学校名称、学校logo、简介、满意度、院系设置、录取规则、食宿条件、设立专业等字段;在抓取大学专业数据时,我们将获取学历层次、专业代码、所属门类、专业类别、介绍、相近专业、从业方向、统计了毕业生规模以及男女比例等信息。

2. 用户注册登录模块

该模块使用Django框架实现用户的注册和登录功能。在注册时,我们要求用户提供用户名、密码等必要信息,同时对用户输入进行合法性校验;在登录时,用户需要输入正确的用户名和密码才能成功登录系统。

3. 后台管理模块

该模块是系统管理员可以对系统中的数据进行管理操作的接口,包括大学和专业数据的增删改查。我们使用Django Admin框架实现后台管理功能。管理员登陆后,进入后台管理界面,就可以对系统中的数据进行增删改查的操作。

4. 高校信息查询模块

该模块是实现用户在高校名称关键词、高校所在地、学历层次等信息筛选出符合条件的国内高校的功能,该页面以卡片形式展示了高校信息。我们使用Vue+Element-Plus框架来实现前端页面渲染、数据展示和分页组件,使用Django框架来实现后端API接口。我们将20条数据为一页,以此来降低后端压力。

5. 专业信息查询模块

该模块是用户可以根据专业分类以及关键词等信息筛选出符合条件的大学专业数据的功能,该页面以表格形式展示了专业信息。我们同样使用Vue+Element-Plus框架来实现前端页面渲染、数据展示和分页组件,使用Django框架来实现后端API接口。

6. 个性化推荐高校和专业模块

该模块是根据用户在高考志愿填报模块所填写的预测成绩、喜欢的专业、喜欢的学校以及想去的省份所在地等信息,从数据库中查找出符合用户条件的高校以及专业数据,再个性化地推荐给用户的功能。我们使用基于物品的协同过滤算法实现系统的推荐功能,并使用Django框架实现后端API接口。

7. 高校详情模块

该模块是当用户查看某高校详情时,可以看到该高校的多种信息,比如院校简介、学校领导、周边环境、通讯地址、院校设置、重点实验室、重点学科、师资力量、录取条件、食宿条件等,还可以查看该学校设立的所有专业数据。该模块同样使用Vue+Element-Plus框架实现前端页面渲染、数据展示,使用Django框架实现后端API接口,并使用基于物品的协同过滤算法给用户推荐相似的高校数据。

8. 专业详情模块

该模块是当用户查看某专业的详情时,可以看到该专业的多种信息,比如学历层次、专业代码、所属门类,专业分类、专业介绍、统计信息包括该专业的毕业生规模和男女比例、相似专业、毕业后的从业方向。该模块同样使用Vue+Element-Plus框架实现前端页面渲染、数据展示,使用Django框架实现后端API接口,并使用基于物品的协同过滤算法给用户推荐相似的专业数据。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

技术及功能关键词:
技术栈:
python语言 pyspark、 django框架、scrapy框架、vue框架、协同过滤推荐算法、HTML
基于用户+物品推荐院校、基于用户+物品推荐专业
阳光高考网—教育部高校招生阳光工程知道平台

通过scrapy爬虫框架抓取“阳光高考”网站上的大学数据(包括了学校名称、学校logo、简介、满意度、院系设置、录取规则、食宿条件、设立专业等字段)以及大学的专业(包括了学历层次、专业代码、所属门类、专业类别、介绍、相近专业、从业方向、统计了毕业生规模以及男女比例等信息)数据 
前台用户通过登陆注册后进入系统
管理员可在后台管理所有抓取到的大学及大学专业数据,以及用户填写的高考志愿意向数据
高校信息查询模块,用户可以根据高校名称关键词、高校所在地、学历层次等信息筛选出符合条件的国内高校,该页面以卡片形式展示了高校信息,其中包括了高校名称、高校LOGO、所在地、学历层次、主管部门以及高校评分等数据,分页组件以20条数据为一页,可大大降低后端压力
专业信息查询模块,用户可以根据专业分类以及关键词等信息筛选出符合条件的大学专业数据,该页面以表格形式展示了专业信息,其中包括专业名称、专业所属门类、专业所属类以及专业满意度等信息
个性化推荐高校和专业模块,这是根据用户在高考志愿填报模块所填写的预测成绩、喜欢的专业、喜欢的学校以及想去的省份所在地等信息,在数据库中查找出符合用户条件的高校以及专业数据,再个性化地推荐给用户;需要注意的是,当用户第一次访问该模块时,系统会检测用户是否已填写志愿,如果没有,必须填写后才能够推荐
当用户查看某高校详情时,可以看到该高校的多种信息,比如院校简介、学校领导、周边环境、通讯地址、院校设置、重点实验室、重点学科、师资力量、录取条件、食宿条件等,还可以查看该学校设立的所有专业数据,同时系统会依据基于物品的协同过滤算法给用户推荐相似的高校数据
当用户查看某专业的详情时,可以看到该专业的多种信息,比如学历层次、专业代码、所属门类,专业分类、专业介绍、统计信息包括该专业的毕业生规模和男女比例、相似专业、毕业后的从业方向。也可以看到该专业有哪些高校设立,同时系统会依据基于物品的协同过滤算法给用户推荐相似的专业数据
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4、核心代码


from .models import *
from django.http.response import HttpResponse
from django.shortcuts import render
from django.http import JsonResponse
from datetime import datetime, time
from django.core.paginator import Paginator
from django.db.models import Q
from app.apps import AppConfig
from auth.models import UserInfo


def to_dict(l, exclude=tuple()):
    # 将数据库模型 变为 字典数据 的工具类函数
    def transform(v):
        if isinstance(v, datetime):
            return v.strftime("%Y-%m-%d %H:%M:%S")
        return v

    def _todict(obj):
        j = {
            k: transform(v)
            for k, v in obj.__dict__.items()
            if not k.startswith("_") and k not in exclude
        }
        return j

    return [_todict(i) for i in l]


def get_college_list(request):
    body = request.json
    pagesize = body.get("pagesize", 10)
    page = body.get("page", 1)
    exclude_fields = ["pagesize", "page", "total"]
    query = {k: v for k, v in body.items() if k not in exclude_fields and v}
    q = Q(**query)
    objs = College.objects.filter(q).order_by("id")
    paginator = Paginator(objs, pagesize)
    pg = paginator.page(page)
    result = list(pg.object_list)
    result = to_dict(result)
    return JsonResponse({"total": paginator.count, "records": result})


def get_content_recommend_colleges(request):
    # 基于物品推荐高校
    body = request.json
    id = body.get("id")
    topK = 10
    o = College.objects.get(pk=id)
    try:
        ids = AppConfig.recommendCollegesForCollege(o.id, topK)
        result = College.objects.filter(id__in=ids).order_by("?")
    except:
        result = College.objects.filter(location=o.location).order_by("?")
    return JsonResponse(to_dict(result), safe=False)


def get_user_recommend_colleges(request):
    # 基于用户填表推荐高校
    topK = 10
    user = request.user
    userinfo = UserInfo.objects.filter(user=user).first()
    q = Q()
    for i in userinfo.favour_location.split(", "):
        if not i:
            continue
        q |= Q(location__icontains=i)
    for i in userinfo.favour_college.split(", "):
        if not i:
            continue
        q |= Q(name__icontains=i)
    try:
        result = list(College.objects.filter(q).order_by("?")[:topK])
        assert len(result) > 0
    except:
        result = College.objects.order_by("?")[:topK]
    return JsonResponse(to_dict(result), safe=False)


def get_college_major_list(request):
    body = request.json
    id = body.get("id")
    o = College.objects.get(pk=id)
    pagesize = body.get("pagesize", 10)
    page = body.get("page", 1)
    exclude_fields = ["pagesize", "page", "total", "id"]
    query = {k: v for k, v in body.items() if k not in exclude_fields and v}
    q = Q(**query)
    objs = o.majors.filter(q).order_by("cat1", "cat2")
    paginator = Paginator(objs, pagesize)
    pg = paginator.page(page)
    result = list(pg.object_list)
    result = to_dict(result)
    return JsonResponse({"total": paginator.count, "records": result})


def get_college_detail(request):
    body = request.json
    id = body.get("id")
    o = College.objects.get(pk=id)
    CollegeHistory.objects.create(user=request.user, college=o)
    return JsonResponse(to_dict([o])[0])


def get_major_list(request):
    body = request.json
    pagesize = body.get("pagesize", 10)
    page = body.get("page", 1)
    exclude_fields = ["pagesize", "page", "total", "category"]
    query = {k: v for k, v in body.items() if k not in exclude_fields and v}
    q = Q(**query)
    if body.get("category"):
        cat = body["category"]
        q &= Q(cat1=cat) | Q(cat2=cat) | Q(zymc=cat)
    objs = Major.objects.filter(q).order_by("id")
    paginator = Paginator(objs, pagesize)
    pg = paginator.page(page)
    result = list(pg.object_list)
    result = to_dict(result)
    return JsonResponse({"total": paginator.count, "records": result})


def get_content_recommend_majors(request):
    # 基于物品推荐专业
    body = request.json
    id = body.get("id")
    o = Major.objects.get(pk=id)
    topK = 10
    try:
        ids = AppConfig.recommendMajorsForMajor(o.id, topK)
        result = Major.objects.filter(id__in=ids).order_by("?")
    except:
        result = Major.objects.filter(cat2=o.cat2).order_by("?")
    return JsonResponse(to_dict(result), safe=False)


def get_user_recommend_majors(request):
    # 基于用户填表推荐专业
    topK = 10
    user = request.user
    userinfo = UserInfo.objects.filter(user=user).first()
    q = Q()
    for i in userinfo.favour_major.split(", "):
        if not i:
            continue
        q |= Q(zymc__icontains=i)
    # for i in userinfo.favour_college.split(", "):
    #     if not i:
    #         continue
    #     q |= Q(colleges__name__icontains=i)
    try:
        result = Major.objects.filter(q).order_by("?")[:topK]
    except Exception as e:
        result = Major.objects.order_by("?")[:topK]
    return JsonResponse(to_dict(result), safe=False)


def get_major_college_list(request):
    body = request.json
    id = body.get("id")
    o = Major.objects.get(pk=id)
    pagesize = body.get("pagesize", 10)
    page = body.get("page", 1)
    exclude_fields = ["pagesize", "page", "total", "id"]
    query = {k: v for k, v in body.items() if k not in exclude_fields and v}
    q = Q(**query)
    objs = o.colleges.filter(q).order_by("-rate")
    paginator = Paginator(objs, pagesize)
    pg = paginator.page(page)
    result = list(pg.object_list)
    result = to_dict(result)
    return JsonResponse({"total": paginator.count, "records": result})


def get_major_college_locations(request):
    body = request.json
    id = body.get("id")
    o = Major.objects.get(pk=id)
    result = [i[0] for i in o.colleges.values_list("location").distinct()]
    return JsonResponse(result, safe=False)


def get_major_detail(request):
    body = request.json
    id = body.get("id")
    o = Major.objects.get(pk=id)
    MajorHistory.objects.create(user=request.user, major=o)
    o.simileZyList = to_dict(
        Major.objects.filter(
            zydm__in=(o.simileZyList and o.simileZyList.split("|")) or []
        ).all()
    )
    return JsonResponse(to_dict([o])[0])


def get_major_category(request):
    result = []
    for (cat1,) in Major.objects.values_list("cat1").distinct():
        item = dict(value=cat1, label=cat1, children=[])
        result.append(item)
        for (cat2,) in Major.objects.filter(cat1=cat1).values_list("cat2").distinct():
            item2 = dict(value=cat2, label=cat2, children=[])
            item["children"].append(item2)
            for (zymc,) in (
                Major.objects.filter(cat1=cat1, cat2=cat2)
                .values_list("zymc")
                .distinct()
            ):
                item2["children"].append(dict(value=zymc, label=zymc))
    return JsonResponse(result, safe=False)



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/843256
推荐阅读
相关标签