使用Python爬取BOSS直聘职位数据并保存到Excel
使用Python爬取BOSS直聘职位数据并保存到Excel
在数据分析和挖掘中,爬取招聘网站数据是一项常见的任务。本文将详细介绍如何使用Python爬取BOSS直聘上与“测试工程师”相关的职位数据,并将其保存到Excel文件中。通过逐步分解代码和添加详细注释,我们将深入了解整个实现过程。
项目概述
本项目的功能是爬取BOSS直聘指定条件的职位数据,并将数据保存到Excel文件。以下是主要步骤:
- 配置浏览器驱动:使用Selenium模拟用户操作。
- 加载网页:动态加载职位列表。
- 解析职位信息:提取职位的名称、薪资、技能要求等。
- 保存数据:数据持久化到Excel文件,并为列标题添加注释,便于理解。
环境准备
安装依赖库
请确保已安装以下库:
pip install selenium pandas openpyxl
下载ChromeDriver
根据你的Chrome浏览器版本,下载对应的ChromeDriver,并将其路径配置到代码中。
我这里是用的chrome浏览器:
先查看浏览器版本
114及更早版本
113及113以后下载
130及以后
详细代码解析
1. 配置Selenium WebDriver
目标:通过Selenium启动浏览器,模拟用户访问BOSS直聘。
from selenium import webdriver
from selenium.webdriver.chrome.service import Servicedef setup_driver():"""配置并启动Selenium WebDriver,用于模拟浏览器操作。:return: 返回配置完成的Chrome浏览器驱动对象。"""options = webdriver.ChromeOptions()# 添加可选的启动参数# options.add_argument('--headless') # 无头模式,隐藏浏览器界面# options.add_argument('--disable-gpu') # 禁用GPU,优化性能# options.add_argument('--no-sandbox') # 禁用沙箱模式# options.add_argument('--start-maximized') # 最大化窗口# 创建浏览器驱动服务service = Service('D:\\tool\\chromedriver-win64\\chromedriver.exe')# 初始化WebDriverdriver = webdriver.Chrome(service=service, options=options)return driver
- 重点:
webdriver.ChromeOptions
可以设置浏览器的启动参数,如无头模式(headless)。 - 路径配置:
Service
指定了ChromeDriver的路径。
2. 加载网页并滚动加载
目标:加载指定页面,并模拟滚动加载更多内容。
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keysdef scrape_jobs(driver, url):"""爬取BOSS直聘的职位数据。:param driver: 已配置的Selenium WebDriver实例。:param url: BOSS直聘的目标页面URL。:return: 返回包含职位信息的列表。"""driver.get(url) # 打开指定页面time.sleep(15) # 等待页面完全加载# 模拟滚动操作,加载更多职位信息for _ in range(5): # 假设需要滚动5次加载更多内容driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.END)time.sleep(2) # 等待页面加载完成# 定位职位列表jobs = driver.find_elements(By.CSS_SELECTOR, '.job-list-box > li') # 找到所有职位块job_data = [] # 用于存储职位数据
- 页面滚动:通过发送
Keys.END
键模拟用户滚动操作。 - 延迟加载:
time.sleep
确保页面元素完全加载。
3. 提取职位数据
目标:解析页面中每个职位的数据。
for job in jobs:try:# 获取职位信息job_link_element = job.find_element(By.CSS_SELECTOR, '.job-card-left') # 职位链接所在的元素job_link = job_link_element.get_attribute('href') # 获取链接job_name = job.find_element(By.CSS_SELECTOR, '.job-name').text # 职位名称salary_desc = job.find_element(By.CSS_SELECTOR, '.salary').text # 薪资描述city_area = job.find_element(By.CSS_SELECTOR, '.job-area').text.split('·') # 城市和区域city_name = city_area[0] # 城市名称area_district = city_area[1] if len(city_area) > 1 else "" # 区域名称# 获取技能标签skills = [skill.text for skill in job.find_elements(By.CSS_SELECTOR, '.job-card-footer .tag-list li')]# 获取经验和学历要求tags = job.find_elements(By.CSS_SELECTOR, '.job-info .tag-list li')job_experience = tags[0].text if len(tags) > 0 else "" # 工作年限要求job_degree = tags[1].text if len(tags) > 1 else "" # 学历要求# 获取公司信息brand_name = job.find_element(By.CSS_SELECTOR, '.company-name').text # 公司名称brand_info = [tag.text for tag in job.find_elements(By.CSS_SELECTOR, '.company-tag-list li')]brand_industry = brand_info[0] if len(brand_info) > 0 else "" # 公司行业brand_stage_name = brand_info[1] if len(brand_info) > 1 else "" # 公司发展阶段brand_scale_name = brand_info[2] if len(brand_info) > 2 else "" # 公司规模# 保存数据到列表job_data.append({'job_name': job_name,'salary_desc': salary_desc,'skills': ','.join(skills), # 用逗号分隔技能'job_experience': job_experience,'job_degree': job_degree,'city_name': city_name,'area_district': area_district,'brand_name': brand_name,'brand_industry': brand_industry,'brand_stage_name': brand_stage_name,'brand_scale_name': brand_scale_name,'job_link': job_link,})except Exception as e:print(f"Error processing job: {e}")
- 结构化数据:将提取的数据存储为字典。
- 错误处理:使用
try-except
捕获解析错误。
4. 保存到Excel并添加注释
目标:将数据保存到Excel文件,并为每列添加注释。
import pandas as pd
from openpyxl import load_workbook
from openpyxl.comments import Commentdef save_job_to_excel(jobs, filename="./jobs.xlsx"):"""保存职位信息到 Excel 文件。:param jobs: 职位信息列表。:param filename: 保存的 Excel 文件路径。"""columns = ['职位名称', '薪资描述', '岗位要求', '年限要求', '学历要求', '城市', '区域', '公司名称', '行业类型', '是否上市', '公司规模', '职位链接']comments = {'职位名称': '职位的名称,如“软件测试工程师”。','薪资描述': '职位的薪资范围,例如“15-25K”。','岗位要求': '技能要求,例如“Python, Java”。','年限要求': '职位所需的工作经验。','学历要求': '职位所需的最低学历。','城市': '职位所在城市,例如“深圳”。','区域': '职位所在区域,例如“南山区”。','公司名称': '招聘公司名称。','行业类型': '公司所属行业。','是否上市': '公司发展阶段,如“上市公司”。','公司规模': '公司的人员规模。','职位链接': '职位的详情链接。'}new_data = pd.DataFrame(jobs) # 将数据转换为DataFrametry:existing_data = pd.read_excel(filename) # 读取已有数据combined_data = pd.concat([existing_data, new_data], ignore_index=True) # 合并except FileNotFoundError:combined_data = new_datacombined_data.to_excel(filename, index=False) # 保存到文件add_comments_to_excel(filename, comments)def add_comments_to_excel(filename, comments):"""为Excel文件的列标题添加注释。:param filename: Excel 文件路径。:param comments: 列注释字典。"""wb = load_workbook(filename)ws = wb.activefor col_num, col_name in enumerate(ws[1], start=1):col_letter = chr(64 + col_num) # 获取列的字母if col_name.value in comments:ws[f'{col_letter}1'].comment = Comment(comments[col_name.value], "系统")wb.save(filename)
5. 完整代码示例
import json
import os
import timeimport pandas as pd
from openpyxl import load_workbook
from openpyxl.comments import Comment
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys# 配置 WebDriver
def setup_driver():options = webdriver.ChromeOptions()# options.add_argument('--headless') # 隐藏浏览器界面# options.add_argument('--disable-gpu')# options.add_argument('--no-sandbox')# options.add_argument('--start-maximized')service = Service('D:\\tool\\chromedriver-win64\\chromedriver.exe')driver = webdriver.Chrome(service=service, options=options)return driver# 爬取页面数据
def scrape_jobs(driver, url):driver.get(url)time.sleep(15) # 等待页面加载# 滚动页面加载更多内容(若有分页)for _ in range(5):driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.END)time.sleep(2)# 解析所有 job-list-box 下的 lijobs = driver.find_elements(By.CSS_SELECTOR, '.job-list-box > li')job_data = []for job in jobs:try:# 定位到职位链接的 <a> 标签job_link_element = job.find_element(By.CSS_SELECTOR, '.job-card-left')# 获取职位详情链接job_link = job_link_element.get_attribute('href')job_name = job.find_element(By.CSS_SELECTOR, '.job-name').textsalary_desc = job.find_element(By.CSS_SELECTOR, '.salary').textcity_area = job.find_element(By.CSS_SELECTOR, '.job-area').text.split('·')city_name = city_area[0]area_district = city_area[1] if len(city_area) > 1 else ""# 获取技能skills = [skill.text for skill in job.find_elements(By.CSS_SELECTOR, '.job-card-footer .tag-list li')]# 获取经验和学历tags = job.find_elements(By.CSS_SELECTOR, '.job-info .tag-list li')job_experience = tags[0].text if len(tags) > 0 else ""job_degree = tags[1].text if len(tags) > 1 else ""# 公司信息brand_name = job.find_element(By.CSS_SELECTOR, '.company-name').textbrand_info = [tag.text for tag in job.find_elements(By.CSS_SELECTOR, '.company-tag-list li')]brand_industry = brand_info[0] if len(brand_info) > 0 else ""brand_stage_name = brand_info[1] if len(brand_info) > 1 else ""brand_scale_name = brand_info[2] if len(brand_info) > 2 else ""# 保存数据job_data.append({'job_name': job_name,'salary_desc': salary_desc,'skills': ','.join(skills),'job_experience': job_experience,'job_degree': job_degree,'city_name': city_name,'area_district': area_district,'brand_name': brand_name,'brand_industry': brand_industry,'brand_stage_name': brand_stage_name,'brand_scale_name': brand_scale_name,'job_link': job_link,})except Exception as e:print(f"Error processing job: {e}")return job_data# 保存数据到Excel
def save_job_to_excel(jobs, filename="./jobs.xlsx"):"""保存职位信息到 Excel 文件中,如果文件不存在则创建新文件。:param jobs: 职位信息列表,每个元素为包含职位字段的字典。:param filename: 保存的 Excel 文件路径。"""# 定义列名和中文注释columns = ['职位名称', '薪资描述', '岗位要求', '年限要求', '学历要求', '城市','区域', '公司名称', '行业类型', '是否上市', '公司规模', '任职要求', '职位链接']comments = {'职位名称': '职位的名称,如“软件测试工程师”。','薪资描述': '职位的薪资区间,如“12-20K”。','岗位要求': '职位要求的技能,通常是一个列表,如“Python, Java”等。','年限要求': '职位要求的工作经验年限。','学历要求': '职位要求的最低学历。','城市': '职位所在的城市,如“深圳”。','区域': '职位所在的区域,如“光明区”。','公司名称': '招聘公司的名称。','行业类型': '招聘公司所属的行业类型。','是否上市': '公司是否上市,如“已上市”。','公司规模': '招聘公司的人数规模,如“1000-9999人”。','任职要求': '职位的详细任职要求,来自职位详情页面。','职位链接': '职位详情的跳转链接,可直接点击查看职位详情。'}# 尝试读取已有数据try:existing_df = pd.read_excel(filename)except FileNotFoundError:existing_df = pd.DataFrame(columns=columns)# 准备新数据new_data = [{'职位名称': job_data['job_name'],'薪资描述': job_data['salary_desc'],'岗位要求': job_data['skills'], # 将列表转换为字符串'年限要求': job_data['job_experience'],'学历要求': job_data['job_degree'],'城市': job_data['city_name'],'区域': job_data['area_district'],'公司名称': job_data['brand_name'],'行业类型': job_data['brand_industry'],'是否上市': job_data['brand_stage_name'],'公司规模': job_data['brand_scale_name'],'任职要求': job_data.get('job_requirements', ''),'职位链接': job_data.get('job_link', '') # 添加职位链接,默认为空}for job_data in jobs]new_df = pd.DataFrame(new_data)# 合并数据combined_df = pd.concat([existing_df, new_df], ignore_index=True)# 保存到 Excel 文件combined_df.to_excel(filename, index=False)# 添加注释到 Excel 文件add_comments_to_excel(filename, comments)def add_comments_to_excel(filename, comments):"""为 Excel 文件的列标题添加注释。:param filename: Excel 文件路径。:param comments: 列注释字典,键为列名,值为注释内容。"""wb = load_workbook(filename)ws = wb.activefor col_num, col_name in enumerate(ws[1], start=1): # 遍历第一行的列col_letter = chr(64 + col_num) # 将列索引转为字母,例如 1 -> Aif col_name.value in comments:comment = Comment(comments[col_name.value], "系统")ws[f'{col_letter}1'].comment = commentwb.save(filename)print(f"职位信息保存到 {filename} 并添加了注释。")if __name__ == "__main__":for page in range(1, 1):url = f"https://www.zhipin.com/web/geek/job?query=测试工程师&city=101280600&page={page}"driver = setup_driver()try:jobs = scrape_jobs(driver, url)save_job_to_excel(jobs)print(f"Scraped {len(jobs)} jobs.")finally:driver.quit()
总结
通过以上步骤,您可以爬取BOSS直聘的职位数据并存储为结构化的Excel文件。以下是本项目的特点:
- 自动化操作:Selenium模拟用户操作。
- 全面的数据保存:包括职位详情和公司信息。
- 注释增强可读性:通过Excel注释标注列含义。
您可以根据需求调整代码,实现更灵活的爬取和存储功能!
后续目标
在爬取职位列表数据的基础上,我们计划实现以下功能:
- 爬取职位详情页面
职位列表中通常只提供部分信息,如职位名称、薪资范围、公司信息等。而更多详细信息(如岗位职责、任职要求)存储在职位的详情页面中。下一步将实现爬取职位详情页面的功能。 - 数据清洗与存储
在爬取到更多字段后,我们需要进行数据清洗,包括去除重复项、处理缺失值、统一数据格式等。清洗后的数据将更适合训练机器学习模型。 - 训练机器学习模型
使用爬取到的数据构建模型,尝试解决以下问题:- 薪资预测:基于职位要求预测合理薪资。
- 职位分类:通过岗位职责将职位分类到不同的技术方向(如“测试”、“开发”、“运维”等)。
- 城市分析:分析不同城市的职位需求分布和薪资水平。
相关文章:

