分享一套【优质Python源码】基于Python的BOSS直聘招聘职位信息数据分析与可视化系统(Django+echarts+Pandas+爬虫)

0 阅读3分钟

大家好,我是python222_小锋老师,分享一套优质的基于Python的BOSS直聘招聘职位信息数据分析与可视化系统(Django+echarts+Pandas+爬虫)  。  

2.jpg

项目简介

本系统采用B/S架构,使用Django作为核心Web开发框架,构建了清晰的前后端分离模式。系统首先利用Python爬虫技术(如Requests、BeautifulSoup)定向、高效地采集BOSS直聘平台上指定城市、职位关键词的招聘信息,并通过Pandas库对原始数据进行严格的去重、缺失值处理、格式标准化等清洗和预处理工作,形成高质量的结构化数据集。处理后的数据,包括职位名称、公司信息、薪资范围、工作地点、经验要求、技能标签等关键字段,被持久化存储于MySQL数据库中。

在数据分析层面,系统后端利用Pandas和NumPy的强大功能,从地域分布、行业趋势、薪资水平、技能需求等多个维度对数据进行统计分析与聚合计算。例如,分析各城市的职位供需情况、不同经验层级对应的薪资中位数、热门技能词的词频统计等。

源码下载

链接: pan.baidu.com/s/15AjVDDGX…

提取码: 1234

相关截图

1.jpg

3.jpg

4.jpg

5.jpg

6.jpg

7.jpg

8.jpg

核心代码

from django.shortcuts import render,redirect
from django.core.paginator import Paginator
from myApp.models import User
from .utils.error import *
import hashlib
from .utils import getHomeData
from .utils import getSelfInfo
from .utils import getChangePasswordData
from .utils import getTableData
from .utils import getHisotryData
from .utils import getSalaryCharData
from .utils import getCompanyCharData
from .utils import getEducationalCharData
from .utils import getCompanyStatusCharData
from .utils import getAddressCharData
from . import word_cloud_picture
from .utils.error import *
import random

def login(request):
    if request.method == 'GET':
        return render(request,'login.html')
    else:
        uname = request.POST.get('username')
        pwd = request.POST.get('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('/myApp/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)
            return redirect('/myApp/login')
        return errorResponse(request,"该用户名已经被注册!")

def logOut(request):
    request.session.clear()
    return redirect('login')

def home(request):
    uname = request.session.get('username')
    userInfo = User.objects.get(username=uname)
    yea,month,day = getHomeData.getNowTime()
    userCreateData = getHomeData.getUserCreateTime()
    top6Users = getHomeData.getUserTop6()
    jobsLen,usersLen,educationsTop,salaryTop,addressTop,salaryMonthTop,praticeMax = getHomeData.getAllTags()
    jobsPBarData = getHomeData.getAllJobsPBar()
    tablaData = getHomeData.getTablaData()
    return render(request,'home.html',{
        'userInfo':userInfo,
        'dateInfo':{
            'year':yea,
            'month':month,
            'day':day
        },
        'userCreateData':userCreateData,
        'top6Users':top6Users,
        'tagDic':{
            'jobsLen':jobsLen,
            'usersLen':usersLen,
            'educationsTop':educationsTop,
            'salaryTop':salaryTop,
            'addressTop':addressTop,
            'salaryMonthTop':salaryMonthTop,
            "praticeMax":praticeMax
        },
        'jobsPBarData':jobsPBarData,
        'tableData':tablaData
    })

def selfInfo(request):
    uname = request.session.get('username')
    userInfo = User.objects.get(username=uname)
    educations,workExperience,jobList = getSelfInfo.getPageData()
    if request.method == 'POST':
        getSelfInfo.changeSelfInfo(request.POST,request.FILES)
        userInfo = User.objects.get(username=uname)
    return render(request,'selfInfo.html',{
        'userInfo':userInfo,
        'pageData':{
            'educations':educations,
            'workExperience':workExperience,
            'jobList':jobList
        }
    })

def changePassword(request):
    uname = request.session.get('username')
    userInfo = User.objects.get(username=uname)
    if request.method == 'POST':
        res = getChangePasswordData.changePassword(userInfo,request.POST)
        if res != None:
            return errorResponse(request,res)
        userInfo = User.objects.get(username=uname)
    return render(request, 'changePassword.html', {
        'userInfo': userInfo
    })

def tableData(request):
    uname = request.session.get('username')
    userInfo = User.objects.get(username=uname)
    tableData = getTableData.getTableData()
    paginator = Paginator(tableData,10)
    cur_page = 1
    if request.GET.get('page'):cur_page = int(request.GET.get('page'))
    c_page = paginator.page(cur_page)

    page_range = []
    visibleNumber = 10
    min = int(cur_page - visibleNumber / 10)
    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',{
        'userInfo':userInfo,
        'c_page':c_page,
        'page_range':page_range,
        'paginator':paginator
    })

def historyTableData(request):
    uname = request.session.get('username')
    userInfo = User.objects.get(username=uname)
    historyData = getHisotryData.getHisotryData(userInfo)
    return render(request,'historyTableData.html',{
        'userInfo':userInfo,
        'historyData':historyData
    })

