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('没有数据了~~')
数据可视化
职位招聘排行榜
职位经验要求
薪资分布排行榜