使用Python爬取BOSS直聘职位数据并保存到Excel
使用Python爬取BOSS直聘职位数据并保存到Excel 在数据分析和挖掘中,爬取招聘网站数据是一项常见的任务。本文将详细介绍如何使用Python爬取BOSS直聘上与“测试工程师”相关的职位数据,并将其保存到Excel文件中。通过逐步分解代码和添加详细注释…...
node.js之---集群(Cluster)模块
为什么会有集群(Cluster)模块? 集群(Cluster)模块的作用 如何使用集群(Cluster)模块? 为什么会有集群(Cluster)模块 Node.js 是基于 单线程事件驱动 模型的…...

SSM-Spring-IOC/DI对应的配置开发
目录 一、IOC 控制反转 1.什么是控制反转呢 2. Spring和IOC之间的关系是什么呢? 3.IOC容器的作用以及内部存放的是什么? 4.当IOC容器中创建好service和dao对象后,程序能正确执行么? 5.Spring 容器管理什么内容? 6.如何将需要管理的对象交给 …...

一文大白话讲清楚CSS元素的水平居中和垂直居中
文章目录 一文大白话讲清楚CSS元素的水平居中和垂直居中1.已知元素宽高的居中方案1.1 利用定位margin:auto1.2 利用定位margin负值1.3 table布局 2.未知元素宽高的居中方案2.1利用定位transform2.2 flex弹性布局2.3 grid网格布局 3. 内联元素的居中布局 一文大白话讲清楚CSS元素…...

