Python Selenium获取boss直聘招聘信息

hello 大家好~
又是元气满满的一天呢~
既然元气满满,要不要搞点事情,譬如说,爬取“Boss直聘”的招聘数据~
说走咱就走,说干咱就干~

图片

目标确定

我们本次使用的是Selenium来抓取数据。

获取的信息有标题、薪资、公司名称、公司信息、经验要求、公司标签和公司福利等信息

网页分析

因为我们使用的是selenium来获取数据所以我们要做的事就是使用电脑来模拟人的手动操作,无需对网页过多分析。准备好工具即可

1. selenium 安装

selenium可以直接可以用pip安装。

pip install selenium

 2. chromedriver安装

要注意的是chromedriver的版本一定要与Chrome的版本一致,不然就不起作用。

有两个下载地址分别如下:

1、http://chromedriver.storage.googleapis.com/index.html

2、https://npm.taobao.org/mirrors/chromedriver/

当然,你首先需要查看你的Chrome版本,在浏览器中输入

chrome://version 即可查看浏览器版本信息

准备就绪接下来进入实战

导入所需模块

# 导入模块
import csv
import random
import time
from icecream import ic
from selenium import webdriver

打开浏览器并且加载网页内容

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

# 打开网址
driver.get('https://www.zhipin.com/c100010000/?query=python&ka=sel-city-100010000')

# 等待网页加载完成
driver.implicitly_wait(10)

图片

获取网页信息

由图看以看出,所有招聘信息都存在于li标签之中

所以接下来我们的思路就很清晰,先获取到所有的li标签

再去提取内部我们所需要的信息

图片

 # 获取数据内容
    lis = driver.find_elements_by_css_selector('.job-list ul li')  # 获取多个li标签加s
    print(lis) # 返回列表
  
  '''
  [<selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="ab491619-fa11-48b6-9095-5c2720c213e1")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="d6e68702-ecad-43a9-a173-35e7088467b2")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="1e4e384e-e2b7-4af7-96c8-d44d9de9bfd0")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="04ae01a9-3c8b-4733-8db4-467ba502fdea")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="82f6772d-e962-46d5-b157-a9c11943ee42")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="1efaaa79-f423-4b38-bd67-03f168a1df4e")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="a73d425f-e6ef-4946-b6a7-fb345821e326")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="6da89e07-6d90-42a9-a61a-7871ceff58c5")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="e9432c2b-fedb-426d-aaa9-e2b29934e45e")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="b4f45c95-2582-4630-94ef-fdaa030e071e")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="86af349f-dc5b-4ca9-b1c4-7415d4583aae")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="6ba75e95-4c7d-438c-9305-f8df85cd2493")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="46365c27-948b-4436-972f-5dd519343f24")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="a595a576-36ea-4db4-9012-750c2eb0deb2")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="5bbc641f-bb49-4c62-b3b1-d7b75d434b61")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="f0453a49-7335-4a07-a00b-a662dd02efff")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="60080578-b1ba-4337-b4c1-dff4e4b237be")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="449582de-06f3-4a15-892e-a4ee3ab6407a")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="4478b6b6-f326-479c-b122-50fb6f1c56de")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="66df9ed4-d05c-4648-a3bc-4eedccbbd6a1")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="7bac7afd-10f5-440f-a408-8e7b106e5c76")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="9b956f40-f26c-49d9-aef0-4a11cd8b5548")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="543ad28f-e6c9-4cdf-a204-5d62306d6194")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="47d1ddf6-848b-4513-af5c-d8cff76e90db")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="19139ca9-f8c0-4ffe-a3f7-61256205890f")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="05668298-5ea3-4792-994b-c4e699873c9f")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="1291c4d9-0650-4c07-a2e2-f43f9d1557b4")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="3bf0414a-2da8-4ea0-9494-c468945f7eb5")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="b7b344aa-1189-4291-8133-e1a64b958351")>, <selenium.webdriver.remote.webelement.WebElement (session="02c17ca6c1ce3a7b8feb729e0ecfcd44", element="b5908150-2f4e-4f86-ae41-5da0de93a9e2")>]
  '''

我们成功获取到了所有的li对象,接下来我们循环遍历出我们所需要的信息

    for li in lis:
        title = li.find_element_by_css_selector('.job-area-wrapper span').text
        salary = li.find_element_by_css_selector('.job-limit.clearfix span').text
        cop_name = li.find_element_by_css_selector('.name a').text
        cop_info = li.find_element_by_css_selector('.company-text p').text

        exprence = li.find_element_by_css_selector('.job-limit.clearfix p').text
        tags = li.find_element_by_css_selector('.tags span').text
        welfare = li.find_element_by_css_selector('.info-desc').text
        ic(title, salary, cop_name, cop_info, exprence, tags, welfare)
  
  '''
 ic| title: '深圳·南山区·蛇口'
    salary: '12-15K'
    cop_name: '芥子大数'
    cop_info: '计算机软件100-499人'
    exprence: '1-3年本科'
    tags: 'Linux'
    welfare: '五险一金,定期体检,餐补,员工旅游,加班补助,通讯补贴,零食下午茶,节日福利,年终奖,带薪年假,补充医疗保险,股票期权,免费班车,交通补助'
ic| title: '济南·市中区·万达广场'
    salary: '8-12K'
    cop_name: '山东思域'
    cop_info: '计算机软件100-499人'
    exprence: '3-5年本科'
    tags: '容器技术'
    welfare: '加班补助,定期体检,五险一金,交通补助,带薪年假,零食下午茶,员工旅游,节日福利,年终奖'
ic| title: '青岛'
    salary: '9-11K'
    cop_name: '森科特'
    cop_info: '船舶/航空/航天B轮20-99人'
    exprence: '1-3年硕士'
    tags: 'Python'
    welfare: '补充医疗保险,带薪年假,餐补,包住!单人间,股票期权,通讯补贴,定期体检,员工旅游,五险一金,节日福利,包吃,年终奖,零食下午茶,免费班车,加班补助,住房补贴,交通补助'
  '''

数据保存

接下来我们将数据保存在csv中便于后续可视化展示

f = open('招聘1.xlsx', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
    '标题',
    '薪资',
    '公司名称',
    '公司信息',
    '经验要求',
    '标签',
    '福利',
])

dit = {
            '标题': title,
            '薪资': salary,
            '公司名称': cop_name,
            '公司信息': cop_info,
            '经验要求': exprence,
            '标签': tags,
            '福利': welfare,
        }
        csv_writer.writerow(dit)

图片

多页获取

我们找到下一页所在的标签,然后循环获取100页数据

for page in range(1, 100+1):
    print(f'-----------------正在抓取第{page}页数据-----------------')
    time.sleep(random.random()*3) # 延时防止被反爬
    # 点击翻页
    next_page = driver.find_element_by_css_selector('.next')
    if next_page:
        next_page.click()
    else:
        print('没有数据了~~')

图片

数据可视化

职位招聘排行榜

 职位经验要求

图片

薪资分布排行榜

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

途途途途

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值