💕💕作者:计算机源码社
💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流!
💕💕学习资料、程序开发、技术解答、文档报告
💕💕如需要源码,可以扫取文章下方二维码联系咨询

💕💕Java项目
💕💕微信小程序项目
💕💕Android项目
💕💕Python项目
💕💕PHP项目
💕💕ASP.NET项目
💕💕Node.js项目
💕💕选题推荐

项目实战|基于爬虫技术程序员薪资数据分析与可视化python

1、研究背景

  随着信息技术的发展,程序员的职业需求和薪资水平成为众多求职者和企业关注的焦点。然而,由于招聘市场信息的分散性,程序员在求职过程中难以全面了解行业趋势和薪资水平。传统的求职方式无法有效整合各类招聘数据,导致信息不对称的问题。这种背景下,基于Python的程序员薪资数据分析可视化与岗位推荐系统应运而生,旨在通过数据采集、清洗和可视化展示,为求职者和招聘企业提供全面的市场信息,帮助他们做出更加明智的决策。

2、研究目的和意义

  本系统的开发目的在于通过大规模数据的收集与分析,揭示程序员招聘市场的关键趋势,帮助用户更好地理解薪资分布、公司需求和市场竞争状况。通过可视化分析,用户可以直观地看到招聘市场的薪资区间、公司规模、学历要求等重要信息。系统还提供岗位推荐功能,根据用户的个人信息和求职偏好,智能推荐合适的招聘信息,提高求职效率和成功率。通过这些功能,本系统旨在为程序员和招聘企业搭建一个信息对称、决策支持的平台。

  本系统的开发具有重要的现实意义,它为程序员提供了一个全面了解行业薪资水平和招聘趋势的工具,帮助他们做出更有依据的职业选择。系统的数据分析和可视化功能为企业招聘提供了数据支持,帮助企业更精准地制定招聘策略,吸引优质人才。通过岗位推荐功能,系统还能提高求职者与招聘岗位的匹配度,缩短求职周期。整体而言,本系统的开发不仅提升了求职和招聘的效率,还促进了劳动力市场的信息透明化,对行业发展具有积极的推动作用。

3、系统研究内容

本文旨在开发一个基于Python的程序员薪资数据分析可视化与岗位推荐系统,系统涵盖数据采集、数据处理、数据存储、可视化分析及岗位推荐五个主要模块。首先,使用Scrapy爬虫技术从前程无忧51job招聘网获取程序员薪资相关的招聘数据,包括职位名称、公司信息、薪资范围、学历要求、公司规模等。爬取的数据经过数据处理和清洗,去除冗余和无效数据,并将整理后的数据存储到MySQL数据库中,以确保数据的完整性和一致性。

接下来通过Echarts可视化技术,对存储的数据进行多维度的分析和展示。可视化内容包括程序员职位的招聘数量、各大公司的招聘词云、薪资区间的分布情况、职位的学历要求和招聘公司的规模等。这些可视化图表能够直观反映出市场上的需求情况和薪资水平,为用户提供有价值的参考信息。

最后基于Python和Flask框架,开发一个Web平台,用户可以通过该平台注册、登录,并访问不同的功能模块。系统还包括一个智能岗位推荐模块,根据用户的个人信息和求职偏好,利用推荐算法从数据库中筛选出最匹配的职位信息。系统还提供招聘数据管理、用户管理、论坛交流和系统管理等功能,为用户和管理员提供全方位的服务。通过这些研究内容,系统将为程序员提供全面的市场分析与智能求职推荐,提升求职效率和职业选择的科学性。

4、系统页面设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如需要源码,可以扫取文章下方二维码联系咨询

5、参考文献

