大数据机器学习算法岗位分析推荐:基于Python的招聘大数据爬虫可视化分析推荐系统

大数据推荐算法招聘数据分析:基于Python招聘大数据爬虫数据可视化分析推荐系统

一、项目概述

系统涵盖了多个关键功能,包括使用selenium库进行数据爬取、爬虫调度、以及在前端页面上选择不同的城市、爬取页数和职位关键字进行数据爬取。此外,系统还包括数据管理和可视化功能,能够对薪资待遇、学历分布和职位关键字进行可视化分析。为了进一步提升系统的智能化,使用了机器学习算法中的协同过滤来实现selenium功能。具体而言,该功能支持用户设置求职意向,并根据用户的需求为其推荐相关职位,并将推荐结果展示在求职列表中。在后台管理方面,系统提供了用户设置和管理功能,方便用户自定义各项参数以及管理已爬取的数据。需要注意的是,系统主要针对猎聘网进行数据爬取。通过本次毕设的研究和开发,旨在构建一个功能完善、易用且具有实际应用价值的招聘数据爬虫可视化分析推荐系统。通过该系统,用户能够灵活地进行数据爬取,并通过可视化分析洞察行业动态。机器学习算法的应用则为用户提供了个性化的职位推荐,让求职过程更加高效和精准。

二、项目说明

随着互联网的快速发展,招聘行业正经历着数字化转型的进程。在线招聘平台成为求职者和招聘企业之间联系的重要桥梁。然而,现有的招聘数据常常分散在不同的网站和平台中,手动收集和整理这些数据变得非常耗时且容易出错。因此,开发一种高效、自动化的招聘数据爬虫可视化分析推荐系统对于提升招聘过程的效率和准确性具有重要意义。

本研究旨在基于Python构建招聘数据爬虫可视化分析推荐系统,其中包含了selenium爬虫和爬虫调度等核心功能。通过使用Python中的selenium库,们能够自动获取并爬取猎聘网等主要招聘网站上的数据。爬虫调度模块允许用户在前端页面选择不同的城市、爬取页数和职位关键字,从而实现灵活的数据爬取。除了数据爬取,系统还提供了数据管理功能,确保爬取到的数据的完整性和一致性。另外,系统还支持数据可视化功能,包括薪资待遇、学历分布和职位关键字的可视化分析。通过这些功能,用户可以更直观地了解招聘市场的薪资水平,不同学历的需求趋势以及职位关键字的热门程度,从而做出更明智的职业规划和求职决策。本研究还引入了机器学习算法中的协同过滤技术,以提供个性化的职位推荐服务。用户可以设置自己的求职意向,系统将根据用户的需求以及历史数据分析,为其推荐最相关的职位,并将这些推荐结果展示在求职列表中。这种职位推荐技术将大大提高求职者的匹配度和成功率,为他们节省时间和精力。

三、研究意义

该系统将通过整合爬虫技术和数据分析方法,实现对招聘信息的自动化获取、清洗和分析,为求职者提供更加准确、全面的职业发展支持。此外,系统中的机器学习算法还将根据用户的个人需求和行为习惯,为其提供个性化的职位推荐,有助于提升求职匹配度和成功率。因此,本研究的意义在于为求职者提供更加便捷、智能的求职服务,促进社会经济的健康发展。

四、系统总体架构设计

总体框架

在这里插入图片描述

技术架构

在这里插入图片描述

五、部分模块核心代码

# 计算相似度
def similarity(job1_id, job2_id):
    job1_set = models.SendList.objects.filter(job=job1_id)
    # job1的投递用户数
    job1_sum = job1_set.count()
    # job2的打分用户数
    job2_sum = models.SendList.objects.filter(job=job2_id).count()
    # 两者的交集
    common = models.SendList.objects.filter(user__in=Subquery(job1_set.values('user')), job=job2_id).values('user').count()
    # 没有人投递当前职位
    if job1_sum == 0 or job2_sum == 0:
        return 0
    similar_value = common / sqrt(job1_sum * job2_sum)  # 余弦计算相似度
    return similar_value


