Python爬取招聘网站数据,并可视化展示招聘需求、薪资、招聘人数等数据

迈不过友情╰ 2022-09-12 14:54 685阅读 0赞

课程亮点

  1. 爬虫的基本流程
  2. re正则表达式模块的简单使用
  3. requests模块的使用
  4. 保存csv

环境介绍

  • python 3.8 >>> 安装包找木子老师领取
  • pycharm 2021专业版 需要激活可以找木子老师领取
  • pycharm 社区版 (免费) 没有主题
    专业版 (需要激活码)

模块使用

  • requests >>> pip install requests (数据请求模块)
  • re
  • json
  • csv
  • time

如果你要去爬取网站数据内容

  1. 就要去分析 数据是从哪里来得
    通过开发者工具进行分析
    (找数据内容)
  2. 发送请求 对于目标网址发送请求
  3. 获取数据内容 网页源代码 response.text

【付费VIP完整版】只要看了就能学会的教程,80集Python基础入门视频教学

点这里即可免费在线观看

爬虫代码

导入模块

  1. import requests # 数据请求模块 pip install requests
  2. import re # 正则表达式模块
  3. import json # 序列化与反序列化
  4. import pprint # 格式化输出模块
  5. import csv
  6. import time # 时间模块

发送请求 对于目标网址发送请求

  1. url = f'https://search.51job.com/list/010000%252C020000%252C030200%252C040000%252C180200,000000,0000,00,9,99,python,2,1.html'
  2. headers = {
  3. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36'
  4. }
  5. # 发送请求 requests调用里面get请求方法 然后把 url 以及 headers 传进去
  6. response = requests.get(url=url, headers=headers)
  7. # <Response [200]> 返回响应对象 response 200状态码 表示请求成功

解析数据内容 提取想要数据

  1. # re正则表达式 re正则表达式 可以直接提取字符串数据
  2. # 使用re模块里面findall()方法
  3. html_data = re.findall('window.__SEARCH_RESULT__ = (.*?)</script>', response.text)[0]
  4. # 正则匹配出来的数据 是列表 []
  5. json_data = json.loads(html_data)['engine_jds']
  6. print(json_data)
  7. for index in json_data:
  8. # 等号左边都是自定义变量
  9. # pprint.pprint(index)
  10. title = index['job_title'] # 职位名字
  11. company_name = index['company_name'] # 公司名字
  12. money = index['providesalary_text'] # 薪资
  13. job_welf = index['jobwelf'] # 福利
  14. # job_info = index['attribute_text'] #基本信息
  15. area = index['attribute_text'][0] # 城市
  16. exp = index['attribute_text'][1] # 经验
  17. edu = index['attribute_text'][2] # 学历
  18. company_type = index['companyind_text'] # 公司类型
  19. date = index['updatedate'] # 发布日期
  20. href = index['job_href'] # 招聘详情页
  21. # 复制一行 ctrl + D
  22. dit = {
  23. '职位名字': title,
  24. '公司名字': company_name,
  25. '薪资': money,
  26. '公司福利': job_welf,
  27. '地区': area,
  28. '经验': exp,
  29. '学历': edu,
  30. '公司类型': company_type,
  31. '发布日期': date,
  32. '详情页': href,
  33. }
  34. print(title, company_name, money, area, exp, edu, job_welf, company_type, date, href)
  35. csv_writer.writerow(dit)

保存数据

  1. f = open('数据.csv', mode='a', encoding='utf-8', newline='')
  2. csv_writer = csv.DictWriter(f, fieldnames=[
  3. '职位名字',
  4. '公司名字',
  5. '薪资',
  6. '公司福利',
  7. '地区',
  8. '经验',
  9. '学历',
  10. '公司类型',
  11. '发布日期',
  12. '详情页',
  13. ])
  14. csv_writer.writeheader() # 写入表头

运行代码

2bda629ce580b84678990887677233d5.png

数据可视化代码

导入模块

  1. import pandas as pd
  2. from pyecharts.charts import *
  3. from pyecharts import options as opts
  4. import matplotlib.pyplot as plt
  5. plt.rcParams['font.sans-serif']=['SimHei']
  6. plt.rcParams['axes.unicode_minus']=False

导入数据

  1. boss = pd.read_csv('data.csv', engine='python', encoding='utf-8')
  2. boss

add922cd0cc7cdd90c7b9492e1557619.png

薪资区间

  1. import numpy as np
  2. def shulie(first,end,step):
  3. x = []
  4. for i in np.arange(first, end,step):
  5. x.append(i)
  6. return x
  7. list_1 = shulie(0,10,0.5)
  8. boss['top'].plot.hist(bins=30,figsize=(20,8),edgecolor="black")
  9. plt.xticks(list_1)
  10. plt.xlabel('万/月')
  11. plt.ylabel('数量')
  12. plt.show()

194eaedab0aa04e025b130b860bbc4a7.png

