嗨喽~大家好呀,这里是魔王呐 ❤ ~!

python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取

环境使用:

Python
Pycharm

模块使用:

selenium --> pip install selenium==3.141.0
time
csv

驱动下载地址: https://googlechromelabs.github.io/chrome-for-testing/#stable

小思路

今天案例使用: 谷歌浏览器

selenium 模拟人的行为操作浏览器:

自动打开浏览器, 获取网页上面数据内容

多页数据采集: 需要登陆账号才能实现翻页

通过selenium实现免登陆操作:

使用selenium访问网址的时候, 网页状态是登陆的状态

智联招聘如果你想要通过requests获取数据:

需要学习JS逆向 --> 瑞数5

js逆向比较复杂 --> 通过selenium去获取数据 但是效率很低

获取数据代码

“”“导入模块”“”

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 导入自动化测试模块
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 导入csv模块
import csv
# 导入时间模块
import time

“”“创建文件对象”“”

options = Options()
options.add_argument("--user-data-dir=C:\\Users\\shanhe\\AppData\\Local\\Google\\Chrome\\User Data")
f = open('data.csv', mode='w', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
    '职位',
    '公司',
    '薪资',
    '年薪',
    '城市',
    '区域',
    '经验',
    '学历',
    '公司性质',
    '公司规模',
    '标签',
])
csv_writer.writeheader()

打开浏览器

driver = webdriver.Chrome(options=options)  # 实例化一个浏览器对象

访问目标网址

driver.get('https://sou.zhaopin.com/?jl=538&kw=python&p=1')

“”“页面下滑操作”“”

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def drop_down():
    """执行页面滚动的操作"""  # javascript
    for x in range(1, 12, 2):  # 1 3 5 7 9  在你不断的下拉过程中, 页面高度也会变的
        time.sleep(1)
        j = x / 9  # 1/9  3/9  5/9  9/9
        # document.documentElement.scrollTop  指定滚动条的位置
        # document.documentElement.scrollHeight 获取浏览器页面的最大高度
        js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j
        driver.execute_script(js)
 """ 
 定位元素 <元素面板上面>
     driver.find_element_by_css_selector() 通过css选择定位元素
     driver.find_element_by_xpath() 通过xpath定位元素
     driver.find_element_by_id() 通过 ID 定位元素
     driver.find_element_by_class_name() 通过 class类 名定位元素

 - find_elements 表示提取多个
 - find_element 表示提取一个

 网页元素内容还没有加载完成, 就直接获取相关数据, 可能得不到内容     
 """
def get_content():
    # 延时等待 等元素内容加载完成
    driver.implicitly_wait(10)
    drop_down()
    # 获取整页20条 职位信息标签
    divs = driver.find_elements_by_css_selector('.joblist-box__item')
    # for循环遍历
    for div in divs:
    """提取具体数据
    - get_attribute 表示获取标签属性
    - text 表示获取标签文本
    """
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
        title = div.find_element_by_class_name('iteminfo__line1__jobname__name').get_attribute('title')
        name = div.find_element_by_class_name('iteminfo__line1__compname__name').get_attribute('title')
        salary = div.find_element_by_class_name('iteminfo__line2__jobdesc__salary').text
        salary_info = salary.split(' · ')
        if len(salary_info) == 2:
            year_salary = salary_info[-1].replace('薪', '')
            money = salary_info[0]
        else:
            year_salary = '12'
            money = salary_info[0]
        info = [i.text for i in div.find_elements_by_class_name('iteminfo__line2__jobdesc__demand__item')]
        area_info = info[0].split('-')  # 城市信息
        # len(area_info) 统计元素个数 area_info==2 直接判断 area_info是否等于2
        if len(area_info) == 2:
            city = area_info[0]  # 城市
            area = area_info[1]  # 区域
        else:
            city = area_info[0]  # 城市
            area = '未知'
        exp = info[1]  # 经验
        edu = info[2]  # 学历
        tags = ','.join([j.text for j in div.find_elements_by_class_name('iteminfo__line3__welfare__item')])
        cop_info = [x.text for x in div.find_elements_by_class_name('iteminfo__line2__compdesc__item')]
        cop_type = cop_info[0]
        cop_num = cop_info[1]
        dit = {
            '职位': title,
            '公司': name,
            '薪资': money,
            '年薪': year_salary,
            '城市': city,
            '区域': area,
            '经验': exp,
            '学历': edu,
            '公司性质': cop_type,
            '公司规模': cop_num,
            '标签': tags,
        }
        # 写入数据
        csv_writer.writerow(dit)
        print(dit)


for page in range(5):
    get_content()
    driver.find_element_by_css_selector('.soupager button:nth-child(7)').click()

可视化代码

import pandas as pd
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
df = pd.read_csv('data.csv')
df.head()

pyecharts官方文档链接: https://gallery.pyecharts.org/#/README

info = df['区域'].value_counts().index.to_list()
num = df['区域'].value_counts().to_list()
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 导入配置
from pyecharts import options as opts
# 导入饼图
from pyecharts.charts import Pie
# 随机生成数据
from pyecharts.faker import Faker
info = df['区域'].value_counts().index.to_list()
num = df['区域'].value_counts().to_list()
c = (
    Pie()
    .add(
        "",
        [
            list(z)
            for z in zip(
                info,
                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}"))
    # 保存到html文件
    # .render("上海python招聘区域分布情况.html")
)
print(Faker.choose()) # ['草莓', '芒果', '葡萄', '雪梨', '西瓜', '柠檬', '车厘子']
print(Faker.values()) # [116, 118, 134, 44, 62, 53, 31]
# 展示在jupyter上面
c.load_javascript()
c.render_notebook()
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 导入配置
from pyecharts import options as opts
# 导入饼图
from pyecharts.charts import Pie
# 随机生成数据
from pyecharts.faker import Faker
info = df['学历'].value_counts().index.to_list()
num = df['学历'].value_counts().to_list()
c = (
    Pie()
    .add(
        "",
        [
            list(z)
            for z in zip(
                info,
                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}"))
    # 保存到html文件
    # .render("上海python招聘区域分布情况.html")
)
c.render_notebook()
# 导入配置
from pyecharts import options as opts
# 导入饼图
from pyecharts.charts import Pie
# 随机生成数据
from pyecharts.faker import Faker
info = df['经验'].value_counts().index.to_list()
num = df['经验'].value_counts().to_list()
c = (
    Pie()
    .add(
        "",
        [
            list(z)
            for z in zip(
                info,
                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}"))
    # 保存到html文件
    # .render("上海python招聘区域分布情况.html")
)
c.render_notebook()
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.faker import Faker
info = df['经验'].value_counts().index.to_list()
num = df['经验'].value_counts().to_list()
c = (
    Line()
    .add_xaxis(info)
    .add_yaxis("", num, is_smooth=True)
    .set_global_opts(title_opts=opts.TitleOpts(title="上海python招聘经验分布情况"))
)
c.render_notebook()

尾语

最后感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