精华内容
下载资源
问答
  • 梦行分类信息系统 应用场景 同城/行业 信息平台(租房 交友 找工作 二手市场) 应用方向举例:58赶集 百姓 行业供求网 自定义信息分类 信息输入项 妈妈再也不用担心我的二次开发费用了 单行文本 多行文本 多文件...
  • 求职招聘系统设计为3大...管理员模块包括:具有信息审核、检索功能(包括职位检索和人才检索)、信息管理(如发布和管理就业新闻、就业政策及法规、用人单位推荐、人才推荐和招聘信息等功能),希望对大家有所帮助。
  • 随着全球信息向网络化方向的发展,互联网成为人们快速获取、发布和传递信息的重要渠道,它在人们政治、经济、生活等各个方面发挥着重要的作用,彻底改变了人类的工作、生活、学习和娱乐方式,已成为国家经济和区域性...
  • 2.利用爬虫技术爬取某招聘网站数据,包括岗位名称,公司名称,薪资待遇,工作经验字段,拥有分页功能展示爬取的数据信息, 可以点开查看详细岗位描述信息,可以根据岗位名称进行快速筛选招聘数据。 3.系统拥有词云...
  • 目前,毕业生就业信息管理已成为高校工作的重要组成部分之一,若继续采取传统的手工...毕业生就业信息管理及招聘系统主要实现了对招聘信息、简历信息、帖子信息的发布和管理,给企业和个人用户建立了一个交流的平台
  • 在线求职招聘平台网站模板是一款适合找工作就位信息发布平台HTML网站模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。
  • jsp,ssm,是个具有公司、求职者的一个 平台,并且有管理员操作,内容丰富,界面 优秀
  • Jobs 2021-2021的招聘信息 在这些动荡的时期,找到工作非常具有挑战性。 本文档集中了互联网上寻找工作的信息。 我用于寻找工作和帮助他人的相同资源。 随时与您的朋友分享。 应用领域 新毕业生: 实习: 有用的链接...
  • 招聘信息爬取与分析

    千次阅读 2020-05-06 17:19:26
    招聘信息爬取与分析 写在前面 作为874万应届毕业生中的一员,近期也在积极地找工作,于是爬取了意向岗位以及相关岗位的信息,并对岗位分布、薪资情况、学历、公司规模与行业等进行了分析。 主要流程 数据爬取mysql...

    招聘信息爬取与分析

    写在前面

    作为874万应届毕业生中的一员,近期也在积极地找工作,于是爬取了意向岗位以及相关岗位的信息,并对岗位分布、薪资情况、学历、公司规模与行业等进行了分析。
    主要流程

    数据爬取
    mysql
    数据清洗
    数据分析
    数据可视化

    数据爬取

    招聘网站选的是51job,爬取的岗位关键字有[ ‘人工智能’,‘机器学习’, ‘数据分析’, ‘数据挖掘’, ‘算法工程师’,‘深度学习’,‘语音识别’,‘图像处理’,‘自然语言处理’],因为不同关键字会出现某些相同的岗位,故在爬取的过程中利用增量爬取的思想,设置了指纹。
    爬取流程

    分析url
    爬取一级页面部分信息及二级页面url
    redis增量
    mysql存储

    url分析

    self.url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,%s,2,%d.html'        
    

    %s,%d分别表示输入关键字和页码。

    一级页面爬取
    页码随输入关键字变化而变化,要在第一页上对页码进行获取,在这里获取页码后以字典的形式存储起来
    requests.get()获取页面,xpath对页面进行解析

    def get_html(self,url):
        try:
             html = requests.get(url=url,headers={'User-Agent':UserAgent().random},timeout=3).content.decode('gb2312',errors="ignore")
             return etree.HTML(html)
         except:
             print('sleep')
             sleep(uniform(200,300))
             return self.get_html(url)
    

    获取岗位页码字典

    def get_job_page_dict(self,url,job):
        p = self.get_html(url)
        s = p.xpath('//div[@class="dw_tlc"]/div[4]/text()')[0]
        page = ceil(int(re.findall('\d+',s)[0])/50)
        self.job_page_dict[job]=page
    

    爬取一级页面上岗位链接、岗位名称、公司名称、工作地点、薪资以及发布日期信息,做增量爬取,增量爬取利用了Redis集合的性质。若该岗位未被爬取过,将其部分新存储在列表中。

    一级页面信息获取

    def get_one_html(self,url,k):
        p = self.get_html(url)
        job_href_list = p.xpath('//div[@class="el"]/p/span/a/@href')
        job_name_list = p.xpath('//div[@class="dw_table"]//p/span/a/@title')
        comapny_list = p.xpath('//div[@class="el"]/span[1]/a/@title')
        location_list = p.xpath('//div[@class="el"]/span[@class="t3"]/text()')
        salary_list = p.xpath('//div[@class="el"]/span[@class="t4"]/text()')
        pubdate_list = p.xpath('//div[@class="el"]/span[@class="t5"]/text()')
    
        for href,name,company,location,salary,pubdate in zip(job_href_list,job_name_list,comapny_list,location_list,salary_list,pubdate_list):
            href_md5 = self.href_md5(href)
            if self.r.sadd('job:href',href_md5)==1:
                self.info.extend([name,k,company,location,salary,'2020-'+pubdate])
                self.get_two_html(href)
                self.save_info()
                self.info = []
                sleep(uniform(0.2, 0.8))
            else:
                continue
            self.if_sleep()
    

    增量爬取指纹设置

    def href_md5(self,href):
        s = md5()
        s.update(href.encode())
        return s.hexdigest()
    

    二级页面爬取
    获取二级页面中工作经验、学历、公司规模、公司类型、所在行业以及具体的岗位描述信息,其中工作经验学历的信息在一起描述,这里先爬下来后续再做处理,获取信息后添加到岗位信息列表中。

    def get_two_html(self, url):
         p = self.get_html(url)
         try:
             experienct_education = '|'.join(p.xpath('//div[@class="cn"]/p[@class="msg ltype"]/text()')).replace('\xa0', '')
             company_type = p.xpath('//div[@class="com_tag"]/p[1]/@title')[0]
             company_scale = p.xpath('//div[@class="com_tag"]/p[2]/@title')[0]
             industry = p.xpath('//div[@class="com_tag"]/p[3]/@title')[0]
             job_describe = ''.join(p.xpath('//div[@class="bmsg job_msg inbox"]/p/text()')).replace('\xa0', '')
             self.info.extend([experienct_education,company_type,company_scale,industry,job_describe])
         except Exception as e:
             print(e)
    

    mysql存储
    每获取完一条岗位的信息,就对其进行存储,然后清空岗位信息列表。

    def save_info(self):
        sql = 'insert into job51(job_name,job_type,company,location,salary,pubdate,experience_education,company_type,company_scale,industry,job_describe) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
        try:
            self.cur.execute(sql,self.info)
            self.db.commit()
            self.count += 1
            print('save %d!'%self.count)
        except Exception as e:
            self.db.rollback()
            print(e)
    

    反爬设置
    在代码中设置了比较多处的休眠时间,每获取完一页岗位信息,休眠0.1-2秒,每获取完一个岗位信息休眠0.2-0.8秒,每501页休眠20-100秒,链接过多报错时休眠200-300秒,此外还利用fake_useragent设置了User-Agent池。

    完整代码
    写了一个类,可以稍作修改,对其他岗位进行爬取。

    import requests
    from lxml import etree
    from time import sleep
    from fake_useragent import UserAgent
    from math import ceil
    from random import uniform
    import re
    import redis
    from hashlib import md5
    import pymysql
    
    
    class JobSpider:
        def __init__(self,job_list):
            self.url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,%s,2,%d.html'
            self.job_list = job_list
            self.job_page_dict = {}
            self.r = redis.Redis(host='localhost',port=6379,db=0)
            self.db = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123456',database='spider',charset='utf8')
            self.cur = self.db.cursor()
            self.info = []
            self.count = 0
    
    
    
        def get_html(self,url):
            try:
                html = requests.get(url=url,headers={'User-Agent':UserAgent().random},timeout=3).content.decode('gb2312',errors="ignore")
                return etree.HTML(html)
            except:
                print('sleep')
                sleep(uniform(200,300))
                return self.get_html(url)
    
    
    
    
        def get_job_page_dict(self,url,job):
            p = self.get_html(url)
            s = p.xpath('//div[@class="dw_tlc"]/div[4]/text()')[0]
            page = ceil(int(re.findall('\d+',s)[0])/50)
            self.job_page_dict[job]=page
    
    
        def href_md5(self,href):
            s = md5()
            s.update(href.encode())
            return s.hexdigest()
    
        def get_one_html(self,url,k):
            p = self.get_html(url)
            job_href_list = p.xpath('//div[@class="el"]/p/span/a/@href')
            job_name_list = p.xpath('//div[@class="dw_table"]//p/span/a/@title')
            comapny_list = p.xpath('//div[@class="el"]/span[1]/a/@title')
            location_list = p.xpath('//div[@class="el"]/span[@class="t3"]/text()')
            salary_list = p.xpath('//div[@class="el"]/span[@class="t4"]/text()')
            pubdate_list = p.xpath('//div[@class="el"]/span[@class="t5"]/text()')
    
            for href,name,company,location,salary,pubdate in zip(job_href_list,job_name_list,comapny_list,location_list,salary_list,pubdate_list):
                href_md5 = self.href_md5(href)
                if self.r.sadd('job:href',href_md5)==1:
                    self.info.extend([name,k,company,location,salary,'2020-'+pubdate])
                    self.get_two_html(href)
                    self.save_info()
                    self.info = []
                    sleep(uniform(0.2, 0.8))
                else:
                    continue
                self.if_sleep()
    
    
        def get_two_html(self, url):
            p = self.get_html(url)
            try:
                experienct_education = '|'.join(p.xpath('//div[@class="cn"]/p[@class="msg ltype"]/text()')).replace('\xa0', '')
                company_type = p.xpath('//div[@class="com_tag"]/p[1]/@title')[0]
                company_scale = p.xpath('//div[@class="com_tag"]/p[2]/@title')[0]
                industry = p.xpath('//div[@class="com_tag"]/p[3]/@title')[0]
                job_describe = ''.join(p.xpath('//div[@class="bmsg job_msg inbox"]/p/text()')).replace('\xa0', '')
                self.info.extend([experienct_education,company_type,company_scale,industry,job_describe])
            except Exception as e:
                print(e)
    
    
        def save_info(self):
            sql = 'insert into job51(job_name,job_type,company,location,salary,pubdate,experience_education,company_type,company_scale,industry,job_describe) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
            try:
                self.cur.execute(sql,self.info)
                self.db.commit()
                self.count += 1
                print('save %d!'%self.count)
            except Exception as e:
                self.db.rollback()
                print(e)
    
        def if_sleep(self):
            if self.count % 501 ==0:
                sleep(uniform(20,100))
    
    
    
        def run(self):
            for job in self.job_list:
                url = self.url%(job,1)
                self.get_job_page_dict(url,job)
            for k,v in self.job_page_dict.items():
                for i in range(1,v+1):
                    url = self.url%(k,i)
                    self.get_one_html(url,k)
                    sleep(uniform(0.1,2))
    
            self.cur.close()
            self.db.close()
    
    
    if __name__ == '__main__':
        job_list = [ '人工智能','机器学习', '数据分析', '数据挖掘', '算法工程师','深度学习','语音识别','图像处理','自然语言处理']
        spider = JobSpider(job_list)
        spider.run()
    

    数据清洗

    数据清洗在mysql做了一部分,之后用python又做了一部分,主要对数据进行规整、去除脏数据、对部分数据进行重构获取新的属性。

    mysql

    如图,尽管在爬取数据时对岗位类别进行了划分,但实际上各岗位之间有交叉的存在,故要对job_name进行规整,对岗位统一命名。
    在这里插入图片描述

    update job51 set job_name='AI' where job_name like '%AI%';
    update job51 set job_name='深度学习' where job_name like '%深度学习%';
    update job51 set job_name='机器学习' where job_name like '%机器学习%';
    update job51 set job_name ='自然语言处理' where job_name like '%自然语言%' or job_name like '%nlp%';
    update job51 set job_name ='图像' where job_name like '%图像%';
    update job51 set job_name =' 数据挖掘' where job_name like '%数据挖掘%';
    update job51 set job_name ='语音' where job_name like '%语音%';
    update job51 set job_name ='人工智能' where job_name like '%人工智能%';
    update job51 set job_name ='算法' where job_name like '%算法%';
    update job51 set job_name ='大数据' where job_name like '%大数据%';
    update job51 set job_name='数据分析' where job_name like "%数据分析%";
    

    处理完各数据分布

    select job_name,count(*) from job51 where job_name in ('人工智能','AI','数据挖掘','语音','图像','自然语言处理','深度学习','机器学习','算法','大数据','数据分析') group by job_name;
    

    在这里插入图片描述

    存储csv
    将目标数据提取出来,存储为csv文件,在jupyter notebook上进行处理。

    import pymysql
    import csv
    db = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123456',database='spider',charset='utf8')
    cur = db.cursor()
    
    s = 'job_id,job_name,job_type,company,location,salary,pubdate,experience_education,company_type,company_scale,industry,job_describe'
    
    columns = s.split(',')
    with open('job51.csv', 'w+') as f:
        w = csv.writer(f)
        w.writerow(columns)
    
    sql ="select %s from job51 where job_name in ('人工智能','AI','数据挖掘','语音','图像','自然语言处理','深度学习','机器学习','算法','大数据','数据分析');"%s
    cur.execute(sql)
    
    file = open('job51.csv', 'a+')
    w = csv.writer(file)
    
    while True:
        row = cur.fetchone()
        if row:
            w.writerow(row)
        else:
            break
    
    file.close()
    cur.close()
    db.close()
    

    python
    在jupyter notebook上利用python(pandas)对数据进行处理,数据有16836条

    查看数据,数据大概长这个样子,要对location、salary、experience_education、industry、job_describe分别进行处理
    在这里插入图片描述
    先删除不必要的数据job_id、job_type

    data.drop(['job_id','job_type'],axis=1,inplace=True)
    

    对工作地点location进行处理
    在这里插入图片描述

    大概看一眼它的值,有异地招聘、xx-xx区、xx省这样的数据。
    首先对异地招聘数据进行处理,在experience_education属性中有相关的城市,可以默认其为岗位所在城市

    cut = data[data['location']=='异地招聘']['experience_education'].str.split('|')
    for index in cut.index:
        data['location'][index]=cut[index][0]
        #data.loc(index,'location')=cut[index][0]
    

    对xx-xx区数据进行处理,对值进行切分,只保留城市信息,构建新列,xx省暂不做处理

    def get_city(x):
        try:
            x=x.split('-')[0]
        except:
            pass
        return x
    
    data['city'] = data['location'].apply(get_city)
    

    处理之后的data[‘city’]
    在这里插入图片描述

    对薪资salary进行处理
    统一单位,拆分成最高薪资和最低薪资,再计算-平均薪资
    薪资单位如下图
    在这里插入图片描述
    统一单位,并获得最高薪资和最低薪资,这里采用了try-except的方法

    def get_max_min_salary(end,mul,x):
        x = x.replace(end,'')
        try:
            _ = x.split('-')
            min_,max_ = float(_[0])*mul,float(_[1])*mul
        except:
            min_=max_=float(x)*mul
        return min_,max_
    def get_salary(x):
        if x.endswith('万/月'):
            min_,max_ = get_max_min_salary('万/月',10000,x)
        elif x.endswith('千/月'):
            min_,max_ = get_max_min_salary('千/月',1000,x)
        elif x.endswith('万/年'):
            min_,max_ = get_max_min_salary('万/年',10000/12,x)
        elif x.endswith('元/天'):
            min_,max_ = get_max_min_salary('元/天',20,x)
        elif x.endswith('千以下/月'):
            min_,max_ = get_max_min_salary('千以下/月',1000,x)
            min_ = None
        elif x.endswith('万以上/年'):
            min_,max_ = get_max_min_salary('万以上/年',10000,x)
            max_ = None
        elif x.endswith('万以上/月'):
            min_,max_ = get_max_min_salary('万以上/月',10000,x)
            min_ = None
        elif x.endswith('万以下/年'):
            min_,max_ = get_max_min_salary('万以下/年',10000,x)
        else:
            min_,max_ = None,None
        return min_,max_
            
    salary = data['salary'].apply(get_salary)
    

    获得最高薪资和最低薪资以及平均薪资

    data['salary_min'],data['salary_max'] = salary.str[0],salary.str[1]
    data['salary_mean'] = (data['salary_min']+data['salary_max'])/2.0
    

    平均薪资描述
    在这里插入图片描述
    对行业industry数据进行处理
    在这里插入图片描述
    看一下数据属性,该数据是以‘,’进行分割的,这里取其第一个作为默认行业

    data['industry_']=data['industry'].apply(lambda x:x.split(',')[0])
    

    对最高学历进行处理
    从data[‘experience_education’]中对学历进行提取,用re提取常见的学历要求

    import re
    def education(x):
        try:
            return re.findall('本科|大专|应届|在校|硕士|博士',x)[0]
        except:
            return None
         
    data['education'] = data['experience_education'].apply(education)
    

    对job_describe进行处理
    从data[‘job_describe’]中提取相关技能,对技能要求进行分析,同样采用re提取,提取后转换成集合,去除重复的技术。

    def describe(x):    
        try:
            return set(re.findall('([A-Z|a-z\+?]+)',x))
        except:
            return None
    data['technology'] = data['job_describe'].apply(describe)
    

    data[‘technology’]处理后值如图
    在这里插入图片描述

    数据分析与数据可视化

    城市岗位数据分布
    对xx省数据给予去‘省’保留,并查看城市是否能在地图上获取,获取城市-岗位数量数据

    import pyecharts.charts as chart
    import pyecharts.options as opt
    
    city_data = []
    count = data['city'].value_counts()
    for index in count.index:
        ind = index.replace('省','')
        if chart.Geo().get_coordinate(ind):
            city_data.append([ind,int(count[index])])
    map_ = (
        chart.Geo()
        .add_schema(maptype='china')
        .add('城市',city_data)
        .set_series_opts(label_opts=opt.LabelOpts(is_show=False))
        .set_global_opts(title_opts=opt.TitleOpts(title='城市岗位数量分布地图'),
                        visualmap_opts=opt.VisualMapOpts(min_=0,max_=30))
    )
    map_.render('./echarts/job51_map.html')
    

    在这里插入图片描述

    上图颜色越红,城市岗位数量约多,主要分布在一线城市北京、上海、广州、深圳、杭州等一线城市和新一线城市。
    行业、公司规模、公司类型分布
    公司类型分布饼图

    company_type_data = []
    count = data['company_type'].value_counts()
    for index in count.index:
        company_type_data.append((index,int(count[index])))
    
    pie = (
        chart.Pie()
        .add('',company_type_data,radius=["10%","40%"],rosetype='area')
        .set_global_opts(title_opts=opt.TitleOpts(title='公司类型分布图'),
                        legend_opts=opt.LegendOpts(pos_left="80%", orient="vertical"))
        .set_series_opts(label_opts=opt.LabelOpts(formatter='{b}: {c}({d}%)'))
    )
    pie.render('./echarts/job51_pie_company_type.html')
    

    在这里插入图片描述
    公司规模分布饼图

    company_scale_data = []
    count = data['company_scale'].value_counts()
    for index in count.index:
        company_scale_data.append((index,int(count[index])))
    
    pie2 = (
        chart.Pie()
        .add('',company_scale_data,radius=["10%","40%"])
        .set_global_opts(title_opts=opt.TitleOpts(title='公司规模分布图'),
                         legend_opts=opt.LegendOpts(pos_left="85%", orient="vertical"))
        .set_series_opts(label_opts=opt.LabelOpts(formatter='{b}: {d}%'))
    )
    pie2.render('./echarts/job51_pie_company_scale.html')
    

    在这里插入图片描述

    公司行业分布饼图

    company_industry_data = []
    count = data['industry_'].value_counts()
    for index in count.index:
        company_industry_data.append((index,int(count[index])))
    
    pie3 = (
        chart.Pie(init_opts=opt.InitOpts(width='800px',height='600px'))
        .add('',company_industry_data,radius=["10%","40%"],rosetype='area')
        .set_global_opts(title_opts=opt.TitleOpts(title='公司类型分布图'),
                        legend_opts=opt.LegendOpts(type_='scroll',pos_left="5%",pos_bottom='5%',orient="horizontal"))
        .set_series_opts(label_opts=opt.LabelOpts(formatter='{b}: {c}({d}%)'))
    )
    pie3.render('./echarts/job51_pie_industry_type.html')
    

    在这里插入图片描述

    从公司类型来看,民营企业占据大部分,其次是上市公司。在公司规模分布图中,可以看出中小型企业占据大多数。从公司行业上看,岗位需求设计各行各业,但传统计算机行业计算机软件、互联网/电子商务等对岗位需求量要高于非计算机行业。
    岗位日发布量及薪资

    对预处理错误的数据进行修正

    from datetime import datetime
    def change_time(x):
        if datetime.strptime(x,'%Y-%m-%d')>datetime.now():
            x = x.replace('2020','2019')
        return x
     data['pubdate'] = data['pubdate'].apply(change_time)#发布时间有错误,需要做一下修正
    data['job_name']=data['job_name'].replace('AI','人工智能')#岗位名统一
    

    利用pandas 对数据进行处理,获得目标数据表d3

    x_date = data['pubdate'].sort_values().unique().tolist()
    salary_mean = data[['pubdate','salary_mean','job_name']].groupby(['pubdate','job_name']).mean()['salary_mean']
    job_num = data[['pubdate','salary_mean','job_name']].groupby(['pubdate','job_name']).count()['salary_mean']
    
    date_job_salary ={'job_num':[],'salary_mean':[]}
    for date in x_date:
        for job in set(data['job_name'].values):
            index = (date,job)
            try:
                salary = salary_mean[index]
                number = job_num[index]
                date_job_salary['job_num'].append((date,job,int(number)))
                date_job_salary['salary_mean'].append((date,job,float(salary)))
            except:
                date_job_salary['job_num'].append((date,job,None))
                date_job_salary['salary_mean'].append((date,job,None))
    d1 = pd.DataFrame(date_job_salary['job_num'],columns=['date','job','number'])
    d2 = pd.DataFrame(date_job_salary['salary_mean'],columns=['date','job','salary_mean'])
    d3 = pd.merge(d1,d2)
    

    d3如图
    在这里插入图片描述
    绘制各职位日发布量3d柱状图

    bar3d = (
        chart.Bar3D(init_opts=opt.InitOpts(width='1200px',height='1000px'))
        .add('',date_job_salary['job_num'],
            xaxis3d_opts=opt.Axis3DOpts(type_="category",name='日期'),
            yaxis3d_opts=opt.Axis3DOpts(interval=0,type_="category",name='职位'),
            zaxis3d_opts=opt.Axis3DOpts(interval=0,type_="value",name='日发布数量'))
        .set_global_opts(title_opts=opt.TitleOpts(title='各类职位日发布数量'),
                         legend_opts=opt.LegendOpts(type_='scroll'),
                        visualmap_opts=opt.VisualMapOpts(max_=job_num.max()))
    )
    bar3d.render('./echarts/job51_job_num_3d.html')
    

    各岗位日发布平均薪资折线图

    dt_job = {}
    dt_salary = {}
    for job in set(data['job_name'].values):
        dt_job[job] = d3[d3['job']==job][['date','number']].dropna(axis=0)
        dt_salary[job] = d3[d3['job']==job][['date','salary_mean']].dropna(axis=0)
    
    #薪资保留两位小数
    def ceil_(x):
        return round(x,2)
    line = (
    chart.Line(init_opts=opt.InitOpts(width='1200px',height='1000px'))
        .add_xaxis(xaxis_data=x_date)
        .add_yaxis('图像处理',y_axis=dt_salary['图像']['salary_mean'].apply(ceil_).tolist(),
                  linestyle_opts=opt.LineStyleOpts(width=2))
        .add_yaxis('语音识别',y_axis=dt_salary['语音']['salary_mean'].apply(ceil_).tolist(),
                  linestyle_opts=opt.LineStyleOpts(width=2))
        .add_yaxis('机器学习',y_axis=dt_salary['机器学习']['salary_mean'].apply(ceil_).tolist(),
                  linestyle_opts=opt.LineStyleOpts(width=2))
        .add_yaxis('深度学习',y_axis=dt_salary['深度学习']['salary_mean'].apply(ceil_).tolist(),
                  linestyle_opts=opt.LineStyleOpts(width=2))
        .add_yaxis('大数据',y_axis=dt_salary['大数据']['salary_mean'].apply(ceil_).tolist(),
                  linestyle_opts=opt.LineStyleOpts(width=2))
        .add_yaxis('人工智能',y_axis=dt_salary['人工智能']['salary_mean'].apply(ceil_).tolist(),
                  linestyle_opts=opt.LineStyleOpts(width=2))
        .add_yaxis('数据分析',y_axis=dt_salary['数据分析']['salary_mean'].apply(ceil_).tolist(),
                  linestyle_opts=opt.LineStyleOpts(width=2))
        .add_yaxis('算法',y_axis=dt_salary['算法']['salary_mean'].apply(ceil_).tolist(),
                  linestyle_opts=opt.LineStyleOpts(width=2))
        .add_yaxis('自然语言处理',y_axis=dt_salary['自然语言处理']['salary_mean'].apply(ceil_).tolist(),
                  linestyle_opts=opt.LineStyleOpts(width=2))
        .set_global_opts(title_opts=opt.TitleOpts(title='各岗位日发布平均薪资')
                         ,xaxis_opts=opt.AxisOpts(name='日期'),
                        yaxis_opts=opt.AxisOpts(name='薪资(元/月)'),
                        datazoom_opts=[opt.DataZoomOpts(),opt.DataZoomOpts(type_='inside')])
    )
    line.render('./echarts/job51_date_salary_mean.html')
    

    全部岗位
    在这里插入图片描述
    只看图像处理
    在这里插入图片描述
    从各岗位发布平均薪资来看,四月之前,各岗位的薪资波动较频繁,四月后没有较大幅度的波动,这与国内疫情控制情况相关。

    各岗位日发布数量

    bar3 = (
    chart.Bar(init_opts=opt.InitOpts(width='1200px',height='1000px'))
        .add_xaxis(xaxis_data=x_date)
        .add_yaxis('图像处理',dt_job['图像']['number'].tolist())
        .add_yaxis('语音识别',dt_job['语音']['number'].tolist())
        .add_yaxis('机器学习',dt_job['机器学习']['number'].tolist())
        .add_yaxis('深度学习',dt_job['深度学习']['number'].tolist())
        .add_yaxis('大数据',dt_job['大数据']['number'].tolist())
        .add_yaxis('人工智能',dt_job['人工智能']['number'].tolist())
        .add_yaxis('数据分析',dt_job['数据分析']['number'].tolist())
        .add_yaxis('算法',dt_job['算法']['number'].tolist())
        .add_yaxis('自然语言处理',dt_job['自然语言处理']['number'].apply(ceil_).tolist())
        .set_global_opts(title_opts=opt.TitleOpts(title='各岗位日发布量')
                         ,xaxis_opts=opt.AxisOpts(name='日期'),
                        yaxis_opts=opt.AxisOpts(name='岗位数量'),
                        datazoom_opts=[opt.DataZoomOpts(),opt.DataZoomOpts(type_='inside')])
    )
    bar3.render('./echarts/job51_date_job_num.html')
    

    岗位整体日发布量
    在这里插入图片描述
    可以看出总体岗位量在五一前后增长较大。
    只看大数据
    在这里插入图片描述
    学历薪资关系

    dt_education = data[['salary_mean','education']].groupby('education').mean()
    
    x_data_e = dt_education.index.tolist()
    y_data_e = np.around(dt_education.values,2).tolist()
    line_ed=(
        chart.Line(init_opts=opt.InitOpts(width='1000px',height='800px'))
        .add_xaxis(xaxis_data=x_data_e)
        .add_yaxis('最高学历平均薪资',y_data_e,linestyle_opts=opt.LineStyleOpts(width=2))
        .set_global_opts(title_opts=opt.TitleOpts(title='最高学历平均薪资水平'),
                         xaxis_opts=opt.AxisOpts(name='最高学历'),
                        yaxis_opts=opt.AxisOpts(name='薪资(元/月)'))
    )
    line_ed.render('./echarts/job51_education_salary.html')
    

    在这里插入图片描述
    从图中可以看出学历约高,工资越高,在校生工资相对要差点

    公司规模薪资水平

    dt_scale = data[['salary_mean','company_scale']].groupby('company_scale').mean()
    x_data_e = dt_education.index.tolist()
    y_data_e = np.around(dt_education.values,2).tolist()
    line_ed=(
        chart.Line(init_opts=opt.InitOpts(width='1000px',height='800px'))
        .add_xaxis(xaxis_data=x_data_e)
        .add_yaxis('最高学历平均薪资',y_data_e,linestyle_opts=opt.LineStyleOpts(width=2))
        .set_global_opts(title_opts=opt.TitleOpts(title='最高学历平均薪资水平'),
                         xaxis_opts=opt.AxisOpts(name='最高学历'),
                        yaxis_opts=opt.AxisOpts(name='薪资(元/月)'))
    )
    line_ed.render('./echarts/job51_education_salary.html')
    

    在这里插入图片描述
    各类规模公司薪资水平基本持平,千人以上的大厂工资相对要搞一点。
    专业技能分析
    对技能进行统一名称、规整,并用Counter方法保留前25个。

    from collections import Counter
    techno = []
    for te in data['technology']:
        if te:
            tec =[]
            for t in te:
                tec.append(t.upper())
            techno.extend(list(tec))
    cnt = Counter(techno)
    tech_data = cnt.most_common(25)
    

    绘制饼图

    pie4 = (
        chart.Pie(init_opts=opt.InitOpts(width='1000px',height='800px'))
        .add('',tech_data,radius=["10%","40%"],rosetype='radius')
        .set_global_opts(title_opts=opt.TitleOpts(title='公司类型分布图'),
                        legend_opts=opt.LegendOpts(type_='scroll',pos_left="5%",pos_bottom='5%',orient="horizontal"))
        .set_series_opts(label_opts=opt.LabelOpts(formatter='{b}: {c}({d}%)'))
    )
    pie4.render('./echarts/job51_pie4_technology.html')
    

    在这里插入图片描述
    可以看出python在相关岗位上的要求量最高,其次是C++、C、JAVA、以及大数据相关技术HADOOP 、SPARK等,在相关岗位上,对LINUX操作系统、mysql数据库(SQL语言)也要较多的要求。

    项目数据及代码链接:欢迎下载

    展开全文
  • 网站分角色对页面实现管理:管理员、招聘信息管理、报名用户管理 三类。 小程序主要实现招聘信息页的展示、用户报名、推荐管理、个人中心等功能是一个比较完善的系统 目录结构: css --基础样式 font --基础字体 ...
  • 前言我们在打开百度或者知乎等网站查看源代码时,在控制台往往会看到如下图所示的信息:通过这种方式来帮助公司做招聘,是不是很有创意呢?一方面可以体现出这些公...

    前言

    我们在打开百度或者知乎等网站查看源代码时,在控制台往往会看到如下图所示的信息:

    通过这种方式来帮助公司做招聘,是不是很有创意呢?一方面可以体现出这些公司对人才的渴望,另一方面也可以让开发者们直接接触招聘信息,更加高效的找到对公司感兴趣的求职者。

    接下来就让来看看这些是如何实现的吧。

    正文

    1. 基本的文字编排信息输出

    console.log作为javascript的全局方法之一,也支持输出带有格式和样式的字符,比如我们使用/n进行换行,使用css样式为指定文本编写样式,如下:

    if (window.console) {
        console.log('想和我们共同打造世界最大中文互动问答平台吗?\n想让自己的成就在亿万用户面前展现吗?想让世界看得你的光芒吗?\n加入我们,在这里不仅是工作,投入你的时间和热情,滴滴汗水终会汇聚成不平凡的成果。\n期待你的加盟。');
        console.log("公司诚聘前端工程师,%c简历投递地址http://www.badu.toudi.com", "color:blue;font-weight:bold;");
        console.log("请在邮件中注明%c来自:console", "color:red;font-weight:bold;");
    }
    复制代码
    

    以上%c后面的本将用console.log的第二个参数制定的样式来输出,效果如下:

    我们可以利用这些方式实现更加有创意的控制台信息,包括公司的宣传画,招聘贴等。

    2. 在控制台打印字符画

    正如上文所展示的控制台知乎招聘贴,我们也可以为自己的网站定制招聘宣传贴。关于字符画的编写,我们可以一行行在控制台敲,当然这种方式不建议采用,我们可以使用网站patorjk.com/来生成自己的字符画,然后在通过代码包装输出到控制台。

    以上就是该网站的界面,我们只需要输入想要转化成字符画的英文字符,就可以生成不同样式风格的字符画。以下是HIRE的不同风格的字符画:

    当然这只是网站生成的一部分,该网站一共为HIRE生成了314中不同风格的字符画,是不是很强大呢?当然我们单纯只复制这些字符是远远不够的,我们还需要用函数包转一下,才能原样输出到控制台。具体实现代码如下:

    <script>
        Function.prototype.makeMulti = function () {
            let l = new String(this)
            l = l.substring(l.indexOf("/*") + 3, l.lastIndexOf("*/"))
            return l
        }
    
        let string = function () {
          /* 你复制的字符图案 */
        }
        console.log(string.makeMulti());
        console.log(/* 其他信息 */);
    </script>
    复制代码
    

    我们将上面从网站生成的字符画复制到string函数中,执行代码后效果如下:

    当然我们可以继续扩展该函数,支持输出彩色字符画等功能,大家感兴趣可以探索一下。

    最后

    笔者接下来将写如何使用nodejs开发自己的图床应用,如果想学习更多H5游戏, webpack,node,gulp,css3,javascript,nodeJS,canvas数据可视化等前端知识和实战,欢迎在公号《趣谈前端》加入我们的技术群一起学习讨论,共同探索前端的边界。

    更多推荐

    展开全文
  • 修复发布招聘信息时无法进行高薪/紧急/状态的操作。 小幅美化超管后台的排版及透明度 修复超管后台企业留言管理错误。 优化未登录企业查看个人简历时,附带超链接方便登录。 修复审核企业提示未审核过的不对称错误...
  • 一方面使企业通过该系统提供的服务发布招聘信息以及查询求职者的个人信息;另一方面求职者也可以发布个人求职信息,查询企业相关信息,方便求职者即时的了解企业的招聘动态。 在网站建设的过程中,涉及到ASP.NET...

    基于ASP.NET技术的WEB网站开发与设计
    ----人力资源咨询及培训网站建设
    摘 要

    随着现代信息技术的发展,基于Web服务的信息发布成为技术改革与发展的方向。本设计主要是人力资源咨询和培训网站的建设,在求职者与企业之间建立一座桥梁。一方面使企业通过该系统提供的服务发布招聘新信息以及查询求职者的个人信息;另一方面求职者也可以发布个人求职信息,查询企业相关信息,方便求职者即时的了解企业的招聘动态。
    在网站建设的过程中,涉及到ASP.NET技术、开发环境、数据库设计等知识,特别是Web服务。本系统选用了Asp.net作为系统开发工具,数据库管理系统采用SQL Server 2000。
    本设计实现了个人和企业的注册以及登录的功能,不仅对各种招聘信息、企业信息、个人信息的即时发布,而且还提供了后台管理功能。在后台管理中还实现了对个人会员、企业会员的管理以及对最新招聘信息的管理.

    关键词:ASP.NET;人力资源;网站建设

    Abstract

    With the development of modern information technology, Web-based information service issued became a technical reform and development direction.The design is mainly talking about human resources consulting and building website of training, building a bridge between job-seekers and enterprises. On the one hand,the enterprises can issued new information of recruitment,and enquiried job-seekers’ personal information which provided by the services of the system;On the other hand, job-seekers can also issued the individual information,enquired business-related information.Job-seekers can immediate understanding dynamic recruitment of enterprises.
    

    In the process of website construction constructed, involved ASP.NET technical knowledge, development environment, database and so on, Specially the Web service. we chose Asp.net as system development tools, in database management system using SQL Server 2000.
    The design has realized the function which individual and enterprise’s registration as well as registers. Not only immediate issued each kind of employment advertise information, enterprise information, individual information,but also provided the backstage management function. In backstage management,also has realized a lot of management,such as individual member, the enterprise member and the newest employment advertise information.
    Keyword:ASP.NET; Human Resources; Website Construction

    目 录
    1 引言 1
    1.1目的 1
    1.2背景 1
    1.3开发工具的选择 2
    2 系统开发所用的技术准备 4
    2.1系统开发平台选择 4
    2.2 ASP.NET技术介绍 4
    2.3 数据库技术的介绍 6
    3 系统分析与设计 9
    3.1 系统设计思想 9
    3.2 系统需求分析 9
    3.2.1 用户需求 9
    3.2.2系统流程分析 9
    3.2.3 系统功能分析 11
    3.2.4 可行性研究 12
    3.3系统的设计 13
    3.3.1系统功能模块的设计 13
    3.3.2 Session 技术的使用 14
    3.3.3 存储过程的使用 15
    4 数据库设计 16
    4.1数据库需求分析 16
    4.1.1数据流图 16
    4.1.2数据结构 18
    4.2概念结构设计 19
    4.3逻辑结构设计 22
    4.4数据库物理结构设计 23
    4.5数据库的实现 23
    5 系统的功能实现 23
    5.1管理员用户管理模块的实现 23
    5.2新闻信息管理模块的设计 24
    5.3企业信息管理模块的设计 24
    5.4企业用户自管理模块的设计 25
    5.5个人用户管理模块的设计 26
    5.6系统主页面设计 27
    5.7软件测试的目的和原则 29
    5.8系统调试 31
    结 论 32
    致 谢 32
    参考文献 33

    基于ASP.NET技术的WEB网站开发与设计
    ----人力资源咨询及培训网站建设

    1 引言
    人类已进入21世纪,科学技术突飞猛进,经济知识和信息产业初见端倪,特别是信息技术和网络技术的讯速发展和广泛应用,对社会的政治、经济、军事、文化等领域产生越来越深刻的影响,也正在改变人们的工作、生活学习、交流方式。信息的获取、处理、交流和应用能力,已经成为人们最重要的能力之一。
    1.1目的
    人力资源咨询及培训网站建设是一种具有交互功能的人才信息管理系统,是在网络上建立的一个虚拟的招聘会。很多知名企业为了吸引人才,都创建了自己的网上人才信息管理系统。同样,就业压力越来越大的高等院校也急需一套完整的体系和系统,因此这必将是广泛应用的网络应用系统。
    1.2背景
    随着网络信息的发展,网络在人们生活中的应用越来越广泛,网络招聘求职方式已经成为了招聘求职的一大重要手段,其招聘求职规模和招聘求职成功率已直逼传统招聘会,有的甚至超过了传统招聘会。通过它应聘者和招聘公司/单位可以在网络上通过Internet,突破时间和空间的限制而实现工作求职和公司/单位的人才的招聘。
    本系统的开发主要包括后台数据库的建立和维护以及前台程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的库。而对于后者则要求应用程序功能完备,易使用等特点。该系统符合网站数据库开发的要求,对Access数据库管理系统、SQL语言原理、ASP.NET 应用程序设计等进行了较深入的学习和应用,主要完成对网上信息管理系统的功能需求分析、功能模块划分、数据库设计,并由此设计了数据库结构和应用程序。
    1.3开发工具的选择
    1)前端开发工具选择
    前端开发工具选择ASP.Net。ASP.Net以其众多的控件群组、快速的编程语言以及直观流畅的编程环境著称。它比较容易上手,是一种快速应用程序开发工具,能够将所用的按钮通过事先的编写程序控件显示出来,是集高效性和快速性等优点完美结合的产物。用户可以利用ASP.Net 提供的IDE开发环境来帮助完成整个应用程序的设计,而不需要再依靠其他工具,使程序开发环境能够简单一致,提高整体工程开发效率。相比之下,利用ASP.NET开发一套软件时,设计GUI所花的时间几乎占掉程序开发周期的三分之一,而设计和界面无关的核心程序通常只占到了不到二分之一左右至三分之二的时间,但是使用VB.NET则可以大幅简化这个问题。ASP.NET提供大量的各式各样的GUI软件元体,让我们可以将大部分的心力放在核心程序码的设计上。
    2)后端数据库服务器的选择
    数据库选择SQL Server 2000数据库系统。SQL Server 2000数据库是一个基于图形用户界面(GUI)的集成管理工具,利用它可以配置管理SQL Server服务器、管理数据库和数据库对象、备份和恢复数据、调度任务和管理警报,实现数据复制和转换操作等。此外,SQL Server 2000还提供了SQL事件探查器、SQL查询分析器 、SQL Server服务管理器和多种操作向导等图形界面管理工具,大大简化了用户操作,从而增强了系统的易用性。SQL Server提供了Transact-SQL、DB-Library for C、嵌入式SQL(ESQL)等开发工具,Transact-SQL与工业标准SQL语言兼容,并在其基础上加以扩充,使它更适合事务处理方面的需要。此外,SQL Server 2000还支持ODBC、OLE DB、ADO规范,可以使用ODBC、OLE DB、ADO接口访问SQL Server数据库。
    ASP.NeT提供了强大的数据库应用程序开发功能和数据库辅助工具,程序员利用这些工具能够迅速开发出强大的数据库应用程序。它与SQL Server 2000数据库系统结合,成为开发B/S程序最有用和最强大的工具组合。
    3) 系统开发环境
    (1) 硬件环境
    在最低配置的情况下,系统的性能往往不尽人意,现在的硬件性能已经相当出色,而且价格也便宜,因此可给服务器端配置高性能的硬件。
     处理器:Intel Pentium II,450MHz或更高
     内存:512MB(建议)
     硬盘:10G
     显卡:SVGA显示适配器

    (2) 软件环境
    操作系统:Windows 2000 SP4/XP SP2或更高
    软件:.NET framework, Visual Basic.NET和Crystal Reports
    数据库:SQL Server 2000
    2 系统开发所用的技术准备
    2.1系统开发平台选择
    随着计算机网络技术的高速发展,传统的桌面系统、C/S架构系统已经不能满足社会的需要。当今社会是一个网络社会,电子商务系统、企业信息系统已经走进了网络应用系统阶段。如何快速开发出适应社会各个行业发展的网络应用系统是摆在人们前面的一个难题。选择什么样的开发平台、开发工具、开发语言、开发技术直接影响行业的信息化建设。.NET的问世给开发人员带来了一种全新的开发框架,它已经成为一种令人激动的、具有革命性和发展性的新技术。.NET为行业的信息化提出了彻底解决方案,不论Web开发者、组件开发者、数据开发者、VB GUI 开发者,还是任何基于Windows平台的开发者,.NET都以一种全新的开发模式使开发人员更好、更快速的完成工作。
    因此在开发工具的选择上,我们选择了对数据库有强大功能的数据库开发系统,于是选择了微软公司的最新动态网页设计技术Asp.net和微软公司的大型数据库管理系统SQL Server 2000。
    2.2 ASP.NET技术介绍
    ASP.NET不仅仅是下一版本的 Active Server Page (ASP),而且还是一种建立在通用语言上的程序构架,能被用于一台Web服务器来建立强大的Web应用程序。ASP.net提供许多比现在的Web开发模式强大的的优势。它是统一的 Web 开发平台,用来提供开发人员快速生成企业级 Web 应用程序所需的服务。
    ASP.NET 的语法在很大程度上与 ASP 兼容,同时它还提供一种新的编程模型和结构,用于生成更安全、可伸缩和稳定的应用程序。可以通过在现有 ASP 应用程序中逐渐添加,与以前的 Web 开发模型相比,ASP.NET 提供了数个重要的优点:
    增强的性能
    ASP.NET 是在服务器上运行的编译好的公共语言运行库代码。ASP.NET 可利用早期绑定、实时编译、本机优化和盒外缓存服务。这相当于在编写代码行之前便显著提高了性能。
    世界级的工具支持
    ASP.NET 框架补充了 Visual Studio 集成开发环境中的大量工具箱和设计器。WYSIWYG 编辑、拖放服务器控件和自动部署只是这个强大的工具所提供功能中的少数几种。
    强大性和适应性
      因为ASP.net是基于通用语言编译运行的程序,所以它的强大性和适应性,可以使它运行在Web应用软件开发者的几乎全部的平台上。通用语言的基本库,消息机制,数据接口的处理都能无缝的整合到ASP.net的Web应用中。ASP.net同时也是language-independent语言独立化的,所以,你可以选择一种最适合你的语言来编写你的程序,或者把你的程序用很多种语言来写,现在已经支持的有C#(C++和Java的结合体),VB,Jscript。这样的多种程序语言协同工作的能力会保护您现在的基于COM+开发的程序,能够完整的移植向ASP.net。
    威力和灵活性
    由于 ASP.NET 基于公共语言,因此,Web 应用程序开发人员可以利用整个平台的威力和灵活性。.NET 框架类库、消息处理和数据访问解决方案都可从 Web访问。ASP.NET 也与语言无关,所以可以选择最适合应用程序的语言,或跨多种语言分割应用程序。另外,公共语言运行的交互性可保证在迁移到 ASP.NET 时保留基于 COM 的开发中的现有投资。
    简易性
    ASP.NET 使执行常见任务变得容易,从简单的窗体提交和客户端身份验证到部署和站点配置都非常简单。例如,ASP.NET 页框架使您可以生成将应用程序逻辑与表示代码清楚分开的用户界面,类似在 Visual Basic 的简单窗体处理模型中处理事件。允许你建立你自己的用户分界面,使其又不同于常见的VB-Like界面。另外,公共语言运行库利用托管代码服务(如自动引用计数和垃圾回收)简化了开发,使把代码结合成软件简单的就像装配电脑。
    可管理性 
    ASP.NET使用一种字符基础的、分级的配置系统,使你服务器环境和应用程序的设置更加简单。因为配置信息都保存在简单文本中,新的设置有可能都不需要启动本地的管理员工具就可以实现。这种被称为"Zero Local Administration"的哲学观念使Asp.net的基于应用的开发更加具体、快捷。一个ASP.net的应用程序在一台服务器系统的安装只需要简单的拷贝一些必须文件,不需要系统的重新启动,一切就是这么简单。
    可缩放性和可用性
    ASP.NET 在设计时考虑了可缩放性,增加了专门用于在聚集环境和多处理器环境中提高性能的功能。另外,进程受到 ASP.NET 运行库的密切监视和管理,以便当进程行为不正常(泄漏、死锁)时,可就地创建新进程,以帮助保持应用程序始终可用于处理请求。
    自定义性和扩展性
    ASP.NET 随附了一个设计周到的结构,它使开发人员可以在适当的级别“插入”代码。实际上,可以用自己编写的自定义组件扩展或替换 ASP.NET 运行库的任何子组件。
    安全性
    借助内置的 Windows 身份验证和基于每个应用程序的配置,可以保证应用程序是安全的。

    总之,ASP.NET 是一个已编译的、基于 .NET 的环境,把基于通用语言的程序在服务器上运行。程序在服务器端首次运行时进行编译,比ASP即时解释程序速度上要快很多,而且是可以用任何与 .NET 兼容的语言(包括 Visual Basic .NET、C# 和 JScript .NET)创作应用程序。另外,任何 ASP.NET 应用程序都可以使用整个 .NET Framework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。
    2.3 数据库技术的介绍
    数据库技术是现代信息科学与技术的重要组成部分,是计算机数据处理与信息管理系统的核心。数据库技术研究和解决了计算机信息处理过程中大量数据有效地组织和存储的问题,在数据库系统中减少数据存储冗余、实现数据共享、保障数据安全以及高效地检索数据和处理数据。
    随着计算机技术与网络通信技术的发展,数据库技术已成为信息社会中对大量数据进行组织与管理的重要技术手段及软件技术,是网络信息化管理系统的基础。
    从20世纪60年代末期开始到现在,数据库技术已经发展了30多年。在这30多年的历程中,人们在数据库技术的理论研究和系统开发上都取得了辉煌的成就,而且已经开始新一代数据库系统的深入研究。数据库已经成为现代计算机系统的重要组成部分。
    数据模型是数据库技术的核心和基础,因此,对数据库系统开发阶段的划分应该以数据模型的发展演变作为主要依据和标志。按照数据模型的发展演变过程,数据库技术从开始到现在在短短的30年中,主要经历了三个发展阶段:第一代是网状和层次数据库系统,第二代是关系数据库系统,第三代是以面向对象数据模型为主要特征的数据库系统。数据库技术与网络通信技术、人工智能技术、面向对象程序设计技术、并行计算机技术等相互渗透、有机结合,成为当代数据库技术发展的重要特征。
    SQL Server 2000由一组数量众多的数据库组件组成。这些组件在功能上互相补充,在使用方式上彼此协调,以满足用户在数据存储和管理、大型Web站点支持和企业数据分析处理上的需求。
    SQL Server 2000是微软公司的大型数据库管理系统,它的主要特点有:
    1.强大的查询与管理功能。
    2.强大的数据库开发功能。
    3.扩大了对SQL语言的支持。
    4.大量使用可视化的界面操作工具。
    5.支持面向对象的程序设计。
    6.多平台支持。
    7.支持网络应用。
    2.4 ADO.NET 简介
      简而言之,DataSet 在 ADO.NET 中[5]用作数据容器,并在与数据库断开连接时使用。DataSet 包含一个或多个 DataTable,每个 DataTable 都包含行集合。对于那些熟悉传统 ADO 环境的用户来说,DataTable 可被看作是断开连接的 Recordset。
      DataAdapter 在连接到数据库时工作。单个 DataAdapter 的作用是使用数据库中的数据填充某个 DataTable,或将 DataTable 中的更改写回到数据库,或者二者兼而有之。
      DataAdapter 要求 Command 对象执行各种数据库操作。Command 对象存放 SQL 语句或指定数据访问实现方法的存储过程名称。每个 DataAdapter 有四个属性,指定用于四种数据访问类型之一的命令对象。
    SelectCommand:此 Command 对象用于从数据库中选择数据。
    UpdateCommand:此 Command 对象用于更新数据库中的现有记录。
    InsertCommand:此 Command 对象用于向数据库中插入新记录。
    DeleteCommand:此 Command 对象用于删除数据库中的现有记录。
    阐释了这些对象及其关系。

    在这里插入图片描述
    图一 用于访问存储过程的主要 ADO.NET 类以及它们之间的关系
    3 系统分析与设计
    这章主要讲的是人力资源咨询及培训网站建设的分析与功能设计,系统分析在整个系统中具有重要作用为系统的设计打下基础。
    3.1 系统设计思想
    系统主要是由就业信息进行录入,以及让用户在最短的时间内了解各种职位新闻,个人信息和企业的最新动态。同时,能够随时对它们进行各种查询,以及很好地对系统进行维护。
    网站就满足各种用户的需求进行汇总。例如用户的登录、查询、更新、删除等。并具备数据库维护功能,及时根据用户需求进行数据添加、删除、修改等操作。
    3.2 系统需求分析
    网站的工作总体规划由网站使用人员在系统中完成对各种所需的基本数据的维护,包括这些信息的增加、修改及对各项信息的变动都将在这进行操作。
    后台管理的用户权限主要有网站建设人员。他们可以进行各种个人信息以及企业信息的录入和查询。
    前台主要是让用户了解各种招聘信息以及最新职位情况,还有实现对用户所需信息的查询和最新的新闻动态等功能。
    3.2.1 用户需求
    系统管理员功能简介
    (1)系统管理员可以对各种信息进行修改;
    (2)公告栏管理是对各种就业信息和最新消息增加,查询与删除和修改;
    (1)个人管理是对求职者的信息进行增加,删除和修改;
    (3) 企业管理是对企业信息进行增加,删除和修改。
    3.2.2系统流程分析
    职位申请流程
    在这里插入图片描述
    图二 用户职位申请流程
    企业用户管理流程
    在这里插入图片描述
    图三 企业用户管理流程
    3.2.3 系统功能分析
    人力资源咨询及培训网站建设分为前台管理和后台管理。前台管理包括浏览新闻、职位查询、查看企业信息、维护个人信息和维护用户信息等功能。后台管理包括新闻管理、企业信息管理、职位信息管理和应聘信息查询等模块。
    后台管理具体描述如下:
    新闻管理
    添加新闻,包括新闻标题和新闻内容
    修改新闻
    删除新闻
    企业信息管理
    添加企业信息,包括企业名称、企业类型、企业简等信息
    修改企业信息
    审核企业信息
    删除企业信息
    个人用户管理
    添加个人用户
    修改个人信息
    删除个人用户
    招聘信息管理
    查看招聘信息
    删除招聘信息
    系统用户管理
    系统用户的录入,包括用户名、密码等信息
    修改自己的密码
    用户信息查看
    系统用户管理功能
    Admin 用户修改自己的密码
    Admin 用户管理企业用户
    Admin 用户管理个人用户
    Admin 用户发布招聘信息
    Admin 用户管理留言
    Admin 用户添加用户
    Admin 用户管理在线调查
    3.2.4 可行性研究
    可行性研究的目的是用最小的代价在尽可能的时间内确定问题是否能够解决。

    经济上可行性:
    现在,计算机的价格已经十分低廉,性能却有了长足的进步。而本系统的开发,为人力资源咨询及培训的工作效率带来了一个质的飞跃,为此主要表现有以下几个方面:
    第一 本系统的运行可以让企业和求职者之间更好的进行了解与沟通;
    第二 本系统的运行可以节省许多资源;
    第三 本系统的运行可以大大的工作效率;
    第四 本系统可以使敏感文档更加安全;
    除以上优点外,本系统只要有一台能上网的IE即可运行,所以,本系统在经济上是可行的。
    技术上可行性:
    本系统的开发利用Microsoft SQL Server2000作为后台的数据库,它是一个支持多用户的新型数据库,适用于大中规模的数据量需求。人力资源咨询及培训网站建设也为新系统B/S的结构提供了硬件的支持。
    使用Visual Studion.net作为系统开发的开发环境,它提供完善的指令控制语句、类与对象的支持及丰富的数据类型,给开发高性能系统提供的保障为开发满足客户要求的系统,保证了代码的模块化要求,而代码模块化的提高,非常有利于以后对新系统的扩展与修改。
    综上所述,本系统的设计与开发在技术上和硬件设备上的条件都是满足的,因此,它在技术上是可行的。
    运行上可行性:
    本系统为一个小型的就业信息系统,所耗费的资源非常的小,电脑无论是硬件还是软件都能够满足条件,因此,本系统在运行上是可行的。
    由此可知,人力资源咨询及培训网站建设具有可行性。
    3.3系统的设计
    3.3.1系统功能模块的设计
    功能模块的划分
    本系统功能模块划分如图所示
    在这里插入图片描述
    图四 网上人才管理系统功能模块示意图

    。。。。。。。。。。。。。。。。。
    .。。。。。。。。。。。。。。。。。
    。。。。。。。。。。。。。。。。。。

    论文文件下载地址:请点击》》》》

    展开全文
  • 这样双方都不会去花太多的时间去找工作,信息发布后让系统去匹配告知,但是一个一个招聘信息去看,还不如把所需要找的信息就采集下来,做好统计清理,然后查询自己所需要的求职工作,这样方便许多。 大家在爬取BO

    由于互联网的发展,网络上出现了各种招聘平台,以前大学生求职都是到别人公司去面试等等,现在由于计算机网络技术的发展进步,出现了各种招聘平台,现在网络招聘成了大学生求职和公司老板招聘发布的重要渠道之一。例如boss直聘,老板不仅可以在boss直聘平台上发布招聘信息,求职者用户也可以在Boss直聘平台上发出求职信息。这样双方都不会去花太多的时间去找工作,信息发布后让系统去匹配告知,但是一个一个招聘信息去看,还不如把所需要找的信息就采集下来,做好统计清理,然后查询自己所需要的求职工作,这样方便许多。
    大家在爬取BOSS直聘的时一定要注意会出现的问题:
    1、容易出现验证码
    2、封禁IP地址
    这些问题简单来说就是就是网站反爬了。如果出现IP被限制的情况,就需要更换代理IP,让更多的代理IP去采集。如果使用了代理IP去采集招聘信息数据,采集久了还是会出现验证码,就需要控制好访问频率了。boss直聘访问频率太快也会出现验证码。boss直聘最大的问题,就是需要登录才能采集,不登采集招聘信息数据,一会都会被限制,爬虫可以采用模拟真实浏览器的方式去访问,可以采用selenium模拟真实浏览器进行对boss直聘的的数据采集,这样不仅能解决登陆问题,而且数据采集也会更加稳定,也可以参考以下爬虫程序方案:

        import os
        import time
        import zipfile
    
        from selenium import webdriver
        from selenium.common.exceptions import TimeoutException
        from selenium.webdriver.common.by import By
        from selenium.webdriver.support import expected_conditions as EC
        from selenium.webdriver.support.ui import WebDriverWait
    
    
        class GenCookies(object):
            # 随机useragent
            USER_AGENT = open('useragents.txt').readlines()
    
    
            # 代理服务器(产品官网 www.16yun.cn)
            PROXY_HOST = 't.16yun.cn'  #  proxy or host
            PROXY_PORT = 31111  # port
            PROXY_USER = 'USERNAME'  # username
            PROXY_PASS = 'PASSWORD'  # password
    
            @classmethod
            def get_chromedriver(cls, use_proxy=False, user_agent=None):
                manifest_json = """
                {
                    "version": "1.0.0",
                    "manifest_version": 2,
                    "name": "Chrome Proxy",
                    "permissions": [
                        "proxy",
                        "tabs",
                        "unlimitedStorage",
                        "storage",
                        "<all_urls>",
                        "webRequest",
                        "webRequestBlocking"
                    ],
                    "background": {
                        "scripts": ["background.js"]
                    },
                    "minimum_chrome_version":"22.0.0"
                }
                """
    
                background_js = """
                var config = {
                        mode: "fixed_servers",
                        rules: {
                        singleProxy: {
                            scheme: "http",
                            host: "%s",
                            port: parseInt(%s)
                        },
                        bypassList: ["localhost"]
                        }
                    };
    
                chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
    
                function callbackFn(details) {
                    return {
                        authCredentials: {
                            username: "%s",
                            password: "%s"
                        }
                    };
                }
    
                chrome.webRequest.onAuthRequired.addListener(
                            callbackFn,
                            {urls: ["<all_urls>"]},
                            ['blocking']
                );
                """ % (cls.PROXY_HOST, cls.PROXY_PORT, cls.PROXY_USER, cls.PROXY_PASS)
                path = os.path.dirname(os.path.abspath(__file__))
                chrome_options = webdriver.ChromeOptions()
    
                # 关闭webdriver的一些标志
                # chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])        
    
    
                if use_proxy:
                    pluginfile = 'proxy_auth_plugin.zip'
    
                    with zipfile.ZipFile(pluginfile, 'w') as zp:
                        zp.writestr("manifest.json", manifest_json)
                        zp.writestr("background.js", background_js)
                    chrome_options.add_extension(pluginfile)
                if user_agent:
                    chrome_options.add_argument('--user-agent=%s' % user_agent)
                driver = webdriver.Chrome(
                    os.path.join(path, 'chromedriver'),
                    chrome_options=chrome_options)
    
                # 修改webdriver get属性
                # script = '''
                # Object.defineProperty(navigator, 'webdriver', {
                # get: () => undefined
                # })
                # '''
                # driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": script})
    
                return driver
    
            def __init__(self, username, password):        
                # 登录example网站
                self.url = 'https://passport.example.cn/signin/login?entry=example&r=https://m.example.cn/'
                self.browser = self.get_chromedriver(use_proxy=True, user_agent=self.USER_AGENT)
                self.wait = WebDriverWait(self.browser, 20)
                self.username = username
                self.password = password
    
            def open(self):
                """
                打开网页输入用户名密码并点击
                :return: None
                """
                self.browser.delete_all_cookies()
                self.browser.get(self.url)
                username = self.wait.until(EC.presence_of_element_located((By.ID, 'loginName')))
                password = self.wait.until(EC.presence_of_element_located((By.ID, 'loginPassword')))
                submit = self.wait.until(EC.element_to_be_clickable((By.ID, 'loginAction')))
                username.send_keys(self.username)
                password.send_keys(self.password)
                time.sleep(1)
                submit.click()
    
            def password_error(self):
                """
                判断是否密码错误
                :return:
                """
                try:
                    return WebDriverWait(self.browser, 5).until(
                        EC.text_to_be_present_in_element((By.ID, 'errorMsg'), '用户名或密码错误'))
                except TimeoutException:
                    return False
    
            def get_cookies(self):
                """
                获取Cookies
                :return:
                """
                return self.browser.get_cookies()
    
            def main(self):
                """
                入口
                :return:
                """
                self.open()
                if self.password_error():
                    return {
                        'status': 2,
                        'content': '用户名或密码错误'
                    }            
    
                cookies = self.get_cookies()
                return {
                    'status': 1,
                    'content': cookies
                }
    
    
        if __name__ == '__main__':
            result = GenCookies(
                username='180000000',
                password='16yun',
            ).main()
            print(result)
    
    展开全文
  • 2015中小学信息技术教师招聘考试题库(30套含答案)更新时间:2017/2/11 10:49:00浏览量:787手机版信息技术教师招聘考试密押题(一)一、单项选择1、 按照动画的制作方法和生成原理,Flash的动画类型主要分为哪两大类( ...
  • python爬虫之爬取招聘岗位信息

    千次阅读 2020-07-03 19:50:57
    1.3实现功能 项目需要实现:①可由用户选择爬取哪种或哪些岗位的招聘信息、②可由用户选择爬取招聘信息的城市(全国可选)、③将爬取的数据存储到mysql或者csv文件中、④将mysql或csv文件中的数据取出并以字典的...
  • 51job(前程无忧官网)1万条招聘信息的爬取

    千次阅读 多人点赞 2020-07-01 01:03:49
    以51job网上爬取的一万条电商类招聘信息为样本,具体分析该行业的就业前景、工作地点、平均薪资和任职要求等 本文主要通过词云图和可视化图表对数据进行展示描述 1.先上样本信息图(由于太多,只截了一部分) 第一...
  • 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。...二、请求网页,先获取所有招聘信息的详情url地址 使用开发者工具发现网页加载出来的内容是乱代
  • total = respon.text #r.text results = json.loads(respon.text)['content']['positionResult']['result'] #将r.text文件转换为json格式,再将json内容放入字典中,可以看做是二维列表,每一行代表一个招聘信息,...
  • 23个海外求职找各种工作招聘网站

    千次阅读 2021-05-27 00:06:33
    我们在找工作的时候,除了通过熟人介绍工作,更多的是要通过招聘网站来获取更多的工作机会,使用招聘网站来搜索所在行业的工作职位是找工作最有效的方法之一。而在国外寻找工作也一样,招聘网站上会列出...
  • Java_Web项目-招聘网站

    热门讨论 2012-11-24 15:49:15
     该招聘站点提供一个平台给用人单位和求职者,用人单位在站点上发布招聘信息,求职者可以通过网络查看自己感兴趣的工作。  同时,求职者可以在招聘站点上注册自己的个人信息,用人单位可以检索与招聘职位要求...
  • Python爬虫某招聘网站的岗位信息

    千次阅读 2020-04-03 16:48:02
    {0:.2f} 秒'.format(use_time-start_time)) #将存有岗位信息列表转化为dataframe表格形式 df = pd.DataFrame(list) df.to_excel(r'F:\Python\脉脉-字节跳动招聘岗位.xlsx',sheet_name='岗位信息',index = 0)
  • 工作职责: 对尚未发布的游戏软件版本执行测试,与翻译团队和制作团队合作: - 确保游戏中的相关术语翻译符合***方的要求 - 确保游戏中的文本和语音符合内部质量标准 - 准确、高效地找出并且报告翻译错误,并验证...
  • 大数据时代,计算机行业蓬勃发展,越来越多的人投身计算机事业...这篇文章就是对实习吧招聘网站有关python职位信息的一个简单分析与可视化。希望通过这些数据,能得到隐藏的数据背后的密码。让我们来一起探索吧。
  • Python爬虫框架Scrapy实战 - 抓取BOSS直聘招聘信息 Python爬虫框架Scrapy实战 - 抓取BOSS直聘招聘信息 零开发环境 一准备工作 安装 Scrapy 二新建项目 三定义要抓取的 Item 四分析页面 ...
  • 招聘信息看-数据分析师(数据分析报告)

    千次阅读 多人点赞 2019-04-22 14:07:14
    招聘信息看-数据分析师 项目简介 有意转向数据分析这个岗位,那自然首先需要对这个岗位有所了解。最直接,最真实的方式就是从企业那里获取需求信息,从而能够知道自己学习的方向和简历的准备。 本次项目...
  • 修复发布招聘信息时无法进行高薪/紧急/状态的操作。 小幅美化超管后台的排版及透明度 修复超管后台企业留言管理错误。 优化未登录企业查看个人简历时,附带超链接方便登录。 修复审核企业提示未审核过的不对称错误...
  • 爬虫实战——爬取腾讯招聘的职位信息
  • 招聘简历管理系统的简单设计

    千次阅读 2018-09-16 08:09:20
    招聘管理系统主要完成招聘流程的系统化管理,其主要业务包括职位发布,简历接收,简历筛选,笔试,面试和录用。另外提供系统管理和数据交换等辅助功能。其用例图如图1-1所示。 图1-1 1.1.2招聘职位发布: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,391
精华内容 10,156
关键字:

发布工作招聘信息平台