找回密码
 会员注册
查看: 24|回复: 0

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

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
65016
发表于 2024-9-11 15:05:18 | 显示全部楼层 |阅读模式
文章目录大数据推荐算法招聘数据分析:基于Python招聘大数据爬虫数据可视化分析推荐系统一、项目概述二、项目说明三、研究意义四、系统总体架构设计总体框架技术架构五、部分模块核心代码六、数据采集模块七、数据管理模块八、部分数据展示九、项目截图系统用户登录系统控制台首页招聘岗位薪资待遇可视化分析招聘岗位学历要求数据可视化分析招聘职位关键字可视化分析岗位数据不同维度参数数据检索系统招聘数据爬虫调度求职意向分析机器学习协同过滤算法职位推荐招聘岗位求职投递信息十、结语大数据推荐算法招聘数据分析:基于Python招聘大数据爬虫数据可视化分析推荐系统一、项目概述系统涵盖了多个关键功能,包括使用selenium库进行数据爬取、爬虫调度、以及在前端页面上选择不同的城市、爬取页数和职位关键字进行数据爬取。此外,系统还包括数据管理和可视化功能,能够对薪资待遇、学历分布和职位关键字进行可视化分析。为了进一步提升系统的智能化,使用了机器学习算法中的协同过滤来实现selenium功能。具体而言,该功能支持用户设置求职意向,并根据用户的需求为其推荐相关职位,并将推荐结果展示在求职列表中。在后台管理方面,系统提供了用户设置和管理功能,方便用户自定义各项参数以及管理已爬取的数据。需要注意的是,系统主要针对猎聘网进行数据爬取。通过本次毕设的研究和开发,旨在构建一个功能完善、易用且具有实际应用价值的招聘数据爬虫可视化分析推荐系统。通过该系统,用户能够灵活地进行数据爬取,并通过可视化分析洞察行业动态。机器学习算法的应用则为用户提供了个性化的职位推荐,让求职过程更加高效和精准。二、项目说明随着互联网的快速发展,招聘行业正经历着数字化转型的进程。在线招聘平台成为求职者和招聘企业之间联系的重要桥梁。然而,现有的招聘数据常常分散在不同的网站和平台中,手动收集和整理这些数据变得非常耗时且容易出错。因此,开发一种高效、自动化的招聘数据爬虫可视化分析推荐系统对于提升招聘过程的效率和准确性具有重要意义。本研究旨在基于Python构建招聘数据爬虫可视化分析推荐系统,其中包含了selenium爬虫和爬虫调度等核心功能。通过使用Python中的selenium库,们能够自动获取并爬取猎聘网等主要招聘网站上的数据。爬虫调度模块允许用户在前端页面选择不同的城市、爬取页数和职位关键字,从而实现灵活的数据爬取。除了数据爬取,系统还提供了数据管理功能,确保爬取到的数据的完整性和一致性。另外,系统还支持数据可视化功能,包括薪资待遇、学历分布和职位关键字的可视化分析。通过这些功能,用户可以更直观地了解招聘市场的薪资水平,不同学历的需求趋势以及职位关键字的热门程度,从而做出更明智的职业规划和求职决策。本研究还引入了机器学习算法中的协同过滤技术,以提供个性化的职位推荐服务。用户可以设置自己的求职意向,系统将根据用户的需求以及历史数据分析,为其推荐最相关的职位,并将这些推荐结果展示在求职列表中。这种职位推荐技术将大大提高求职者的匹配度和成功率,为他们节省时间和精力。三、研究意义该系统将通过整合爬虫技术和数据分析方法,实现对招聘信息的自动化获取、清洗和分析,为求职者提供更加准确、全面的职业发展支持。此外,系统中的机器学习算法还将根据用户的个人需求和行为习惯,为其提供个性化的职位推荐,有助于提升求职匹配度和成功率。因此,本研究的意义在于为求职者提供更加便捷、智能的求职服务,促进社会经济的健康发展。四、系统总体架构设计总体框架技术架构五、部分模块核心代码#计算相似度defsimilarity(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()#没有人投递当前职位ifjob1_sum==0orjob2_sum==0:return0similar_value=common/sqrt(job1_sum*job2_sum)#余弦计算相似度returnsimilar_value#协同过滤推荐算法defrecommend_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=[]#找出用户投递的职位关键字forjobinjobs_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=[]forkey_wordinkey_word_list_1:user_prefer.append([key_word,key_word_list.count(key_word)])user_prefer=sorted(user_prefer,key=lambdax:x[1],reverse=True)#排序user_prefer=[x[0]forxinuser_prefer[0:3]]#找出最多的3个投递简历的key_wordprint(user_prefer)current_user=models.UserList.objects.get(user_id=user_id)ifcurrent_user.sendlist_set.count()==0:ifcurrent_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('fromhere')#print(job_list)returnjob_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=[]#找出用户投递的职位关键字forjobinjobs_id:send.append(models.JobData.objects.filter(job_id=job['job_id']).values()[0])#print(send)distances=[]names=[]forun_send_jobinun_send:forsend_jobinsend:ifun_send_jobnotinnames: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=lambdax:x[0],reverse=True)#print('thisisdistances',distances[:15])recommend_list=[]formark,jobindistances:iflen(recommend_list)>=k:breakifjobnotinrecommend_list:recommend_list.append(job)#print('thisisrecommendlist',recommend_list)print('recommendlist',recommend_list)returnrecommend_list12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970部分解析:本模块基于机器学习协同过滤算法实现招聘职位推荐功能,系统分析用户的投递历史和求职意向,了解用户的偏好。根据用户投递过的职位关键字和意向,计算职位之间的相似度,优先推荐与用户兴趣相关的职位。最终系统处理推荐结果,选择最匹配用户兴趣的职位进行推荐,提升用户求职体验和成功率。similarity函数计算两个职位之间的相似度,使用的是余弦相似度方法。defsimilarity(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()#两者的交集ifjob1_sum==0orjob2_sum==0:return0similar_value=common/sqrt(job1_sum*job2_sum)#计算余弦相似度returnsimilar_value1234567891011job1_set:获取投递了职位job1_id的所有用户。job1_sum和job2_sum:分别计算职位job1_id和job2_id的投递用户数。common:计算投递了职位job1_id的用户中,有多少也投递了职位job2_id。如果其中一个职位没有用户投递,返回相似度为0。使用余弦相似度公式common/sqrt(job1_sum*job2_sum)计算相似度。recommend_by_item_id函数这个函数根据用户的历史投递记录推荐职位。defrecommend_by_item_id(user_id,k=9):jobs_id=models.SendList.objects.filter(user_id=user_id).values('job_id')key_word_list=[]#用户投递的职位关键字forjobinjobs_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=[]forkey_wordinkey_word_list_1:user_prefer.append([key_word,key_word_list.count(key_word)])user_prefer=sorted(user_prefer,key=lambdax:x[1],reverse=True)#排序user_prefer=[x[0]forxinuser_prefer[0:3]]#选出最多的3个关键字current_user=models.UserList.objects.get(user_id=user_id)ifcurrent_user.sendlist_set.count()==0:ifcurrent_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个职位returnjob_listun_send=list(models.JobData.objects.filter(~Q(sendlist__user=user_id),key_word__in=user_prefer).order_by('?').values())[:30]#未投递过的职位send=[]#用户投递过的职位forjobinjobs_id:send.append(models.JobData.objects.filter(job_id=job['job_id']).values()[0])distances=[]names=[]forun_send_jobinun_send:forsend_jobinsend:ifun_send_jobnotinnames: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=lambdax:x[0],reverse=True)recommend_list=[]formark,jobindistances:iflen(recommend_list)>=k:breakifjobnotinrecommend_list:recommend_list.append(job)returnrecommend_list1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253jobs_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语句查询已存在的职位链接,如果新爬取的链接不在数据库中,则将相关信息插入数据库中。最后,关闭数据库连接,关闭浏览器。爬虫流程一步步执行,确保了数据的准确性和完整性。同时,通过合理的等待时间和异常处理,保证了程序的稳定性。七、数据管理模块数据爬虫部分过程图如下所示八、部分数据展示数据清洗处理后的数据库部分数据展示九、项目截图系统用户登录系统控制台首页招聘岗位薪资待遇可视化分析招聘岗位学历要求数据可视化分析招聘职位关键字可视化分析岗位数据不同维度参数数据检索系统招聘数据爬虫调度求职意向分析机器学习协同过滤算法职位推荐招聘岗位求职投递信息十、结语关注星川后续有时间精力会持续分享更多关于大数据领域方面的优质内容。需项目资料/商业合作/交流探讨等可以添加下面个人名片,感谢各位的喜欢与支持!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-29 12:48 , Processed in 1.252909 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表