zoukankan      html  css  js  c++  java
  • 用python爬取前程无忧网,看看我们是否真的“前程无忧”?

    The best time to plant a tree was 10 years ago,the second best time is now.

    种一棵树最好的时间是十年前,其次是现在。

    利用python爬取在前程无忧网搜索python关键字出现的最新的招聘数据,保存到本地Excel,进行数据查看和预处理,然后利用matplotlib进行数据分析和可视化。

    1. 爬取数据

    目标url:https://www.51job.com/

    在前程无忧网输入关键字python,搜索有关的岗位数据。翻页查看这些招聘岗位信息,可以发现url翻页的规律。

    检查网页源代码,可以找到想要提取的数据。

    部分爬虫代码如下,完整见文末下载

        async def parse(self, text):
            # 正则匹配提取数据
            try:
                job_name = re.findall('"job_name":"(.*?)",', text)          # 职位
                company_name = re.findall('"company_name":"(.*?)",', text)  # 公司名称
                salary = re.findall('"providesalary_text":"(.*?)",', text)
                salary = [i.replace('\', '') for i in salary]              # 薪酬     去掉  符号
                city = re.findall('"workarea_text":"(.*?)",', text)         # 城市
                job_welfare = re.findall('"jobwelf":"(.*?)",', text)        # 职位福利
                attribute_text = re.findall('"attribute_text":(.*?),"companysize_text"', text)
                attribute_text = ['|'.join(eval(i)) for i in attribute_text]
                companysize = re.findall('"companysize_text":"(.*?)",', text)  # 公司规模
                category = re.findall('"companyind_text":"(.*?)",', text)
                category = [i.replace('\', '') for i in category]             # 公司所属行业  去掉  符号
                datas = pd.DataFrame({'company_name': company_name, 'job_name': job_name, 'companysize': companysize, 'city': city, 'salary': salary, 'attribute_text': attribute_text, 'category': category, 'job_welfare': job_welfare})
                datas.to_csv('job_info.csv', mode='a+', index=False, header=True)
                logging.info({'company_name': company_name, 'job_name': job_name, 'company_size': companysize, 'city': city, 'salary': salary, 'attribute_text': attribute_text, 'category': category, 'job_welfare': job_welfare})
            except Exception as e:
                print(e)
    

    运行效果如下:

    爬取了200页的招聘数据,共10000条招聘信息,用时49.919s。

    2. 数据查看和预处理

    import pandas as pd
    
    df = pd.read_csv('job_info.csv')
    # 异步爬虫爬取数据时  datas.to_csv('job_info.csv', mode='a+', index=False, header=True)  删除多的列名
    df1 = df[df['salary'] != 'salary']
    # 查看前10行
    df1.head(10)
    
    # city那一列数据  处理为城市
    # 按 - 分割   expand=True  0那一列重新赋值给df['city']
    df1['city'] = df1['city'].str.split('-', expand=True)[0]
    df1.head(10)
    
    # 经验要求  学历要求   有的话是在attribute_text列里
    df['attribute_text'].str.split('|', expand=True)
    
    df1['experience'] = df1['attribute_text'].str.split('|', expand=True)[1]
    df1['education'] = df1['attribute_text'].str.split('|', expand=True)[2]
    df1
    

    保存为已清洗数据

    df1.to_csv('已清洗数据.csv', index=False)
    

    查看索引、数据类型和内存信息

    df2 = pd.read_csv('已清洗数据.csv')
    df2.info()
    

    3. 数据分析与可视化

    (1) 柱形图展示招聘岗位数最多的城市Top10

    代码如下:

    import pandas as pd
    import random
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    
    df = pd.read_csv('已清洗数据.csv')
    # 有些是异地招聘   过滤掉
    data = df[df['city'] != '异地招聘']['city'].value_counts()
    city = list(data.index)[:10]    # 城市
    nums = list(data.values)[:10]   # 岗位数
    print(city)
    print(nums)
    
    colors = ['#FF0000', '#0000CD', '#00BFFF', '#008000', '#FF1493', '#FFD700', '#FF4500', '#00FA9A', '#191970', '#9932CC']
    random.shuffle(colors)
    
    # 设置大小   像素
    plt.figure(figsize=(9, 6), dpi=100)
    # 设置中文显示
    mpl.rcParams['font.family'] = 'SimHei'
    # 绘制柱形图  设置柱条的宽度和颜色
    # color参数  每根柱条配置不同颜色
    plt.bar(city, nums, width=0.5, color=colors)
    
    # 添加描述信息
    plt.title('招聘岗位数最多的城市Top10', fontsize=16)
    plt.xlabel('城市', fontsize=12)
    plt.ylabel('岗位数', fontsize=12)
    
    # 展示图片
    plt.show()
    

    运行效果如下:

    ['上海', '深圳', '广州', '北京', '杭州', '成都', '武汉', '南京', '苏州', '长沙']
    [2015, 1359, 999, 674, 550, 466, 457, 444, 320, 211]
    

    上海、深圳、广州、北京提供了很多岗位,杭州、成都、武汉、南京等城市的招聘岗位数量也比较可观。

    (2) 计算岗位数据的薪酬,处理为多少K/月,划分薪酬区间,统计薪酬分布情况,饼图展示。

    代码如下:

    # 设置中文显示
    mpl.rcParams['font.family'] = 'SimHei'
    # 设置大小  像素
    plt.figure(figsize=(9, 6), dpi=100)
    plt.axes(aspect='equal')   # 保证饼图是个正圆
    explodes = [0, 0, 0, 0.1, 0.2, 0.3, 0.4, 0.5]
    plt.pie(nums, pctdistance=0.75, shadow=True,
      colors=colors, autopct='%.2f%%', explode=explodes,
      startangle=15, labeldistance=1.1,
      )
    
    # 设置图例   调节图例位置
    plt.legend(part_interval, bbox_to_anchor=(1.0, 1.0))
    plt.title('招聘岗位的薪酬分布', fontsize=15)
    plt.show()
    

    运行效果如下:招聘岗位给的薪酬在5K-10K和10K-15K区间所占的比例较大,也有一定比例的50K以上的高薪资岗位。

    (3) 查看招聘岗位对学历的要求的情况,水平柱形图可视化。

    mport pandas as pd
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    
    
    df = pd.read_csv(r'已清洗数据.csv')['education']
    data = df.value_counts()
    
    labels = ['大专', '本科', '硕士', '博士']
    nums = [data[i] for i in labels]
    print(labels)
    print(nums)
    
    colors = ['cyan', 'red', 'yellow', 'blue']
    # 设置中文显示
    mpl.rcParams['font.family'] = 'SimHei'
    # 设置显示风格
    plt.style.use('ggplot')
    # 设置大小  像素
    plt.figure(figsize=(8, 6), dpi=100)
    # 绘制水平柱状图 
    plt.barh(labels, nums, height=0.36, color=colors)
    plt.title('招聘岗位对学历的要求', fontsize=16)
    plt.xlabel('岗位数量', fontsize=12)
    plt.show()
    

    运行效果如下:

    ['大专', '本科', '硕士', '博士']
    [2052, 6513, 761, 45]
    

    (4) 查看招聘岗位对工作经验的要求的情况,水平柱形图可视化。

    由于得到的工作经验列里的数据并不规范,统计时需做特殊处理

    代码如下:

    # 设置中文显示
    mpl.rcParams['font.family'] = 'SimHei'
    # 设置显示风格
    plt.style.use('ggplot')
    # 设置大小  像素
    plt.figure(figsize=(9, 6), dpi=100)
    # 绘制水平柱状图
    plt.barh(labels, nums, height=0.5, color=colors)
    plt.title('招聘岗位对工作经验的要求', fontsize=16)
    plt.xlabel('岗位数量', fontsize=12)
    plt.show()
    

    运行效果如下:

    3-4年经验      3361
    2年经验        2114
    1年经验        1471
    5-7年经验      1338
    在校生/应届生     661
    无需经验         417
    本科           182
    8-9年经验       105
    10年以上经验       64
    硕士            59
    招1人           57
    招若干人          57
    招2人           42
    大专            30
    招3人           14
    博士            11
    招5人            9
    招4人            5
    招10人           2
    招7人            1
    Name: experience, dtype: int64
    ['无需经验', '1年经验', '2年经验', '3-4年经验', '5-7年经验', '8-9年经验', '10年以上经验']
    [1260, 1530, 2114, 3372, 1338, 105, 64]
    

    【】#### (5) 查看招聘公司所属行业的分布情况,词云展示。

    代码如下:

    import pandas as pd
    import collections
    from wordcloud import WordCloud
    import matplotlib.pyplot as plt
    
    
    df = pd.read_csv(r'已清洗数据.csv')['category']
    data = list(df.values)
    
    
    word_list = []
    for i in data:
        x = i.split('/')
        for j in x:
            word_list.append(j)
    
    word_counts = collections.Counter(word_list)
    
    # 绘制词云
    my_cloud = WordCloud(
        background_color='white',  # 设置背景颜色  默认是black
        width=900, height=500,
        font_path='simhei.ttf',    # 设置字体  显示中文
        max_font_size=120,         # 设置字体最大值
        min_font_size=15,          # 设置子图最小值
        random_state=60            # 设置随机生成状态,即多少种配色方案
    ).generate_from_frequencies(word_counts)
    
    # 显示生成的词云图片
    plt.imshow(my_cloud, interpolation='bilinear')
    # 显示设置词云图中无坐标轴
    plt.axis('off')
    plt.show()
    

    运行效果如下:

    (6) 查看招聘岗位的职位福利,词云展示。

    代码与上文一致

    运行效果如下:职位福利关键词中出现频率较高的有五险一金、年终奖金、绩效奖金、定期体检、餐饮补贴等。

    源码&数据下载

    https://alltodata.cowtransfer.com/s/b1c87350fd8a47


  • 相关阅读:
    Java Swing 空布局
    Java Swing 盒布局管理器
    遇到的JDBC的一些简单错误
    JVM内存调整
    jeesite中重启项目时用户头像丢失的疑惑
    Java服务突然失败:A fatal error has been detected by the Java Runtime Environment的总结
    从官网下载历史版本的java
    容器未来会怎么发展?容器安全怎么样?容器使用效果如何?
    What's The Next|Kube-OVN 社区线上 Meetup 预告!
    灵雀云发布云原生制品仓库Harbor企业版(Alauda Registry Service for Harbor)
  • 原文地址:https://www.cnblogs.com/finer/p/14127659.html
Copyright © 2011-2022 走看看