• Python采集智联招聘网站数据实现可视化数据


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

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

    环境使用:

    Python
    Pycharm
    
    • 1
    • 2

    模块使用:

    selenium --> pip install selenium==3.141.0
    time
    csv
    
    • 1
    • 2
    • 3

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

    小思路

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

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

    自动打开浏览器, 获取网页上面数据内容
    
    多页数据采集: 需要登陆账号才能实现翻页
    
    • 1
    • 2
    • 3

    通过selenium实现免登陆操作:

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

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

    需要学习JS逆向 --> 瑞数5
    
    js逆向比较复杂 --> 通过selenium去获取数据 但是效率很低
    
    • 1
    • 2
    • 3

    获取数据代码

    “”“导入模块”“”

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

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

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    打开浏览器

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

    访问目标网址

    driver.get('https://sou.zhaopin.com/?jl=538&kw=python&p=1')
    
    • 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
     """ 
     定位元素 <元素面板上面>
         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 表示提取一个
    
     网页元素内容还没有加载完成, 就直接获取相关数据, 可能得不到内容     
     """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    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:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
        """提取具体数据
        - get_attribute 表示获取标签属性
        - text 表示获取标签文本
        """
    
    • 1
    • 2
    • 3
    • 4
    '''
    遇到问题没人解答?小编创建了一个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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    可视化代码

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

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

    info = df['区域'].value_counts().index.to_list()
    num = df['区域'].value_counts().to_list()
    
    • 1
    • 2
    '''
    遇到问题没人解答?小编创建了一个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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    c.render_notebook()
    
    • 1
    '''
    遇到问题没人解答?小编创建了一个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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    # 导入配置
    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    '''
    遇到问题没人解答?小编创建了一个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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    尾语

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

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

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

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

  • 相关阅读:
    jsoup使用指南
    zabbix中文乱码解决方法
    AXI协议详解(8)-排序模型
    RBA责任商业联盟行为准则
    Postgres16版本中FROM子查询别名可以省略不写了
    Redis下载安装教程 (windows)
    iOS桌面小插件 Widget Extension
    Prometheus详解(六)——Prometheus使用Exporter监控Redis
    重庆自考免考申请条件介绍
    Qt开发经验小技巧236-240
  • 原文地址:https://blog.csdn.net/python56123/article/details/134478879