Olá a todos, acabei de me formar agora. Muitos amigos não gostam porque não conseguem encontrar um emprego ou procuraram muito. Alguns deles são preguiçosos. Está muito quente e eles não querem sair para dar uma olhada.
Portanto, hoje compartilharei com você o uso do Python para coletar dados de recrutamento em lotes, realizar análises visuais e encontrar facilmente seu emprego favorito!
Não há muito a dizer, vamos começar diretamente~
Preparação
ferramentas de software
- Python 3.8
- PycharmName
- Google Chrome
- Google Drive
selenium --> módulo de teste automatizado
para simular o comportamento humano para operar o navegador
operação manual
- Navegador aberto
- insira URL
- Encontre o conteúdo de dados que precisamos
- Copie e cole manualmente no arquivo da tabela
uso do módulo
selenium # pip install selenium==3.141.0 自动化测试 操作浏览器
csv # 保存数据 保存csv文件
win + R, digite cmd e digite o comando de instalação pip install nome do módulo (se você acha que a velocidade de instalação é lenta, você pode alternar a fonte do espelho doméstico)
Se você não entender o artigo, também preparei uma explicação em vídeo, que acompanha o código, e o cartão de visita no final do artigo é feito por você
Código da peça de aquisição de dados
Navegador aberto
Seleção e download do driver do navegador:
- Verifique a versão do navegador
- Selecione a versão do driver mais próxima da versão do seu navegador
- O arquivo do driver <não é necessário clicar duas vezes para instalar>, coloque-o diretamente no diretório de instalação do python
Código principal
driver = webdriver.Chrome()
# 访问网站
driver.get(
'https://www.***.com/zhaopin/?inputFrom=www_index&workYearCode=0&key=python&scene=input&ckId=rn8762mqhk78fi3d9fiqzzoobk7f66u9&dq=')
"""
找到我们需要的数据内容
前提 -> 你要让网页元素<数据>加载出来
通过元素定位, 获取数据内容 <通过标签提取数据>
"""
# 设置延时, 让网页元素加载完整
driver.implicitly_wait(10) # 隐式等待, 只要网页加载出来就运行下面的代码
time.sleep(1) # 死等, 一定要等够
# 获取所有招聘信息对应div标签
divs = driver.find_elements_by_css_selector('.job-list-box div .job-card-left-box')
# print(driver) # webdriver.Chrome() 返回selenium对象
# print(divs) # 返回列表, 列表里面元素是selenium对象
for div in divs:
"""
提取具体数据内容, 提取每个div标签里面所包含的数据内容
.job-title-box div.ellipsis-1
"""
# 职位
title = div.find_element_by_css_selector('.job-title-box div.ellipsis-1').text
# 城市
city = div.find_element_by_css_selector('.job-title-box span.ellipsis-1').text
salary = div.find_element_by_css_selector('.job-salary').text
# 列表推导式
info_list = [i.text for i in div.find_elements_by_css_selector('.job-labels-box .labels-tag')]
print(info_list)
exp = info_list[0]
edu = info_list[1]
labels = ','.join(info_list[2:])
company = div.find_element_by_css_selector('.company-name').text
company_type = div.find_element_by_css_selector('.company-tags-box span').text
company_num = div.find_element_by_css_selector('.company-tags-box span:last-of-type').text
href = div.find_element_by_css_selector('.job-detail-box a').get_attribute('href')
dit = {
'职位': title,
'城市': city,
'薪资': salary,
'经验': exp,
'学历': edu,
'技术点': labels,
'公司': company,
'公司领域': company_type,
'公司规模': company_num,
'详情页': href,
}
csv_writer.writerow(dit)
print(dit)
salvar formulário
f = open('python.csv', mode='w', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
'职位',
'城市',
'薪资',
'经验',
'学历',
'技术点',
'公司',
'公司领域',
'公司规模',
'详情页',
])
csv_writer.writeheader()
Visualização
ler arquivo
import pandas as pd
df = pd.read_csv('data.csv')
df.head()
Distribuição de requisitos educacionais para cargos de python
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
c = (
Pie()
.add(
"",
[
list(z)
for z in zip(
edu_type,
edu_num,
)
],
center=["40%", "50%"],
)
.set_global_opts(
title_opts=opts.TitleOpts(title="python职位学历需求分布"),
legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
c.load_javascript()
Distribuição de requisitos educacionais para cargos de python
edu_num = df['经验'].value_counts().to_list()
edu_type = df['经验'].value_counts().index.to_list()
c = (
Pie()
.add(
"",
[
list(z)
for z in zip(
edu_type,
edu_num,
)
],
center=["40%", "50%"],
)
.set_global_opts(
title_opts=opts.TitleOpts(title="python职位经验需求分布"),
legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
c.render_notebook()
distribuição de cidade de trabalho python
edu_num = df['城市'].str[:2].value_counts().to_list()
edu_type = df['城市'].str[:2].value_counts().index.to_list()
c = (
Pie()
.add(
"",
[
list(z)
for z in zip(
edu_type,
edu_num,
)
],
center=["40%", "50%"],
)
.set_global_opts(
title_opts=opts.TitleOpts(title="python职位城市分布"),
legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
c.render_notebook()
Distribuição de campo da empresa Python
edu_num = df['公司领域'].value_counts().to_list()
edu_type = df['公司领域'].value_counts().index.to_list()
c = (
Pie()
.add(
"",
[
list(z)
for z in zip(
edu_type,
edu_num,
)
],
center=["40%", "50%"],
)
.set_global_opts(
title_opts=opts.TitleOpts(title="python公司领域分布"),
legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
c.render_notebook()
Bem, esse é o fim do compartilhamento de hoje, até a próxima!