前几期讲解了如何通过python + requests,selenium等对网站内容进行爬取,今天我们再来练练手,目标是对BOSS直聘上的招聘信息进行爬取。
首先,通过网页源代码是可以看到详细信息的。所以第一步我们先筛选信息。这里我们以python为关键词,工作经验选一年,学历就选专科(只因博主是专科学历),得到筛选条件后,我们先找到搜索框输入python并回车。接下来就是选择工作经验与学历了。这里我们会发现一个细节,那就是只有当鼠标移动到菜单元素上时,下拉菜单才会出现,这时才能点击;若是将鼠标移走,菜单就不会出现,更不能点击。所以,这里需要设置鼠标动作链。
在对职位信息筛选完之后,我们开始采集职位信息,首先我们对得到的网页源码进行解析,并提取我们需要的信息,并将其以json的形式写入文件,最后使用for循环 + selenium进行翻页操作,效果如下:
完整代码如下:
import json
import time
from pyquery import PyQuery as pq
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver import ActionChains # 鼠标动作链
# 不加载图片
options = webdriver.ChromeOptions()
options.add_experimental_option('prefs', {'profile.managed_default_content_settings.images': 2})
browser = webdriver.Chrome(options=options)
wait = WebDriverWait(browser, 15)
url = 'https://www.zhipin.com/'
data_list = []
max_page = 3
def find_work():
"""
筛选条件
:return:
"""
search = browser.find_element_by_class_name('ipt-search')
search.send_keys('python')
search.send_keys(Keys.ENTER)
time.sleep(2)
jingyan = browser.find_element_by_xpath('//*[@id="filter-box"]/div/div[4]/div[1]/span/input')
jingyan_1 = browser.find_element_by_xpath('//*[@id="filter-box"]/div/div[4]/div[1]/span/div/ul/li[3]/a')
ActionChains(browser).move_to_element(jingyan).click(jingyan_1).perform()
time.sleep(2)
xueli = browser.find_element_by_xpath('//*[@id="filter-box"]/div/div[4]/div[2]/span/input')
xueli_1 = browser.find_element_by_xpath('//*[@id="filter-box"]/div/div[4]/div[2]/span/div/ul/li[5]/a')
ActionChains(browser).move_to_element(xueli).click(xueli_1).perform() # 将鼠标移动到某个元素的位置并点击
def get_info():
"""
采集数据
:return:
"""
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#main > div > div.job-list > ul > li"))
) # 等待最后一条加载完成
time.sleep(2)
html = browser.page_source
html = pq(html)
items = html('#main > div > div.job-list > ul > li').items()
for item in items:
info = {
'company': item('.name a').text(),
'post': item('.job-name a').text(),
'salary': item('.red').text(),
'work': item('.tags span').text(),
'welfare': item('.info-desc').text(),
'address': item('.job-area').text()
}
data_list.append(info)
print("岗位数量:", len(data_list))
save_next()
def save_next():
"""
保存后翻页
:return:
"""
content = json.dumps(data_list, ensure_ascii=False, indent=2)
with open("E:\python\project\selenium\BOSS直聘\info.json", "w", encoding="utf-8") as f:
f.write(content)
time.sleep(2)
botton = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '#main > div > div.job-list > div.page > a.next'))
)
botton.click()
def main():
browser.get(url)
find_work()
for i in range(1, max_page + 1):
print("第", i, "页:")
get_info()
#browser.quit()
if __name__ == '__main__':
main()
如有错误,欢迎私信纠正,谢谢支持!