经验、学历要求情况

  1. c = (
  2. Pie(init_opts=opts.InitOpts(width="1000px", height="600px", bg_color="#2c343c"))
  3. .add(
  4. series_name="经验需求占比",
  5. data_pair=data_pair_1,
  6. rosetype="radius",
  7. radius="55%",
  8. center=["25%", "50%"],
  9. label_opts=opts.LabelOpts(is_show=False, position="center", color="rgba(255, 255, 255, 0.3)"),
  10. )
  11. .add(
  12. series_name="学历需求占比",
  13. data_pair=data_pair_2,
  14. radius="55%",
  15. center=["75%", "50%"],
  16. label_opts=opts.LabelOpts(is_show=False, position="center", color="rgba(255, 255, 255, 0.3)"),
  17. )
  18. .set_series_opts(
  19. tooltip_opts=opts.TooltipOpts(
  20. trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"
  21. ),
  22. label_opts=opts.LabelOpts(color="rgba(255, 255, 255, 0.3)"),
  23. )
  24. .set_global_opts(
  25. title_opts=opts.TitleOpts(
  26. title="经验、学历需求占比",
  27. pos_left="center",
  28. pos_top="20",
  29. title_textstyle_opts=opts.TextStyleOpts(color="#fff"),
  30. ),
  31. legend_opts=opts.LegendOpts(is_show=False),
  32. )
  33. .set_colors(["#D53A35", "#334B5C", "#61A0A8", "#D48265", "#749F83"])
  34. )
  35. c.render_notebook()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TbQWT2OU-1632641295183)(https://upload-images.jianshu.io/upload\_images/27098966-2a173fd9f7108354.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\]

哪些地区招聘人员比较多

  1. from pyecharts.globals import SymbolType
  2. address_count = boss.groupby('地区').count()['公司名字'].sort_values()
  3. x = address_count.index.tolist()
  4. y = address_count.values.tolist()
  5. c = (
  6. PictorialBar()
  7. .add_xaxis(x)
  8. .add_yaxis(
  9. "",
  10. y,
  11. label_opts=opts.LabelOpts(is_show=False),
  12. symbol_size=18,
  13. symbol_repeat="fixed",
  14. symbol_offset=[0, 0],
  15. is_symbol_clip=True,
  16. symbol=SymbolType.ROUND_RECT,
  17. )
  18. .reversal_axis()
  19. .set_global_opts(
  20. title_opts=opts.TitleOpts(title="地区人员招聘数量"),
  21. xaxis_opts=opts.AxisOpts(is_show=False),
  22. yaxis_opts=opts.AxisOpts(
  23. axistick_opts=opts.AxisTickOpts(is_show=False),
  24. axisline_opts=opts.AxisLineOpts(
  25. linestyle_opts=opts.LineStyleOpts(opacity=0)
  26. ),
  27. ),
  28. )
  29. )
  30. c.render_notebook()

894b3368e3f6e6357ffef537cc1090a2.png

经验要求 和 薪资情况的情况 是不是薪资越高 经验要求越高

  1. mean = boss.groupby('经验')['工资平均'].mean().sort_values()
  2. x = mean.index.tolist()
  3. y = mean.values.tolist()
  4. c = (
  5. Bar()
  6. .add_xaxis(x)
  7. .add_yaxis(
  8. "工作经验",
  9. y,
  10. markpoint_opts=opts.MarkPointOpts(
  11. data=[opts.MarkPointItem(name="无需经验", coord=[x[3], y[3]], value=y[3])]
  12. )
  13. )
  14. .set_global_opts(title_opts=opts.TitleOpts(title="不同工作经验的平均薪资"))
  15. .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
  16. )
  17. c.render_notebook()

e805f23ddaf3a1575255158e404989d5.png

  1. mean = boss.groupby('学历')['工资平均'].mean().sort_values()
  2. x = mean.index.tolist()
  3. y = mean.values.tolist()
  4. c = (
  5. Bar()
  6. .add_xaxis(x)
  7. .add_yaxis(
  8. "学历",
  9. y,
  10. markpoint_opts=opts.MarkPointOpts(
  11. data=[opts.MarkPointItem(name="学历不限", coord=[x[1], y[1]], value=y[1])]
  12. )
  13. )
  14. .set_global_opts(title_opts=opts.TitleOpts(title="不同学历的平均薪资"))
  15. .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
  16. )
  17. c.render_notebook()

02f8d273556bd52ee5a52a115d292a28.png

词云图

公司福利

  1. import jieba
  2. words = jieba.lcut(text)
  3. #通过遍历words的方式,统计出每个词出现的频次
  4. counts = { }
  5. for word in words:
  6. if len(word) == 1:
  7. continue
  8. else:
  9. counts[word] = counts.get(word,0) + 1
  10. c = (
  11. WordCloud()
  12. .add(series_name="热点分析", data_pair=new, word_size_range=[6, 66])
  13. .set_global_opts(
  14. title_opts=opts.TitleOpts(
  15. title="公司福利", title_textstyle_opts=opts.TextStyleOpts(font_size=23)
  16. ),
  17. tooltip_opts=opts.TooltipOpts(is_show=True),
  18. )
  19. )
  20. c.render_notebook()

0d7bb08f1c4556fd7e5a8b0ae160ab42.png

对于本篇文章有疑问,或者想要数据集的同学也可以点这里

发表评论

表情:
评论列表 (有 0 条评论,685人围观)

还没有评论,来说两句吧...

相关阅读