当前位置:   article > 正文

python爬虫并做可视化分析--前程无忧_51job爬虫可视化

51job爬虫可视化

 一.数据采集

1.采集逻辑

 2.数据schema

招聘信息Schema

{

"岗位名称": "财务会计主管",

"薪资":"1.3-2万",

"地址": "*******",

"经验要求": "5-7年",

"公司名": "********",

"公司类型": "民营",

"人员规模": "少于50人",

"发展领域": "*******",

"工作福利": "****************",

"发布时间":"06-09发布"

}

3.数据爬取

        1.下载相关库并导入
  1. #下载相关库
  2. pip install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium
  3. pip install undetected_chromedriver
  4. #导入相关库
  5. import csv
  6. import random
  7. import time
  8. import re
  9. from time import sleep
  10. from selenium import webdriver
  11. import undetected_chromedriver as uc
  12. from selenium.webdriver import ActionChains
  13. from selenium.webdriver import ChromeOptions
  14. from selenium.webdriver.common.by import By
        2.实例化浏览器对象
  1. # # 实例化一个浏览器对象
  2. driver=uc.Chrome()

注:使用selenium时可能会被检测,因此使用undetected_chromedriver 可以防止浏览器特征被识别,并且可以根据浏览器版本自动下载驱动。(建议浏览器更新到最新版本,避免不必要问题)

        3.发起请求
  1. #发起请求
  2. driver.get("https://www.51job.com/")
  3. sleep(3)

设置休眠时间,避免网络卡顿等问题。

        4.键入关键词并搜索
  1. #键入关键词并搜索
  2. driver.find_element(By.XPATH, '//*[@id="kwdselectid"]').click()
  3. driver.find_element(By.XPATH, '//*[@id="kwdselectid"]').clear()
  4. driver.find_element(By.XPATH, '//*[@id="kwdselectid"]').send_keys('会计')
  5. driver.find_element(By.XPATH, '/html/body/div[3]/div/div[1]/div/button').click()
  6. sleep(5)

利用send_keys方法传入关键词,并通过xpath定位输入框和确定按钮,完成搜索工作。

        5.数据提取
  1. data=driver.page_source
  2. sleep(3)
  3. jobName=re.findall('class="jname at">(.*?)</span>',data,re.S)
  4. jobSalary=re.findall('class="sal">(.*?)</span>',data,re.S)
  5. address=[]
  6. experience=[]
  7. education=[]
  8. for req in re.findall('class="d at">(.*?)</p>',data,re.S):
  9. require=("".join(re.findall('<span data-v-b4bd26a2="">(.*?)</span>',req,re.S))).split('|')
  10. if len(require)==2:
  11. require.append('无学历要求')
  12. address.append(require[0])
  13. experience.append(require[1])
  14. education.append(require[2])
  15. companyName=re.findall('class="cname at">(.*?)</a>',data,re.S)
  16. companyType=[]
  17. companySize=[]
  18. for comp in re.findall('class="dc at">(.*?)</p>',data,re.S):
  19. #中间变量m
  20. m=("".join(comp).split('|'))
  21. if len(m)==2:
  22. companyType.append(m[0].strip())
  23. companySize.append(m[1].strip())
  24. else:
  25. companyType.append(m[0].strip())
  26. companySize.append("无公司规模数据")
  27. companyStatus=re.findall('class="int at">(.*?)</p>',data,re.S)
  28. jobWelf=[]
  29. for tag in re.findall('class="tags">(.*?)</p>',data,re.S):
  30. #中间变量n
  31. n=re.findall('<i data-v-b4bd26a2="">(.*?)</i>',tag,re.S)
  32. if len(n)==0:
  33. jobWelf.append('无工作福利数据')
  34. else:
  35. jobWelf.append(" ".join(n))
  36. updatetime = re.findall('class="time">(.*?)</span>', data, re.S)

