> 技术文档 > 爬虫实战---(4) 使用Selenium爬取Boss直聘招聘数据_boss直聘爬虫

爬虫实战---(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编程,实战项目等。