[1]魏从政,郭莹莹,翟文帅,等.基于企业视角的商务数据分析人才需求分析[J].现代商贸工业,2024,45(18):122-124.DOI:10.19311/j.cnki.1672-3198.2024.18.041.
[2]李浩,郭嘉莉,梁艳,等.网络招聘的人岗匹配度算法研究[J].电脑与信息技术,2024,32(04):19-22+35.DOI:10.19414/j.cnki.1005-1228.2024.04.027.
[3]曾静,廖书真.基于PyEcharts的招聘数据可视化分析[J].长江信息通信,2024,37(06):169-172.DOI:10.20153/j.issn.2096-9759.2024.06.051.
[4]郝琳琳.招聘大数据分析在优化人才培养方案中的应用[J].河北软件职业技术学院学报,2024,26(01):27-29.DOI:10.13314/j.cnki.jhbsi.2024.01.012.
[5]李康泉,曾小娟,罗志聪,等.基于Python的招聘大数据分析展示系统设计与实现[J].玩具世界,2024,(03):185-187.
[6]郭瑾.基于Python的招聘数据爬取与数据可视化分析研究[J].轻工科技,2024,40(02):94-96+99.
[7]付腾达,李卫勇,王士信,等.基于Python爬虫技术的招聘信息数据可视化分析[J].电脑知识与技术,2024,20(07):77-82.DOI:10.14004/j.cnki.ckt.2024.0464.
[8]熊春雨,刘先红.基于招聘数据的信管专业人才需求分析及培养启示[J].江苏科技信息,2024,41(02):20-24.
[9]王姣姣,姚华平.基于数据挖掘技术的数据类岗位招聘信息分析与研究[J].现代信息科技,2024,8(02):13-16+20.DOI:10.19850/j.cnki.2096-4706.2024.02.004.
[10]蔡文乐,秦立静.基于Python爬虫的招聘数据可视化分析[J].物联网技术,2024,14(01):102-105.DOI:10.16667/j.issn.2095-1302.2024.01.028.
[11]徐倩,黄雨薇,符传山,等.基于招聘大数据的IT人才能力模型构建研究[J].软件导刊,2024,23(01):209-214.
[12]吕倩.大数据时代企业招聘有效性分析[J].现代企业文化,2023,(35):137-140.
[13]杜宇灏,闫长青,李环宇.招聘网站数据薪资K-means聚类分析可视化[J].现代计算机,2023,29(23):64-68+91.
[14]廖培钰,陈泳珊,刘庆沛,等.大数据视角下对企业网络招聘问题的研究与建议[J].现代商业,2023,(23):153-156.DOI:10.14097/j.cnki.5392/2023.23.028.
[15]王姣姣,顾珅,赵淼,等.基于FineBI的招聘信息数据分析与可视化研究[J].计算机时代,2023,(12):15-18+23.DOI:10.16644/j.cnki.cn33-1094/tp.2023.12.004.
[16]张国荣,李斯伦,黄师伦,等.大数据背景下的旅游电子商务人才变革与培养策略——基于前程无忧人才网招聘信息的量化分析[J].广东职业技术教育与研究,2023,(11):95-100.DOI:10.19494/j.cnki.issn1674-859x.2023.11.020.
[17]王瑞.基于数据挖掘的电商女装个性化需求分析和预测研究[D].南京邮电大学,2023. DOI:10.27251/d.cnki.gnjdc.2023.001199.
[18]谢宁宁,杨新凯.融合语义特征和统计特征的虚假招聘检测模型[J].计算机与数字工程,2023,51(10):2379-2383.
[19]姜永成.基于Django的网络招聘数据可视化分析系统的设计与实现[J].科技资讯,2023,21(19):57-60.DOI:10.16661/j.cnki.1672-3791.2306-5042-4316.
[20]高凤毅,葛苏慧,林喜文,等.基于Python的招聘网站数据爬取与分析[J].电脑编程技巧与维护,2023,(09):70-72.DOI:10.16184/j.cnki.comprg.2023.09.006.

6、核心代码

# 数据爬取文件

import scrapy
import pymysql
import pymssql
from ..items import ZhaopinxinxiItem
import time
import re
import random
import platform
import json
import os
from urllib.parse import urlparse
import requests
import emoji