其中,data为当前页的源代码,后续利用正则对数据进行提取(注:随着时间推移,源代码可能有稍微变动,需注意并修改正则表达式中的pattern)

        6.页面跳转
  1. driver.find_element(By.XPATH, '//*[@id="jump_page"]').click()
  2. sleep(random.randint(10, 30) * 0.1)
  3. driver.find_element(By.XPATH, '//*[@id="jump_page"]').clear()
  4. sleep(random.randint(10, 40) * 0.1)
  5. driver.find_element(By.XPATH, '//*[@id="jump_page"]').send_keys(page)
  6. sleep(random.randint(10, 30) * 0.1)
  7. driver.find_element(By.XPATH,
  8. '//*[@id="app"]/div/div[2]/div/div/div[2]/div/div[2]/div/div[3]/div/div/span[3]').click()
  9. sleep(random.randint(10, 40) * 0.1)

定位页码输入框并输入数字,点击跳转按钮实现跳转。在这个过程,每一步设置随机时间的休眠,防止被检测。

4.数据存储

本例中将数据导入csv文件:

  1. #创建csv文件
  2. with open('无忧-会计.csv', 'a', newline='') as csvfile:
  3. writer = csv.writer(csvfile)
  4. writer.writerow(['岗位名称','薪资','地址','经验要求','学历要求','公司名','公司类型','人员规模','发展领域','工作福利','发布时间'])
  5. with open('无忧-会计.csv', 'a', newline='') as csvfile:
  6. writer = csv.writer(csvfile)
  7. for i in list(zip(jobName,jobSalary,address,experience,education,companyName,companyType,companySize,companyStatus,jobWelf,updatetime)):
  8. writer.writerow(i)

上述是数据采集模块的代码,需要大家充分理解各部分的功能从而完成采集工作。

二.可视化分析

1.数据预览

2.导入库及数据

  1. import pandas as pd
  2. import numpy as np
  3. from pyecharts.charts import Pie
  4. from pyecharts.charts import Funnel
  5. from pyecharts.globals import ThemeType
  6. import pyecharts.options as opts
  7. #读取数据
  8. df=pd.read_csv('无忧-会计.csv',encoding='gbk')

3.不同类型公司占比饼状图

  1. companyType_valuecount=list(zip(df['公司类型'].value_counts().index,df['公司类型'].value_counts().values.tolist()))
  2. #饼状图
  3. pie=(
  4. Pie()
  5. .add(series_name="",data_pair=companyType_valuecount,radius=["20%","65%"])
  6. .set_global_opts(title_opts=opts.TitleOpts(title="公司类型占比图",subtitle="--饼状图"))
  7. .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%"))
  8. )
  9. pie.render_notebook()

由上图可知:绝大多数公司为民营企业,占比为80.8%,...........(读者自由发挥)

4.各公司的人员规模占比饼状图

  1. companySize_valuecount=list(zip(df['人员规模'].value_counts().index,df['人员规模'].value_counts().values.tolist()))
  2. #饼状图
  3. pie=(
  4. Pie()
  5. .add(series_name="",data_pair=companySize_valuecount,rosetype="area",radius=["15%","80%"])
  6. .set_global_opts(title_opts=opts.TitleOpts(title="人员规模占比图",subtitle="--饼状图",pos_top='bottom',pos_left='right'))
  7. .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{c}家"))
  8. )
  9. pie.render_notebook()

由上图可知:................................

 5.学历需求度分析--漏斗图

  1. education_valuecount=list(zip(df['学历要求'].value_counts().index,df['学历要求'].value_counts().values.tolist()))
  2. #漏斗图
  3. funnel=(
  4. Funnel()
  5. .add(series_name="学历",data_pair=education_valuecount,sort_="ascending")
  6. .set_global_opts(title_opts=opts.TitleOpts(title="学历需求度",subtitle="--漏斗图"),
  7. legend_opts=opts.LegendOpts(pos_left="left",pos_top="middle",orient = 'vertical'))
  8. )
  9. funnel.render_notebook()

由上图可知:....................

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/696039
推荐阅读
相关标签
  

闽ICP备14008679号