某直聘python岗位 ——Python爬虫

Posted 不想秃头的晨晨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了某直聘python岗位 ——Python爬虫相关的知识,希望对你有一定的参考价值。

大家好!我是晨晨💓
希望大家多多支持我!
为了感谢每一个关注我的小可爱:💓文章留言“学习”即可获取晨晨精心准备的学习大礼包,都是无偿分享滴💓
最后——如果文章有帮助到你,记得“关注”、“点赞”、“评论”三连哦~
————————————————

过年了,爬爬看python需要什么技能才能有备无患。

大体思路:

  • 爬所需信息
  • 爬一爬详情页做个可视化词云,看看所需节能
  • 做一做数据可视化

所需库:

  • csv,保存数据用的
  • selenium,模拟真人访问网站,因为requests很容易被反爬
  • parselrequests,可以尝试爬详情页
  • 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岗位 ——Python爬虫

python爬虫-抓取BOSS直聘python岗位招聘信息

#私藏项目实操分享#Python爬虫实战,pytesseract模块,Python实现拉勾网岗位数据可视化

利用Python爬虫获取招聘网站职位信息

scrapy-boss直聘

python3 + scrapy 抓取boss直聘岗位