当前位置:   article > 正文

计算机毕业设计:python招聘数据爬取分析可视化系统(BOSS直聘)+Django框架(源码+文档+全套讲解视频)_基于python的招聘信息爬虫系统

基于python的招聘信息爬虫系统

博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌

毕业设计:2023-2024年计算机专业毕业设计选题汇总(建议收藏)

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

1、项目介绍

技术栈:
Python语言、Django后端框架 MySQL数据库 pyecharts可视化 、selenium爬虫、词云 chromedriver 、BOSS直聘招聘网站数据

2、项目界面

(1)首页------数据概况

在这里插入图片描述

(2)招聘数据
在这里插入图片描述

(3)薪资水平分析
在这里插入图片描述

(4)各学历占比分析
在这里插入图片描述

(5)词云图分析

在这里插入图片描述

(6)企业情况分析

在这里插入图片描述

(7)我的收藏
在这里插入图片描述

(8)注册登录界面

在这里插入图片描述

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

3、项目说明

本项目主要利用python技术爬取BOSS直聘网站上的岗位信息,进行对比分析UI设计师与产品经理两个职位的趋势。爬取字段:工作地点,薪资范围,学历要求,工作经验,公司性质等。 模拟登陆BOSS直聘网站,爬取相关信息下载网页源码,采用beautifulsoup来提取数据,存储到数据库,以柱状图或饼状图形式对数据进行可视化分析得出结论。

boss直聘招聘信息采集可视化系统是一种集成了爬虫、数据存储和数据可视化等功能的Web应用程序,主要用于采集boss直聘网站上的招聘信息,并通过可视化图表展示这些信息,以帮助用户更加方便地了解企业招聘行情、职位需求等信息。
通常来说,boss直聘招聘信息采集可视化系统具有以下几个主要功能:

1、数据爬取:系统通过爬虫技术对boss直聘网站上的招聘信息进行抓取和解析,收集有关招聘职位、公司名称、职位描述、薪资水平、工作地点等方面的数据。

2、数据处理:采集下来的数据需要经过清洗和处理,才能更好地满足后续的分析和可视化需求。这里可以使用Python的pandas库等进行数据清洗和处理。

3、数据存储:系统需要将经过处理的数据存储到数据库中,以便后续的检索和可视化。可以使用关系型数据库,如MySQL、PostgreSQL等进行存储。

4、数据可视化:通过可视化图表将采集到的数据呈现给用户,帮助他们更好地理解和分析企业的招聘状况、职位需求等。这里可以使用Python的matplotlib、seaborn等库进行数据可视化。

5、用户管理:为了方便用户使用和管理,系统通常需要提供用户注册、登陆等功能,并具有一定的权限管理机制。

总之,boss直聘招聘信息采集可视化系统是一种非常实用的Web应用程序,可以帮助用户更加方便地了解企业招聘信息,也能够有效地提高HR人员的工作效率。同时,通过使用Python和相关的库和框架,开发时间和成本也可以得到有效的控制。

4、核心代码


from django.shortcuts import render,redirect
from django.http import HttpResponse
from app.models import JobInfo, User,UserLike
from django.core.paginator import Paginator
import hashlib
import json
from .error import *
from .utils import getHomePageData
from .utils import getPubliData
from .utils import getTableData
from .utils import getSalaryData
from .utils import getEducationalData
from .utils import getAddressData
from .utils import getCompanyData
# 登录页面
def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        uname = request.POST.get('username')
        pwd = request.POST['password']
        md5 = hashlib.md5()
        md5.update(pwd.encode())
        pwd = md5.hexdigest()
        try:
            user = User.objects.get(username=uname, password=pwd)
            request.session['username'] = user.username
            return redirect('home')
        except:
            return errorResponse(request, '用户名或密码错误!')

# 注册用户
def registry(request):
    if request.method == 'GET':
        return render(request, 'registry.html')
    else:
        uname = request.POST.get('username')
        pwd = request.POST.get('password')
        checkPWD = request.POST.get('checkPassword')
        try:
            User.objects.get(username=uname)
        except:
            if not uname or not pwd or not checkPWD: return errorResponse(request, '不允许为空!')
            if pwd != checkPWD: return errorResponse(request, '两次密码不符合!')
            md5 = hashlib.md5()
            md5.update(pwd.encode())
            pwd = md5.hexdigest()
            User.objects.create(username=uname, password=pwd,info='这个人很懒,什么都没留下....')
            return redirect('login')
        return errorResponse(request, '该用户已被注册')