航顺芯片推出HK32A040方案,赋能汽车矩阵大灯安全与智能化升级
汽车安全行驶对整车照明系统的要求正在向智能化方向发展。车灯位于汽车两侧,前期有各种各样的实现包括氙气灯、LED灯等等光源技术。矩阵大灯对汽车照明系统朝着安全性和智能化兼具的方向发展起到了重要推动作用。矩阵大灯可以精细控制到每一个小灯珠,从而…...

智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之12 方案再探:特定于领域的模板 之2 首次尝试和遗留问题解决
本文提要 现在就剩下“体”本身的 约定了--这必然是 自律自省的,或者称为“戒律” --即“体”的自我训导discipline。完整表述为: 严格双相的庄严“相” (<head>侧),完全双性的本质“性”(<boot>侧&…...

redis zset底层实现
1.Redis zset底层实现 转载自:https://marticles.github.io/2019/03/19/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Redis-Zset%E5%8E%9F%E7%90%86/ zset底层是压缩列表 跳表实现的。 跳表里面又由字典hash表 跳表实现。 什么时候用压缩列表?什么时候用…...
go.Bar如何让hovertext显示为legend
在 Plotly 的 go.Bar 图中,如果你想让鼠标悬停时 (hover) 显示的文本 (hovertext) 与图例 (legend) 一致,可以通过 hovertemplate 来控制悬停时的显示内容。 实现方法 hovertemplate 是一种自定义工具,允许你完全控制悬停时的文本显示格式。…...

【Vue】分享一个快速入门的前端框架以及如何搭建
先上效果图: 登录 菜单: 下载地址: 链接:https://pan.baidu.com/s/1m-ZlBARWU6_2n8jZil_RAQ 提取码:ui20 … 主要是可以自定义设置token,更改后端请求地址较为方便。 应用设置: 登录与token设置: 在这里设置不用登录,可以请求的接口: request.js i…...

Flink源码解析之:如何根据JobGraph生成ExecutionGraph
Flink源码解析之:如何根据JobGraph生成ExecutionGraph 在上一篇Flink源码解析中,我们介绍了Flink如何根据StreamGraph生成JobGraph的流程,并着重分析了其算子链的合并过程和JobGraph的构造流程。 对于StreamGraph和JobGraph的生成来说&…...
UE(虚幻)学习(三) UnrealSharp插件中调用非托管DLL
上一篇文章中我使用UnrealSharp成功使用了我的一个C#控制台程序中的网络模块,这个程序是基于KCP网络了,其中调用了Cmake 编译的一个C的DLL,在虚幻中DLL需要放在Binaries目录中才可以。Unity中只要放在任意Plugins目录中就可以。 但是Binaries…...
leetcode 3219. 切蛋糕的最小总开销 II
题目:3219. 切蛋糕的最小总开销 II - 力扣(LeetCode) 排序贪心。 开销越大的越早切。 注意m或n为1的情况。 class Solution { public:long long minimumCost(int m, int n, vector<int>& horizontalCut, vector<int>&…...
vant 地址记录
vant ui 的官网地址记录 vant 4 Vant 4 - A lightweight, customizable Vue UI library for mobile web apps. vant2 https://vant-ui.github.io/vant/v2/ vant3 Vant 3 - Lightweight Mobile UI Components built on Vue...

Lua语言入门 - Lua常量
在Lua中,虽然没有直接的常量关键字(如C中的const),但你可以通过一些编程技巧和约定来实现类似常量的行为。以下是几种常见的方法: 1. 使用全局变量并命名规范 你可以定义一个全局变量,并通过命名约定来表示…...
在Microsoft Windows上安装MySQL
MySQL仅适用于Microsoft Windows 64位操作系统,在Microsoft Windows上安装MySQL有不同的方法:MSI、包含您解压缩的所有必要文件的标准二进制版本(打包为压缩文件)以及自己编译MySQL源文件。 注意:MySQL8.4服务器需要在…...

windows下vscode使用msvc编译器出现中文乱码
文章目录 [toc]1、概述2、修改已创建文件编码3、修改vscode默认编码 更多精彩内容👉内容导航 👈👉C 👈👉开发工具 👈 1、概述 在使用MSVC编译器时,出现中文报错的问题可能与编码格式有关。UTF-…...
Git 解决 everything up-to-date
首先使用git log查看历史提交,找到最新一次提交,比如: PS D:\Unity Projects\CoffeeHouse\CoffeeHouse_BurstDebugInformation_DoNotShip> git log commit a1b54c309ade7c07c3981d3ed748b0ffac2759a3 (HEAD -> master, origin/master)…...

Windows配置cuda,并安装配置Pytorch-GPU版本
文章目录 1. CUDA Toolkit安装2. 安装cuDNN3. 添加环境变量配置Pytorch GPU版本 博主的电脑是Windows11,在安装cuda之前,请先查看pytorch支持的版本,cuda可以向下兼容,但是pytorch不行,请先进入:https://py…...
Neo4j 图数据库安装与操作指南(以mac为例)
目录 一、安装前提条件 1.1 Java环境 1.2 Homebrew(可选) 二、下载并安装Neo4j 2.1 从官方网站下载 2.1.1 访问Neo4j的官方网站 2.1.2 使用Homebrew安装 三、配置Neo4j 3.1 设置环境变量(可选) 3.2 打开配置文件(bash_profile) 3.2.1 打开终端…...
2024年12月个人工作生活总结
本文为 2024年12月工作生活总结。 研发编码 Golang语言byte数组赋值 假定有如下变量: var strCode string var bCode [9]byte现需将string类型转换成byte类型,如下: bCode []byte(strCode)无法转换,提示: cannot…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...