Abstract
本文是爬虫项目第二篇,主要介绍了使用selenium爬取拉钩数据分析职位招聘信息的过程。
Selenium
Selenium是一款python操作浏览器的库,多用于自动测试,其原理就是通过编程自动控制浏览器,无需详细填写浏览器header等信息,也无需查找分析JS渲染等内容,即Chrome的Elements中的内容可见即可爬,需要下载Chromedriver等工具用于驱动浏览器,本文使用Chrome,也可以使用其他浏览器。
HOW
本文使用python的selenium、BeautifulSoup、pandas等包爬取了拉钩搜索“数据分析”岗位所得的职位信息,并存入csv中。具体步骤:
- response获取。
在拉钩主页搜索“数据分析”,定位为全国,取得url,构建bronser对象,使用bronser打开url
from selenium import webdriver
from bs4 import BeautifulSoup
import time
import pandas as pd
bronser = webdriver.Chrome()
bronser.get('https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?px=default&city=%E5%85%A8%E5%9B%BD#order')
- url解析。
第一层是一个循环,用于翻页。
对于每一页,首先使用BeautifulSoup对html解析,使用soup.find()方法找到岗位列表,并使用bronser找到下一页按钮并构建对象。
然后对岗位列表中的每一条岗位的岗位信息进行提取,并存入job_info列表中,然后将每条岗位信息列表存入job列表中。每一页的数据爬取之后,判断下一步按钮是否可以执行,如果可以则使用button.click()点击下一步,并且未防止出现验证,停留10s后继续运行
job = []
while True:
soup = BeautifulSoup(bronser.page_source)
list_of_position = soup.find('div',class_='s_position_list').find('ul').find_all('li')
next_button = bronser.find_element_by_class_name('pager_next ')
for i in list_of_position:
company = i.get('data-company')
companyid = i.get('data-companyid')
hrid=i.get('data-hrid')
positionid=i.get('data-positionid')
positionname=i.get('data-positionname')
salary=i.get('data-salary')
tpladword=i.get('data-tpladword')
location = i.find('em').string
hr_position = i.find('input',class_='hr_position').get('value')
position_tag = i.find('div',class_='li_b_l').text.split('\n')[-2]
experience = position_tag.split('/')[0]
education = position_tag.split('/')[1]
company_tag = i.find('div',class_='industry').text.strip().split('/')
industry = company_tag[0]
financing = company_tag[1]
company_scale = company_tag[2]
position_describe = i.find('div',class_='list_item_bot').find('span').text
company_describe = i.find('div',class_='list_item_bot').find('div',class_="li_b_r").text
job_info = [positionid,positionname,company,companyid,hrid,hr_position,salary,tpladword,
location,experience,education,industry,financing,company_scale,position_describe,company_describe]
job.append(job_info)
if 'pager_next_disabled' in next_button.get_attribute('class'):
break
next_button.click()
time.sleep(10)
- 数据存储
这里不同以往,在解析网页时,直接将数据存入列表中而不是写入文件,最终获得所有数据的二维列表,然后使用pandas转为DataFrame(数据表)df并使用df.rename()重命名列名后使用df.to_csv()导出为csv文件。
df = pd.DataFrame(job)
columns = ['positionid','positionname','company','companyid','hrid','hr_position','salary','tpladword','location','experience','education','industry','financing','company_scale','position_describe','company_describe']
df.rename(columns=dict(enumerate(columns)),inplace=True)
df.to_csv('拉钩招聘.csv')
bronser.close()
Result
Summary
本次爬取过程相对比较顺利,只是在开始时由于未设定time.sleep()导致弹出登录框,之后尝试了1s、3s、5s分别在不同页面弹出登录框,最终使用10s获得了数据。