def addHistory(request,jobId):
    uname = request.session.get('username')
    userInfo = User.objects.get(username=uname)
    getHisotryData.addHistory(userInfo,jobId)
    return redirect('historyTableData')

def removeHisotry(request,hisId):
    getHisotryData.removeHisotry(hisId)
    return redirect('historyTableData')

def salary(request):
    uname = request.session.get('username')
    userInfo = User.objects.get(username=uname)
    educations,workExperiences = getSalaryCharData.getPageData()
    defaultEducation = '不限'
    defaultWorkExperience = '不限'
    if request.GET.get('educational'):defaultEducation = request.GET.get('educational')
    if request.GET.get('workExperience'):defaultWorkExperience = request.GET.get('workExperience')
    salaryList,barData,legends = getSalaryCharData.getBarData(defaultEducation,defaultWorkExperience)
    pieData = getSalaryCharData.pieData()
    louDouData = getSalaryCharData.getLouDouData()
    return render(request,'salaryChar.html',{
        'userInfo':userInfo,
        'educations':educations,
        'workExperiences':workExperiences,
        'defaultEducation':defaultEducation,
        'defaultWorkExperience':defaultWorkExperience,
        'salaryList':salaryList,
        'barData':barData,
        'legends':legends,
        'pieData':pieData,
        'louDouData':louDouData
    })

def company(request):
    uname = request.session.get('username')
    userInfo = User.objects.get(username=uname)
    typeList = getCompanyCharData.getPageData()
    type = 'all'
    if request.GET.get('type'):type = request.GET.get('type')
    rowBarData,columnBarData = getCompanyCharData.getCompanyBar(type)
    pieData = getCompanyCharData.getCompanyPie(type)
    companyPeople,lineData = getCompanyCharData.getCompanPeople(type)
    return render(request, 'companyChar.html', {
        'userInfo': userInfo,
        'typeList':typeList,
        "type":type,
        "rowBarData":rowBarData,
        "columnBarData":columnBarData,
        'pieData':pieData,
        "companyPeople":companyPeople,
        "lineData":lineData
    })

def companTags(request):
    uname = request.session.get('username')
    userInfo = User.objects.get(username=uname)
    return render(request, 'companyTags.html', {
        'userInfo': userInfo
    })

def educational(request):
    uname = request.session.get('username')
    userInfo = User.objects.get(username=uname)
    defaultEducation = '不限'
    if request.GET.get('educational') :defaultEducation = request.GET.get('educational')
    educations = getEducationalCharData.getPageData()
    workExperiences,charDataColumnOne,charDataColumnTwo,hasEmpty = getEducationalCharData.getExpirenceData(defaultEducation)
    barDataRow,barDataColumn = getEducationalCharData.getPeopleData()
    return render(request, 'educationalChar.html', {
        'userInfo': userInfo,
        'educations':educations,
        'defaultEducation':defaultEducation,
        'workExperiences':workExperiences,
        'charDataColumnOne':charDataColumnOne,
        'charDataColumnTwo':charDataColumnTwo,
        'hasEmpty':hasEmpty,
        'barDataRow':barDataRow,
        'barDataColumn':barDataColumn
    })

def companyStatus(request):
    uname = request.session.get('username')
    userInfo = User.objects.get(username=uname)
    defaultType = '不限'
    if request.GET.get('type'): defaultType = request.GET.get('type')
    typeList = getCompanyStatusCharData.getPageData()
    teachnologyRow,teachnologyColumn = getCompanyStatusCharData.getTechnologyData(defaultType)
    companyStatusData = getCompanyStatusCharData.getCompanyStatusData()
    return render(request, 'companyStatusChar.html', {
        'userInfo': userInfo,
        'typeList':typeList,
        'defaultType':defaultType,
        'teachnologyRow':teachnologyRow,
        'teachnologyColumn':teachnologyColumn,
        'companyStatusData':companyStatusData
    })

def address(request):
    uname = request.session.get('username')
    userInfo = User.objects.get(username=uname)
    defaultCity = '北京'
    if request.GET.get('city'):defaultCity = request.GET.get('city')
    hotCities = getAddressCharData.getPageData()
    salaryRows,salaryColumns = getAddressCharData.getSalaryData(defaultCity)
    companyPeopleData = getAddressCharData.companyPeopleData(defaultCity)
    educationData = getAddressCharData.getEducationData(defaultCity)
    distData = getAddressCharData.getDistData(defaultCity)
    randomPicture = random.randint(1,1000000)
    word_cloud_picture.get_img('companyTags','./static/3.png','./static/'+str(randomPicture) + '.png')
    return render(request, 'addressChar.html', {
        'userInfo': userInfo,
        'hotCities':hotCities,
        'defaultCity':defaultCity,
        'salaryRows':salaryRows,
        'salaryColumns':salaryColumns,
        'companyPeopleData':companyPeopleData,
        'educationData':educationData,
        'distData':distData,
        'url':randomPicture
    })