爬虫实战---(4) 使用Selenium爬取Boss直聘招聘数据_boss直聘爬虫
前言
随着互联网的快速发展,数据分析和挖掘变得愈发重要。在求职市场上,招聘信息是一个非常有价值的数据源。今天,我们将使用Python的Selenium库从黑马程序员网站(Boss直聘)中爬取Python职位招聘信息。本文分为五个模块:1. 爬取目标,2. 所涉及知识点,3. 步骤分析(穿插代码讲解),4. 爬取结果,5. 完整代码。
1. 爬取目标
我们将从Boss直聘网站上抓取Python职位的信息,具体目标如下:
-
职位名称:招聘的具体职位名称。
-
工作地区:职位所在的城市或地区。
-
公司名称:招聘该职位的公司名称。
-
薪资待遇:职位的薪资范围。
-
学历与工作经验要求:对求职者的学历和工作经验的要求。
-
公司领域:公司的行业领域,提供职业背景信息。
-
详情页链接:该职位详细信息的链接。
通过抓取以上信息,我们能够为求职者提供有效的招聘数据,辅助其制定求职策略,也有助于分析当前招聘市场的趋势。
2. 所涉及知识点
在本项目中,我们将涉及以下知识点:
2.1 Selenium库
Selenium是一款强大的Web自动化测试工具,广泛应用于网页数据爬取。它可以模拟用户在浏览器中的操作,支持与多个浏览器(如Chrome、Firefox等)的交互。
2.2 Python与CSV模块
Python是一种高级编程语言,使用方便。CSV模块用于操作CSV文件格式,方便数据的存储与读取。
2.3 CSS选择器与XPath
通过CSS选择器和XPath,我们可以快速准确地定位网页元素。对于网站不同的结构,选择合适的选择器可以使数据提取更加精确。
2.4 循环与等待
在爬取多页数据时,使用循环结构可以有效管理页面的翻页过程,同时使用显式等待确保页面加载完成,提高爬取稳定性。
3. 步骤分析(穿插代码讲解)
下面,让我们逐步分析代码的实现过程,理解每个部分的功能。
3.1 安装所需库
如果你的Python环境中还未安装Selenium库,可以通过以下命令进行安装:
pip install selenium
同时,你需要下载对应你浏览器版本的ChromeDriver,并配置到你的系统路径中,具体可参考ChromeDriver。
3.2 导入库并设置CSV文件
首先,我们导入必要的库并打开一个CSV文件用于数据的写入。
from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECimport csv# 打开CSV文件以写入数据f = open(\'python_1.csv\', mode=\'a\', encoding=\'utf-8\', newline=\'\')csv_writer = csv.DictWriter(f, fieldnames=[ \'职位\', \'地区\', \'公司\', \'薪资待遇\', \'学历经验\', \'公司领域\', \'详情页\',])csv_writer.writeheader()
3.3 启动浏览器并访问目标网页
接着,我们启动Chrome浏览器,并访问Boss直聘的招聘页面。
# 启动Chrome浏览器driver = webdriver.Chrome()driver.get(\'https://www.zhipin.com/job_detail/?query=python&city=100010000&industry=&position=\')
3.4 定义信息提取函数
然后,我们定义一个get_info
函数,用于提取网页中每个职位的信息。在此函数中,我们通过CSS选择器定位所需的元素。
def get_info(): # 等待职位列表加载完成 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, \'.search-job-list-wrap .job-list li\'))) lis = driver.find_elements(By.CSS_SELECTOR, \'.search-job-list-wrap .job-list li\') for li in lis: title = li.find_element(By.CSS_SELECTOR, \'.job-title .job-name a\').text href = li.find_element(By.CSS_SELECTOR, \'.job-title .job-name a\').get_attribute(\'href\') area = li.find_element(By.CSS_SELECTOR, \'.job-area\').text company_name = li.find_element(By.CSS_SELECTOR, \'.company-text .name a\').text money = li.find_element(By.CSS_SELECTOR, \'.job-limit .red\').text info = li.find_element(By.CSS_SELECTOR, \'.job-limit p\').text company_type = li.find_element(By.CSS_SELECTOR, \'.company-text p a\').text dit = { \'职位\': title, \'地区\': area, \'公司\': company_name, \'薪资待遇\': money, \'学历经验\': info, \'公司领域\': company_type, \'详情页\': href, } csv_writer.writerow(dit) print(title, area, company_name, money, info, company_type, href)
3.5 爬取多页数据
接下来,我们使用一个循环来爬取多页数据。这里我们使用了while
循环,并在每次获取完数据后点击“下一页”按钮。
# 爬取多页数据page = 1while page <= 10: print(f\'正在采集第{page}页的数据内容\') get_info() try: # 等待“下一页”按钮可点击 next_button = WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.CSS_SELECTOR, \'.next\'))) # 确保“下一页”按钮可见并可点击 if \"disabled\" in next_button.get_attribute(\"class\"): print(\"已到达最后一页,退出爬取。\") break next_button.click() # 点击“下一页” page += 1 # 增加页面计数 # 等待新的职位列表加载完成 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, \'.search-job-list-wrap .job-list li\'))) except Exception as e: print(f\"错误: {e}\") break # 如果无法找到或点击“下一页”,则退出循环
3.6 关闭文件和退出浏览器
最后,完成数据爬取后,不要忘记关闭CSV文件和浏览器实例,以释放资源。
# 关闭CSV文件及浏览器f.close()driver.quit()
4. 爬取结果
经过运行上述代码后,程序会将抓取的数据写入到 python_1.csv
文件中,其内容会包含每个职位的信息,例如:
职位,地区,公司,薪资待遇,学历经验,公司领域,详情页Python开发工程师,北京,某某科技有限公司,18K-30K,3-5年,互联网,https://www.zhipin.com/job_detail/...数据分析师,北京,某某数据有限公司,15K-22K,1-3年,数据服务,https://www.zhipin.com/job_detail/...
这样的结果不仅可以帮助求职者了解当前市场的招聘趋势,还能为数据分析提供基础数据。
5. 完整代码
最终,以下是完整的代码实现,便于大家直接复制使用:
from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECimport csv# 打开CSV文件以写入数据f = open(\'python_1.csv\', mode=\'a\', encoding=\'utf-8\', newline=\'\')csv_writer = csv.DictWriter(f, fieldnames=[ \'职位\', \'地区\', \'公司\', \'薪资待遇\', \'学历经验\', \'公司领域\', \'详情页\',])csv_writer.writeheader()# 启动Chrome浏览器driver = webdriver.Chrome()driver.get(\'https://www.zhipin.com/job_detail/?query=python&city=100010000&industry=&position=\')def get_info(): # 等待职位列表加载完成 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, \'.search-job-list-wrap .job-list li\'))) lis = driver.find_elements(By.CSS_SELECTOR, \'.search-job-list-wrap .job-list li\') for li in lis: title = li.find_element(By.CSS_SELECTOR, \'.job-title .job-name a\').text href = li.find_element(By.CSS_SELECTOR, \'.job-title .job-name a\').get_attribute(\'href\') area = li.find_element(By.CSS_SELECTOR, \'.job-area\').text company_name = li.find_element(By.CSS_SELECTOR, \'.company-text .name a\').text money = li.find_element(By.CSS_SELECTOR, \'.job-limit .red\').text info = li.find_element(By.CSS_SELECTOR, \'.job-limit p\').text company_type = li.find_element(By.CSS_SELECTOR, \'.company-text p a\').text dit = { \'职位\': title, \'地区\': area, \'公司\': company_name, \'薪资待遇\': money, \'学历经验\': info, \'公司领域\': company_type, \'详情页\': href, } csv_writer.writerow(dit) print(title, area, company_name, money, info, company_type, href)# 爬取多页数据page = 1while page <= 10: print(f\'正在采集第{page}页的数据内容\') get_info() try: # 等待“下一页”按钮可点击 next_button = WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.CSS_SELECTOR, \'.next\'))) # 确保“下一页”按钮可见并可点击 if \"disabled\" in next_button.get_attribute(\"class\"): print(\"已到达最后一页,退出爬取。\") break next_button.click() # 点击“下一页” page += 1 # 增加页面计数 # 等待新的职位列表加载完成 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, \'.search-job-list-wrap .job-list li\'))) except Exception as e: print(f\"错误: {e}\") break # 如果无法找到或点击“下一页”,则退出循环# 关闭CSV文件及浏览器f.close()driver.quit()
通过本次教程,大家应该对如何使用Selenium进行网页数据爬取有了清晰的认识和实操经验。希望这篇文章对你在数据分析、求职等方面有所帮助,让我们在数据的海洋中找到更多的机遇与挑战!
文章持续跟新,可以微信搜一搜公众号 [ rain雨雨编程 ],或扫描下方二维码,第一时间阅读,涉及爬虫,机器学习,Java编程,实战项目等。