# 协同过滤推荐算法
def recommend_by_item_id(user_id, k=9):

    jobs_id = models.SendList.objects.filter(user_id=user_id).values('job_id')
    print(jobs_id)
    key_word_list = []  # 找出用户投递的职位关键字
    for job in jobs_id:
        key_word_list.append(models.JobData.objects.get(job_id=job['job_id']).key_word)
    print(key_word_list)
    key_word_list_1 = list(set(key_word_list))
    user_prefer = []
    for key_word in key_word_list_1:
        user_prefer.append([key_word, key_word_list.count(key_word)])
    user_prefer = sorted(user_prefer, key=lambda x:x[1], reverse=True)  # 排序
    user_prefer = [x[0] for x in user_prefer[0:3]]  # 找出最多的3个投递简历的key_word
    print(user_prefer)
    current_user = models.UserList.objects.get(user_id=user_id)
    if current_user.sendlist_set.count() == 0:
        if current_user.userexpect_set.count() != 0:
            user_expect = list(models.UserExpect.objects.filter(user=user_id).values("key_word", "place"))[0]
            # print(user_expect)
            job_list = list(models.JobData.objects.filter(name__icontains=user_expect['key_word'], place__icontains=user_expect['place']).values())  # 从用户设置的意向中选
            job_list = random.sample(job_list, 9)  # 随机9个推荐
            # print(job_list)
        else:
            job_list = list(models.JobData.objects.all().values())  # 从全部的职位中选
            # job_list = random.sample(job_list, 9)  # 随机9个推荐
        # print('from here')
        # print(job_list)
        return job_list
    # # most_tags = Tags.objects.annotate(tags_sum=Count('name')).order_by('-tags_sum').filter(movie__rate__user_id=user_id).order_by('-tags_sum')
    un_send = list(models.JobData.objects.filter(~Q(sendlist__user=user_id), key_word__in=user_prefer).order_by('?').values())[:30]  # 没有投过的简历
    send = []  # 找出用户投递的职位关键字
    for job in jobs_id:
        send.append(models.JobData.objects.filter(job_id=job['job_id']).values()[0])
    # print(send)
    distances = []
    names = []
    for un_send_job in un_send:
        for send_job in send:
            if un_send_job not in names:
                names.append(un_send_job)
                distances.append((similarity(un_send_job['job_id'], send_job['job_id']) * send_job['job_id'], un_send_job)) 
    distances.sort(key=lambda x: x[0], reverse=True)
    # print('this is distances', distances[:15])
    recommend_list = []
    for mark, job in distances:
        if len(recommend_list) >= k:
            break
        if job not in recommend_list:
            recommend_list.append(job)
    # print('this is recommend list', recommend_list)
    print('recommend list', recommend_list)
    return recommend_list

在这里插入图片描述

部分解析:

本模块基于机器学习协同过滤算法实现招聘职位推荐功能,系统分析用户的投递历史和求职意向,了解用户的偏好。根据用户投递过的职位关键字和意向,计算职位之间的相似度,优先推荐与用户兴趣相关的职位。最终系统处理推荐结果,选择最匹配用户兴趣的职位进行推荐,提升用户求职体验和成功率。

  1. similarity 函数

计算两个职位之间的相似度,使用的是余弦相似度方法。

def similarity(job1_id, job2_id):
    job1_set = models.SendList.objects.filter(job=job1_id)
    job1_sum = job1_set.count()  # job1的投递用户数
    job2_sum = models.SendList.objects.filter(job=job2_id).count()  # job2的投递用户数
    common = models.SendList.objects.filter(user__in=Subquery(job1_set.values('user')), job=job2_id).values('user').count()  # 两者的交集
    
    if job1_sum == 0 or job2_sum == 0:
        return 0
    
    similar_value = common / sqrt(job1_sum * job2_sum)  # 计算余弦相似度
    return similar_value
  • job1_set:获取投递了职位 job1_id 的所有用户。
  • job1_sumjob2_sum:分别计算职位 job1_idjob2_id 的投递用户数。
  • common:计算投递了职位 job1_id 的用户中,有多少也投递了职位 job2_id
  • 如果其中一个职位没有用户投递,返回相似度为0。
  • 使用余弦相似度公式 common / sqrt(job1_sum * job2_sum) 计算相似度。
  1. recommend_by_item_id 函数

这个函数根据用户的历史投递记录推荐职位。