# 招聘信息
class ZhaopinxinxiSpider(scrapy.Spider):
    name = 'zhaopinxinxiSpider'
    spiderUrl = 'https://cupid.51job.com/open/noauth/search-pc?api_key=51job&timestamp=1677042252&keyword=IT&searchType=2&function=&industry=&jobArea=000000&jobArea2=&landmark=&metro=&salary=&workYear=&degree=&companyType=&companySize=&jobType=&issueDate=&sortType=0&pageNum={}&requestId=93c1897338e6048f265dfc743365ecb2&pageSize=50&source=1&accountId=&pageCode=sou%7Csou%7Csoulb'
    start_urls = spiderUrl.split(";")
    protocol = ''
    hostname = ''
    headers = {
        "Referer":"https://we.51job.com/",
"sign":"1b6fc833afc4bbdfeb814c2d29fd34a1015e8d21eb0f1e7d61f45cd504c12f5f"
    }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def start_requests(self):

        plat = platform.system().lower()
        if plat == 'linux' or plat == 'windows':
            connect = self.db_connect()
            cursor = connect.cursor()
            if self.table_exists(cursor, '05zp2_zhaopinxinxi') == 1:
                cursor.close()
                connect.close()
                self.temp_data()
                return

        pageNum = 1 + 1
        for url in self.start_urls:
            if '{}' in url:
                for page in range(1, pageNum):
                    next_link = url.format(page)
                    yield scrapy.Request(
                        url=next_link,
                        headers=self.headers,
                        callback=self.parse
                    )
            else:
                yield scrapy.Request(
                    url=url,
                    callback=self.parse
                )

    # 列表解析
    def parse(self, response):
        
        _url = urlparse(self.spiderUrl)
        self.protocol = _url.scheme
        self.hostname = _url.netloc
        plat = platform.system().lower()
        if plat == 'windows_bak':
            pass
        elif plat == 'linux' or plat == 'windows':
            connect = self.db_connect()
            cursor = connect.cursor()
            if self.table_exists(cursor, '05zp2_zhaopinxinxi') == 1:
                cursor.close()
                connect.close()
                self.temp_data()
                return

        data = json.loads(response.body)
        list = data["resultbody"]["job"]["items"]
        
        for item in list:

            fields = ZhaopinxinxiItem()




            fields["laiyuan"] = item["jobHref"]
            fields["biaoti"] = item["jobName"]
            fields["gzdz"] = item["jobAreaString"]
            fields["xinzi"] = item["provideSalaryString"]
            fields["gzjy"] = item["workYearString"]
            fields["xlyq"] = item["degreeString"]
            fields["gsmc"] = item["fullCompanyName"]
            fields["gsxz"] = item["companyTypeString"]
            fields["gsgm"] = item["companySizeString"]
            fields["fabushijian"] = item["issueDateString"]


            detailUrlRule = item["jobHref"]

            if detailUrlRule.startswith('http') or self.hostname in detailUrlRule:
                pass
            else:
                detailUrlRule = self.protocol + '://' + self.hostname + detailUrlRule
                fields["laiyuan"] = detailUrlRule

            yield scrapy.Request(url=detailUrlRule, meta={'fields': fields}, callback=self.detail_parse)

    # 详情解析
    def detail_parse(self, response):
        fields = response.meta['fields']



        return fields

    # 去除多余html标签
    def remove_html(self, html):
        if html == None:
            return ''
        pattern = re.compile(r'<[^>]+>', re.S)
        return pattern.sub('', html).strip()

    # 数据库连接
    def db_connect(self):
        type = self.settings.get('TYPE', 'mysql')
        host = self.settings.get('HOST', 'localhost')
        port = int(self.settings.get('PORT', 3306))
        user = self.settings.get('USER', 'root')
        password = self.settings.get('PASSWORD', '123456')

        try:
            database = self.databaseName
        except:
            database = self.settings.get('DATABASE', '')

        if type == 'mysql':
            connect = pymysql.connect(host=host, port=port, db=database, user=user, passwd=password, charset='utf8')
        else:
            connect = pymssql.connect(host=host, user=user, password=password, database=database)

        return connect

    # 断表是否存在
    def table_exists(self, cursor, table_name):
        cursor.execute("show tables;")
        tables = [cursor.fetchall()]
        table_list = re.findall('(\'.*?\')',str(tables))
        table_list = [re.sub("'",'',each) for each in table_list]

        if table_name in table_list:
            return 1
        else:
            return 0

    # 数据缓存源
    def temp_data(self):

        connect = self.db_connect()
        cursor = connect.cursor()
        sql = '''
            insert into zhaopinxinxi(
                laiyuan
                ,biaoti
                ,gzdz
                ,xinzi
                ,gzjy
                ,xlyq
                ,gsmc
                ,gsxz
                ,gsgm
                ,fabushijian
            )
            select
                laiyuan
                ,biaoti
                ,gzdz
                ,xinzi
                ,gzjy
                ,xlyq
                ,gsmc
                ,gsxz
                ,gsgm
                ,fabushijian
            from 05zp2_zhaopinxinxi
            where(not exists (select
                laiyuan
                ,biaoti
                ,gzdz
                ,xinzi
                ,gzjy
                ,xlyq
                ,gsmc
                ,gsxz
                ,gsgm
                ,fabushijian
            from zhaopinxinxi where
             zhaopinxinxi.laiyuan=05zp2_zhaopinxinxi.laiyuan
            and zhaopinxinxi.biaoti=05zp2_zhaopinxinxi.biaoti
            and zhaopinxinxi.gzdz=05zp2_zhaopinxinxi.gzdz
            and zhaopinxinxi.xinzi=05zp2_zhaopinxinxi.xinzi
            and zhaopinxinxi.gzjy=05zp2_zhaopinxinxi.gzjy
            and zhaopinxinxi.xlyq=05zp2_zhaopinxinxi.xlyq
            and zhaopinxinxi.gsmc=05zp2_zhaopinxinxi.gsmc
            and zhaopinxinxi.gsxz=05zp2_zhaopinxinxi.gsxz
            and zhaopinxinxi.gsgm=05zp2_zhaopinxinxi.gsgm
            and zhaopinxinxi.fabushijian=05zp2_zhaopinxinxi.fabushijian
            ))
            limit {0}
        '''.format(random.randint(20,30))

        cursor.execute(sql)
        connect.commit()

        connect.close()

💕💕作者:计算机源码社
💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流!
💕💕学习资料、程序开发、技术解答、文档报告
💕💕如需要源码,可以扫取文章下方二维码联系咨询

Logo

欢迎加入西安开发者社区!我们致力于为西安地区的开发者提供学习、合作和成长的机会。参与我们的活动,与专家分享最新技术趋势,解决挑战,探索创新。加入我们,共同打造技术社区!

更多推荐