某直聘python岗位 ——Python爬虫
Posted 不想秃头的晨晨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了某直聘python岗位 ——Python爬虫相关的知识,希望对你有一定的参考价值。
某直聘python岗位 ——Python爬虫
大家好!我是晨晨💓
希望大家多多支持我!
为了感谢每一个关注我的小可爱:💓文章留言“学习”即可获取晨晨精心准备的学习大礼包,都是无偿分享滴💓
最后——如果文章有帮助到你,记得“关注”、“点赞”、“评论”三连哦~
————————————————
过年了,爬爬看python需要什么技能才能有备无患。
大体思路:
- 爬所需信息
- 爬一爬详情页做个可视化词云,看看所需节能
- 做一做数据可视化
所需库:
csv
,保存数据用的selenium
,模拟真人访问网站,因为requests很容易被反爬parsel
和requests
,可以尝试爬详情页random
,随机休眠用的time
,时间模块儿
翻页爬取python岗位信息代码:
翻页爬取python岗位信息代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
import csv
import time
import random
import requests
import parsel
f = open('boss.csv', mode='a', encoding='utf-8-sig', newline='')
csvWriter = csv.DictWriter(f, fieldnames=[
'标题',
'地区',
'薪资',
'经验',
'公司名',
'公司领域',
'福利',
'公司规模',
'详情页',
# '所需技能',
])
csvWriter.writeheader() # 写入头
url = 'https://www.zhipin.com/c100010000/?query=python&ka=sel-city-100010000'
driver = webdriver.Chrome()
driver.get(url=url)
driver.implicitly_wait(10)
driver.maximize_window() # 最大化窗口
# lis = driver.find_elements_by_css_selector('.job-list ul li')
def get_job_details():
lis = driver.find_elements(By.CSS_SELECTOR, '.job-list ul li')
for li in lis:
title = li.find_element(By.CSS_SELECTOR, '.job-name a').text # 标题
area = li.find_element(By.CSS_SELECTOR, '.job-area').text # 地区
salary = li.find_element(By.CSS_SELECTOR, '.job-limit .red').text # 薪资
experience = li.find_element(By.CSS_SELECTOR, '.job-limit p').text # 工作经验
companyName = li.find_element(By.CSS_SELECTOR, '.company-text h3 a').text # 公司名
companyStyle = li.find_element(By.CSS_SELECTOR, '.company-text p a').text # 公司领域
welfare = li.find_element(By.CSS_SELECTOR, '.info-desc').text # 公司福利
peopleInclude = li.find_element(By.CSS_SELECTOR, '.company-text p em').text # 公司规模
detailPage = li.find_element(By.CSS_SELECTOR, '.job-name a').get_attribute('href') # 详情页
# skillsNeed = get_skills_desc(desc_url=detailPage) # 加载窗口
print(title, area, salary, experience, companyName, companyStyle, peopleInclude, detailPage, skillsNeed, sep=' | ')
dit =
'标题': title,
'地区': area,
'薪资': salary,
'经验': experience,
'公司名': companyName,
'公司领域': companyStyle,
'福利': welfare,
'公司规模': peopleInclude,
'详情页': detailPage,
# '所需技能': skillsNeed,
csvWriter.writerow(dit) # 逐行写入
# def get_skills_desc(desc_url):
# # 获取详情页所需技能的函数
# # 加载另一个窗口
# js = 'window.open()'
# driver.execute_script(js) # 打开新窗口
# driver.switch_to.window(window_name=driver.window_handles[-1]) # 切换到刚打开的窗口
# # 开始加载url
# driver.get(url=desc_url) # 加载详情页url
# driver.implicitly_wait(10) # 等待网页加载完成
# skills_need = driver.find_element(By.CSS_SELECTOR, '.text') # 直接查找描述字段
# return skills_need
for page in range(1, 100 + 1):
print(f'------------------------正在爬取第page页内容----------------------------')
time.sleep(random.uniform(2,5))
get_job_details() # 获取信息
next_button = driver.find_element(By.CSS_SELECTOR, '.page .next')
if next_button: # 如果找到,就表示有下一页
next_button.click() # 点击下一页
else:
print(f'已经没有了! 第page已经是最后一页!')
driver.quit() # 退出浏览器
爬虫代码本来想把详情页都爬了,一口气吃成胖子,发现有错误,因为详情页的内容只需要做词云(展示python岗位所需的技能)。所以分开爬,不注重过程,只注重结果。
优化爬虫代码,把详情页的所需技能也爬出来:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
import csv
import time
import random
import requests
import parsel
f = open('boss.csv', mode='a', encoding='utf-8-sig', newline='')
csvWriter = csv.DictWriter(f, fieldnames=[
'标题',
'地区',
'薪资',
'经验',
'公司名',
'公司领域',
'福利',
'公司规模',
'详情页',
'所需技能',
])
csvWriter.writeheader() # 写入头
url = 'https://www.zhipin.com/c100010000/?query=python&ka=sel-city-100010000'
driver = webdriver.Chrome()
driver.get(url=url)
driver.implicitly_wait(10)
driver.maximize_window() # 最大化窗口
# lis = driver.find_elements_by_css_selector('.job-list ul li')
def get_job_details():
lis = driver.find_elements(By.CSS_SELECTOR, '.job-list ul li')
for li in lis:
title = li.find_element(By.CSS_SELECTOR, '.job-name a').text # 标题
area = li.find_element(By.CSS_SELECTOR, '.job-area').text # 地区
salary = li.find_element(By.CSS_SELECTOR, '.job-limit .red').text # 薪资
experience = li.find_element(By.CSS_SELECTOR, '.job-limit p').text # 工作经验
companyName = li.find_element(By.CSS_SELECTOR, '.company-text h3 a').text # 公司名
companyStyle = li.find_element(By.CSS_SELECTOR, '.company-text p a').text # 公司领域
welfare = li.find_element(By.CSS_SELECTOR, '.info-desc').text # 公司福利
peopleInclude = li.find_element(By.CSS_SELECTOR, '.company-text p em').text # 公司规模
detailPage = li.find_element(By.CSS_SELECTOR, '.job-name a').get_attribute('href') # 详情页
if detailPage: # 判定是否有详情页
js = 'window.open()'
driver.execute_script(js) # 打开一个新窗口
driver.switch_to.window(window_name=driver.window_handles[-1]) # 切换到最后一个窗口
driver.maximize_window() # 最大化创库
driver.get(detailPage) # 请求详情页
driver.implicitly_wait(10) # 隐式等待
skillsNeed = driver.find_element(By.CSS_SELECTOR, '.text').text
driver.close() # 关闭当前窗口
time.sleep(random.uniform(1, 5)) # 随机休眠
driver.switch_to.window(driver.window_handles[0]) # 切回第一个窗口
print(title, area, salary, experience, companyName, companyStyle, peopleInclude, detailPage, skillsNeed, sep=' | ')
dit =
'标题': title,
'地区': area,
'薪资': salary,
'经验': experience,
'公司名': companyName,
'公司领域': companyStyle,
'福利': welfare,
'公司规模': peopleInclude,
'详情页': detailPage,
'所需技能': skillsNeed,
csvWriter.writerow(dit) # 逐行写入
# def get_skills_desc(desc_url):
# # 获取详情页所需技能的函数
# # 加载另一个窗口
# js = 'window.open()'
# driver.execute_script(js) # 打开新窗口
# driver.switch_to.window(window_name=driver.window_handles[-1]) # 切换到刚打开的窗口
# # 开始加载url
# driver.get(url=desc_url) # 加载详情页url
# driver.implicitly_wait(10) # 等待网页加载完成
# skills_need = driver.find_element(By.CSS_SELECTOR, '.text') # 直接查找描述字段
# return skills_need
for page in range(1, 10 + 1):
print(f'------------------------正在爬取第page页内容----------------------------')
time.sleep(random.uniform(2,5))
get_job_details() # 获取信息
next_button = driver.find_element(By.CSS_SELECTOR, '.page .next')
if next_button: # 如果找到,就表示有下一页
next_button.click() # 点击下一页
else:
print(f'已经没有了! 第page已经是最后一页!')
driver.quit() # 退出浏览器
做个可视化大屏
import pandas as pd
from pyecharts.charts import *
import pyecharts.options as opts
from pyecharts.globals import ThemeType
df = pd.read_csv('boss.csv') # 读取csv文档
dq = df.groupby('地区').count()['标题'] # 按地区提取数量
# print(df['地区'].str[0:2])
# 提取地区的前两位
diqu = df['地区'].str[0:2].value_counts() # 统计一下每个地区的招聘数量
label = diqu.index.tolist() # 要画图的标签
data = diqu.values.tolist() # 要画图的数据
def bossBar():
b = (
Bar(init_opts=opts.InitOpts(width='1080px', height='960px', theme=ThemeType.LIGHT))
.add_xaxis(label)
.add_yaxis(series_name='招聘数量', y_axis=data, bar_max_width='50px',)
.set_global_opts(
title_opts=opts.TitleOpts(title='各地区招聘数量柱状图'),
toolbox_opts=opts.ToolboxOpts(),
tooltip_opts=opts.TooltipOpts(
trigger='axis',
axis_pointer_type='cross',
),
)
)
return b
def bossReverselBar():
b = (
Bar(init_opts=opts.InitOpts(width='1080px', height='960px', theme=ThemeType.LIGHT))
.add_xaxis(label)
.add_yaxis(series_name='招聘数量', y_axis=data, label_opts=opts.LabelOpts(is_show=False), bar_max_width='100px')
.set_global_opts(
title_opts=opts.TitleOpts(
title='各地区招聘数量反转柱状图',
title_textstyle_opts=opts.TextStyleOpts(font_size=27),
),
legend_opts=opts.LegendOpts(
pos_left='10%',
pos_top='10%',
),
tooltip_opts=opts.TooltipOpts(
is_show=True,
trigger='axis',
axis_pointer_type='cross',
),
toolbox_opts=opts.ToolboxOpts(),
)
.reversal_axis() # 反转坐标轴
)
return b
def bossPie():
p = (
Pie(init_opts=opts.InitOpts(width='1580px', height='660px', theme=ThemeType.LIGHT))
.add('', center=['280', '330'], data_pair=[list(z) for z in zip(label, data)]) # 饼图
.add('', center=['780', '330'], data_pair=[list(z) for z in zip(label, data)], radius=['40%', '70%']) # 环图
.add('', center=['1280', '330'], data_pair=[list(z) for z in zip(label, data)], rosetype='radius') # 南丁格尔图
.set_global_opts(
title_opts=opts.TitleOpts(
title='各地区招聘数量饼图',
title_textstyle_opts=opts.TextStyleOpts(font_size=27),
),
legend_opts=opts.LegendOpts(
pos_left='10%',
pos_top='10%',
),
)
.set_series_opts(label_opts=opts.LabelOpts(
is_show=True,
formatter='b:c:d'),
)
)
return p
# 开始制作可视化大屏
page = Page(layout=Page.DraggablePageLayout, page_title='基于boss直聘的可视化大屏') #DraggablePageLayout可以调整可视化布局
page.add(
bossBar(),
bossReverselBar(),
bossPie(),
).render('基于boss直聘的可视化大屏.html')
# 上面代码生成可视化可编辑大屏,对图片布局完成之后,要记得点击左上角的save config按钮对布局文件进行保存。之后本地会生成一个chart_config.json文件,然后运行下面的代码:
page.save_resize_html('可视化大屏设置.html', cfg_file='chart_config.json', dest='可视化大屏.html')
再做个可视化词云
from stylecloud import gen_stylecloud
import pandas as pd
import re
import jieba
df = pd.read_csv('boss.csv') # 打开文档
contentList = df['所需技能'].to_list() # 从csv文档里提取出的列表
contentStr = ''.join(contentList) # 将上面的列表转换成字符串
print(contentList)
print(contentStr)
# 对字符串进行处理,替换标点和换行符
wordStr = re.sub('[0-9a-zA-Z\\< =\\":\\/;\\.\\_\\->\\\\+]\\[;,?#,。!“”、\\@...\\'\\?\\%…\\&]', '',contentStr)
print(wordStr)
# 将处理好的字符串进行jieba分词
jiebaWords = jieba.cut(wordStr) # 是个生成器
# 将jieba分号的词再转成字符串
needWords = ' '.join(jiebaWords)
print(needWords)
stopWords = ['熟练', '使用', '等', '和', '家长', '招', '乐高', '老师', '及', '招', '职责',
'及其', '了解', '可', '选', '好', '以下', '有', '会', '语言', '有过', '的', '时',
'者', '优先', '小', '以上', '出差', '年', '或', '并', '与', '进行', '至少', '内容',
'能', '或者', '对', '要求', '一定', '做', '工资', '其他', '职位', '云'] # 与展示节能无关的词
gen_stylecloud(
text=needWords,
size=1280, # stylecloud的大小,长度和宽度,
font_path='C:\\\\Windows\\\\Fonts\\\\simhei.ttf', # 字体路径
max_words=150, # stylecloud中能容的最多词数
max_font_size=200, # 最大字号
# invert_mask=, # 蒙版
custom_stopwords=stopWords, # 停用词
output_name='1.png', # 输出的名字
)
效果类似如下
你们的支持是我最大的动力!!记得三连哦~
关注小编获取更多精彩内容!
制作不易,记得一键三连哦!!
以上是关于某直聘python岗位 ——Python爬虫的主要内容,如果未能解决你的问题,请参考以下文章
#私藏项目实操分享#Python爬虫实战,pytesseract模块,Python实现拉勾网岗位数据可视化