def recommend_by_item_id(user_id, k=9):
    jobs_id = models.SendList.objects.filter(user_id=user_id).values('job_id')
    key_word_list = []  # 用户投递的职位关键字
    
    for job in jobs_id:
        key_word_list.append(models.JobData.objects.get(job_id=job['job_id']).key_word)
    
    key_word_list_1 = list(set(key_word_list))
    user_prefer = []
    
    for key_word in key_word_list_1:
        user_prefer.append([key_word, key_word_list.count(key_word)])
    
    user_prefer = sorted(user_prefer, key=lambda x:x[1], reverse=True)  # 排序
    user_prefer = [x[0] for x in user_prefer[0:3]]  # 选出最多的3个关键字
    
    current_user = models.UserList.objects.get(user_id=user_id)
    
    if current_user.sendlist_set.count() == 0:
        if current_user.userexpect_set.count() != 0:
            user_expect = list(models.UserExpect.objects.filter(user=user_id).values("key_word", "place"))[0]
            job_list = list(models.JobData.objects.filter(name__icontains=user_expect['key_word'], place__icontains=user_expect['place']).values())
            job_list = random.sample(job_list, 9)  # 随机推荐9个职位
        else:
            job_list = list(models.JobData.objects.all().values())  # 从全部职位中选
            # job_list = random.sample(job_list, 9)  # 可选:从所有职位中随机推荐9个职位
        return job_list
    
    un_send = list(models.JobData.objects.filter(~Q(sendlist__user=user_id), key_word__in=user_prefer).order_by('?').values())[:30]  # 未投递过的职位
    
    send = []  # 用户投递过的职位
    for job in jobs_id:
        send.append(models.JobData.objects.filter(job_id=job['job_id']).values()[0])
    
    distances = []
    names = []
    
    for un_send_job in un_send:
        for send_job in send:
            if un_send_job not in names:
                names.append(un_send_job)
                distances.append((similarity(un_send_job['job_id'], send_job['job_id']) * send_job['job_id'], un_send_job))
    
    distances.sort(key=lambda x: x[0], reverse=True)
    recommend_list = []
    
    for mark, job in distances:
        if len(recommend_list) >= k:
            break
        if job not in recommend_list:
            recommend_list.append(job)
    
    return recommend_list
  • jobs_id:获取用户投递的所有职位 ID。
  • key_word_list:收集用户投递的所有职位的关键字。
  • user_prefer:统计用户投递中每个关键字出现的次数,并根据出现次数排序,选择前3个最常见的关键字。
  • current_user:获取当前用户的信息。
  • 如果用户没有投递过任何职位:
    • user_expect:从用户意向中筛选职位。
    • 如果用户意向设置中有信息,则根据关键字和地点从职位数据中筛选,随机选择9个职位作为推荐。
    • 如果没有意向设置,则从所有职位中选择。
  • 如果用户已经投递过职位:
    • un_send:筛选出用户未投递过的、包含用户偏好的关键字的职位。
    • send:获取用户投递过的职位信息。
    • 计算用户未投递职位与已投递职位之间的相似度,按相似度排序。
    • 从排序后的职位中选择前 k 个作为推荐结果。

六、数据采集模块

该模块主要实现网页请求与解析,数据清洗与存储,爬虫调度,异常处理与日志记录以及定时任务等功能,确保采集到的数据准确、完整、实时更新,为后续的数据分析和推荐算法提供可靠的数据基础。用户可以通过前端页面选择不同城市、爬取页数和职位关键字进行数据采集,系统自动触发爬虫程序执行任务。通过该模块的实现,用户可以获取到全面的招聘信息,并基于此进行数据可视化分析和职位推荐,提升求职体验和效率。首先程序通过Selenium库模拟浏览器操作,打开指定的URL(城市列表页)并等待加载完成。接着,使用XPath解析页面源码,提取城市的名称和对应的代码,形成城市列表。然后,定义了一个函数 get_pages(url) 用来爬取指定页面的职位信息。然后使用Selenium打开URL,等待页面加载完成后,解析HTML并提取职位相关信息,如职位名称、薪资、地址、学历要求、经验要求、公司名称等。通过XPath提取公司的标签和规模,并处理职位链接,确保链接的唯一性。随后连接数据库,并通过SQL语句查询已存在的职位链接,如果新爬取的链接不在数据库中,则将相关信息插入数据库中。最后,关闭数据库连接,关闭浏览器。爬虫流程一步步执行,确保了数据的准确性和完整性。同时,通过合理的等待时间和异常处理,保证了程序的稳定性。

在这里插入图片描述

七、数据管理模块

在这里插入图片描述

数据爬虫部分过程图如下所示

在这里插入图片描述

八、部分数据展示

数据清洗处理后的数据库部分数据展示

在这里插入图片描述

九、项目截图

系统用户登录

在这里插入图片描述

系统控制台首页

在这里插入图片描述

在这里插入图片描述

招聘岗位薪资待遇可视化分析

在这里插入图片描述

招聘岗位学历要求数据可视化分析

在这里插入图片描述

招聘职位关键字可视化分析

在这里插入图片描述

岗位数据不同维度参数数据检索

在这里插入图片描述

在这里插入图片描述

系统招聘数据爬虫调度

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

求职意向分析

在这里插入图片描述

机器学习协同过滤算法职位推荐

在这里插入图片描述

在这里插入图片描述

招聘岗位求职投递信息

在这里插入图片描述

在这里插入图片描述

十、结语

关注星川后续有时间精力会持续分享更多关于大数据领域方面的优质内容。需项目资料/商业合作/交流探讨等可以添加下面个人名片,感谢各位的喜欢与支持!

评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星川皆无恙

如果对您有所帮助,感谢您的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值