前言
Boss直聘是一个口碑还不错的招聘网站,并且网站非常适合自动化海投。本文主要基于Selenium框架进行自动化海投。
参数定义
自动化脚本主要包含两个参数,job_list为自动化投递关键词列表,base_url为自动化投递基础url。
其中base_url可以指定投递城市,例如100010000代表全国,101020100代表上海。
job_list = [
'机器学习 实习',
]
driver = webdriver.Chrome()
base_url = 'https://www.zhipin.com/job_detail/?query={}&scity=101020100&industry=&position='
如何获得城市编码?
- 选择城市
- 地址栏查看编码
登陆思路
由于账户密码登录Boss直聘设置了验证码机制,因此为了简化登录流程,采用了二维码登录方式,通过二维码登录可以避免输入验证码。
二维码登陆完成之后,需要向控制台输入任意字符,通知自动化脚本继续运行。
def login():
driver.get('https://sao.zhipin.com/')
print('页面加载完成,请手动验证后输入任意字符')
input()
扫描所有页面
自动化脚本根据是否存在下一页按钮判断扫描是否完成,如果存在可点击的下一页按钮,则通过点击下一页按钮的形式进行下一页的扫描。
def run():
login()
for job in job_list:
url = base_url.format(job)
items = []
first_page = True
while True:
driver.get(url)
try:
# 用于等待下一页的按钮出现后再进行点击
WebDriverWait(driver=driver, timeout=5).until(
EC.presence_of_element_located((By.XPATH, '//div[@class="page"]/a[last()]')))
except:
# 有可能不存在下一页按钮
pass
# 页面加载完毕后 解析页面
items.extend(parse_list_page(driver, first_page))
first_page = False
try:
next_bt = driver.find_element_by_xpath('//div[@class="page"]/a[last()]')
# 判断是否到了最后一页
if "disabled" in next_bt.get_attribute('class'):
break
else:
url = next_bt.get_attribute('href')
except:
# 有可能不存在下一页按钮
break
for item in items:
request_detail_page(item.link)
页面解析
BOSS直聘的招聘信息列表分为两种投递状态:继续沟通和立即沟通。
如果按钮文字是继续沟通,则代表该岗位已经投递过,会在控制台输出岗位信息。
如果按钮文字是立即沟通,则代表该岗位没有被投递过,自动化脚本会在内存中记录岗位投递地址,以便后续投递操作。
def parse_list_page(driver, first_page):
if first_page:
links: ElementList = WebDriverWait(driver=driver, timeout=10).until(
EC.presence_of_all_elements_located((By.XPATH, '//*[@id="main"]/div/div[3]/ul/li')))
else:
links: ElementList = WebDriverWait(driver=driver, timeout=10).until(
EC.presence_of_all_elements_located((By.XPATH, '//*[@id="main"]/div/div[2]/ul/li')))
items = []
for temp in links:
link = temp.find_element_by_xpath('./div/div[1]/h3/a')
job = link.find_element_by_class_name('job-title').text
company = temp.find_element_by_class_name('company-text').text
href = link.get_attribute('href')
btn = temp.find_element_by_xpath('./div/a')
if '继续沟通' in btn.get_attribute('innerHTML'):
print('已投递过', company)
else:
item = LagouItem(href, company, job)
print(item)
items.append(item)
return items
自动化投递
扫描完成后,打开每一个岗位链接,点击投递按钮即可。
def request_detail_page(url):
# 用新窗口打开页面
url = url
driver.get(url)
# 等待页面加载完成
WebDriverWait(driver, timeout=10).until(
EC.presence_of_element_located((By.XPATH, '//*[@id="main"]/div[1]/div/div/div[3]/div[1]/a')))
btn = driver.find_element_by_xpath('//*[@id="main"]/div[1]/div/div/div[3]/div[1]/a')
if btn.text == '立即沟通':
print('发现目标,点击投递')
btn.click()
elif btn.text == '继续沟通':
print('已投递过', url)
备注
自动化脚本基本实现了自动化投递,但是Boss直聘每天有投递上限,如果达到投递上限,自动化脚本会抛异常终止。目前自动化脚本尚未针对投递上限情况进行处理。