# 退出登录
def logOut(request):
    request.session.clear()
    return redirect('login')

# 首页
def home(request):
    username = request.session.get("username")
    userInfo = User.objects.get(username=username)
    typeList,maxCount,maxSalary,addressTop,praticeMax,maxType,maxEdu = getHomePageData.getPageData()
    defaultType = typeList[0]
    if request.GET.get("type"): defaultType = request.GET.get("type")
    maxSalary = getHomePageData.getSalaryMaxData(defaultType)
    salaryXData,salarY1Data,salarY2Data = getHomePageData.getSalaryChartData(defaultType)
    typeBarData = getHomePageData.getTypeBarData()
    return render(request, 'home.html',{
        'username': username,
        'userAvatar': userInfo.avatar,
        'userInfo': userInfo.info,
        'typeList':typeList,
        'defaultType':defaultType,
        'maxSalary':maxSalary,
        'salaryXData':salaryXData,
        'salarY1Data':salarY1Data,
        'salarY2Data':salarY2Data,
        'typeBarData':typeBarData,
        'maxCount':maxCount,
        'maxSalary':maxSalary,
        'addressTop':addressTop,
        'maxType':maxType,
        'maxEdu':maxEdu
    })

def userLike(request):
    username = request.session.get("username")
    userInfo = User.objects.get(username=username)
    likeList = [i for i in userInfo.userlike_set.all()]
    def map_fn(item):
        item.job.salary = json.loads(item.job.salary)
        item.job.companyPeople = json.loads(item.job.companyPeople)
        item.job.workTag = json.loads(item.job.workTag)
        if item.job.companyTags == '无':
            item.job.companyTags = []
        else:
            item.job.companyTags = json.loads(item.job.companyTags)
        if not item.job.pratice:
            item.job.salary = list(map(lambda x: str(int(x / 1000)), item.job.salary))
        else:
            item.job.salary = list(map(lambda x: str(x), item.job.salary))

        item.job.salary = '-'.join(item.job.salary)
        item.job.companyPeople = list(map(lambda x: str(x), item.job.companyPeople))
        item.job.companyPeople = '-'.join(item.job.companyPeople)
        return item

    likeList = list(map(map_fn, likeList))
    return render(request, 'userLike.html', {
        'username': username,
        'userAvatar': userInfo.avatar,
        'userInfo': userInfo.info,
        'likeList':likeList
    })

def deleteUserLike(request):
    userLike = UserLike.objects.filter(id=request.GET.get('id'))
    userLike.delete()
    return successResponse(request,'删除成功','userLike')

def deleteStation(request):
    userLike = JobInfo.objects.filter(id=request.GET.get('id'))
    userLike.delete()
    return successResponse(request, '删除成功','tableData')

def addUserLike(request):
    username = request.session.get("username")
    userInfo = User.objects.get(username=username)
    userLike = UserLike.objects.create(job_id=request.GET.get('id'),user_id=userInfo.id)
    return successResponse(request, '添加成功','userLike')


def userInfo(request):
    username = request.session.get("username")
    userInfo = User.objects.get(username=username)
    if request.method == 'GET':
        return render(request, 'userInfo.html', {
            'username': username,
            'userAvatar': userInfo.avatar,
            'userInfo': userInfo.info
        })
    else:
        user = User.objects.get(username=username)
        md5 = hashlib.md5()
        md5.update(request.POST['password'].encode())
        pwd = md5.hexdigest()
        if request.POST['info']:
            user.info = request.POST['info']
        if request.POST['password']:
            user.password = pwd
        try:
            if request.FILES['avatar'] != None:
                user.avatar = request.FILES['avatar']
        except:
            pass
        user.save()
        userInfo = User.objects.get(username=username)
        return render(request, 'userInfo.html', {
            'username': username,
            'userAvatar': userInfo.avatar,
            'userInfo': userInfo.info
        })

def tableData(request):
    username = request.session.get("username")
    userInfo = User.objects.get(username=username)
    sorted = '无'
    typeList, maxCount, maxSalary, addressTop, praticeMax, maxType, maxEdu = getHomePageData.getPageData()
    if request.method == 'GET':
        if request.GET.get("sorted"): sorted = request.GET.get("sorted")
        tableData = getTableData.getTableData(sorted,'无','无')
    else:
        if request.GET.get("sorted"): sorted = request.GET.get("sorted")
        tableData = getTableData.getTableData(sorted,request.POST.get('searchWord'),request.POST.get('type'))
        return render(request, 'tableData.html', {
            'username': username,
            'userInfo': userInfo.info,
            'userAvatar': userInfo.avatar,
            'typeList': typeList,
            'tableData': tableData,
            'flag':False
        })

    paginator = Paginator(tableData, 10)
    cur_page = 1
    if request.GET.get("page"): cur_page = int(request.GET.get("page"))
    if cur_page:
        c_page = paginator.page(cur_page)
    else:
        c_page = paginator.page(1)
    page_range = []
    visibleNumber = 10
    min = int(cur_page - visibleNumber / 2)
    if min < 1:
        min = 1
    max = min + visibleNumber
    if max > paginator.page_range[-1]:
        max = paginator.page_range[-1]
    for i in range(min, max):
        page_range.append(i)

    return render(request, 'tableData.html', {
        'username': username,
        'userInfo': userInfo.info,
        'userAvatar': userInfo.avatar,
        'typeList': typeList,
        'tableData': tableData,
        "pagination": paginator,
        "c_page": c_page,
        'page_range': page_range,
        'flag':True
    })

def salaryChart(request):
    username = request.session.get("username")
    userInfo = User.objects.get(username=username)
    xData,yData,y1Data = getSalaryData.getEducationlSalaryData()
    pieData = getSalaryData.getPieData()
    return render(request, 'salaryChart.html', {
        'username': username,
        'userAvatar': userInfo.avatar,
        'userInfo': userInfo.info,
        'xData':xData,
        'yData':yData,
        'y1Data':y1Data,
        'pieData':pieData
    })

def educational(request):
    username = request.session.get("username")
    userInfo = User.objects.get(username=username)
    treeData = getEducationalData.getEducationalTreeData()
    typeList, maxCount, maxSalary, addressTop, praticeMax, maxType, maxEdu = getHomePageData.getPageData()
    defaultType = typeList[0]
    if request.GET.get("type"): defaultType = request.GET.get("type")
    xData,yData = getEducationalData.getEducationByType(defaultType)
    return render(request, 'educationalChart.html', {
        'username': username,
        'userAvatar': userInfo.avatar,
        'userInfo': userInfo.info,
        'treeData':treeData,
        'typeList':typeList,
        'defaultType':defaultType,
        'xData':xData,
        'yData':yData
    })

def address(request):
    username = request.session.get("username")
    userInfo = User.objects.get(username=username)
    typeList, maxCount, maxSalary, addressTop, praticeMax, maxType, maxEdu = getHomePageData.getPageData()
    defaultType = typeList[0]
    if request.GET.get("type"): defaultType = request.GET.get("type")
    xData,yData = getAddressData.getAddressByType(defaultType)
    addressList = getAddressData.getAddressList()
    defaultAddress = addressList[0]
    if request.GET.get("address"): defaultAddress = request.GET.get("address")
    pieData = getAddressData.getAddressDataPie(defaultAddress)
    return render(request, 'addressChart.html', {
        'username': username,
        'userAvatar': userInfo.avatar,
        'userInfo': userInfo.info,
        'defaultType':defaultType,
        'typeList':typeList,
        'xData':xData,
        'yData':yData,
        'defaultAddress':defaultAddress,
        'addressList':addressList,
        'pieData':pieData
    })

def workTag(request):
    username = request.session.get("username")
    userInfo = User.objects.get(username=username)
    return render(request, 'workTag.html', {
        'username': username,
        'userAvatar': userInfo.avatar,
        'userInfo': userInfo.info
    })

def company(request):
    username = request.session.get("username")
    userInfo = User.objects.get(username=username)
    xData,yData = getCompanyData.getCompanyPeopleData()
    resdata = getCompanyData.getCompanyNature()
    return render(request, 'company.html', {
        'username': username,
        'userAvatar': userInfo.avatar,
        'userInfo': userInfo.info,
        'xData':xData,
        'yData':yData,
        'resdata':resdata
    })


  • 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
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】

推荐阅读
相关标签