Python 爬虫实战案例 - 获取拉勾网招聘职位信息
引言
拉勾网,作为互联网招聘领域的佼佼者,汇聚了海量且多样的职位招聘信息。这些信息涵盖了从新兴科技领域到传统行业转型所需的各类岗位,无论是初出茅庐的应届生,还是经验丰富的职场老手,都能在其中探寻到机遇。
对于求职者而言,能够快速、全面地掌握招聘职位的详细情况,如薪资待遇的高低、工作地点的便利性、职位描述所要求的技能与职责等,无疑能在求职路上抢占先机。而企业方,通过分析同行业职位信息的发布趋势、薪资水平的波动,也可为制定更具吸引力的招聘策略提供有力依据。
接下来,就让我们看看如何运用 Python 爬虫从拉勾网获取关键的招聘信息。
目录
一、实战目标
二、技术路线
三、数据爬取
3.1 网页分析
3.2 网页请求
3.3 网页解析
3.4 保存数据
总结
一、实战目标
本次实战的核心目标是精准抓取拉勾网特定职位的关键招聘信息。具体而言,要获取的信息涵盖:职位名称,它如同求职路上的指南针,能让求职者迅速定位职业方向;薪资范围,这是求职者关注的重点,也是衡量自身价值与市场行情的关键标尺;公司名称,背后关联着企业的规模、文化与发展前景;
二、技术路线
requests:用于发送HTTP请求,获取网页内容。
BeautifulSoup:用于解析HTML页面,提取所需的信息。
csv:用于将爬取的数据存储为CSV文件,便于后续分析。
三、数据爬取
3.1 网页分析
拉勾网的职位列表页,清晰明了的卡片式设计呈现了众多招聘信息,关键数据一目了然。仔细观察其 URL,不难发现其中蕴含的规律,如职位关键词、城市代码、页码等参数巧妙嵌入,以 “https://www.lagou.com/wn/jobsfromSearch=true&kd=python&pn=1&city=%E8%A5%BF%E5%AE%89” 职位关键词 /city = 城市代码、kd = 关键职位、pn = 页码” 为例,这种结构为精准定位不同职位、不同地区的招聘页面提供了线索,pn 参数可以协助我们获取多分页的信息。
分析后我们可以知道,职位信息都在class_=‘item__10RTO’ 的div元素下,可以通过id=‘openWinPostion’、class_=‘money__3Lkgq’、class_=‘company-name__2-SjF’ 来分别获取职位名称、薪资范围和公司名称。
3.2 网页请求
在 Python 的工具库中,requests 库能高效地向目标网站发送 HTTP 请求,帮我们牵线搭桥获取网页内容。不过,拉勾网为了维护自身数据的有序访问,设置了一些防护机制,我们得像智慧的访客一样巧妙应对。
首先,合理设置请求头(headers)至关重要,它就像是我们拜访网站时递出的名片,告知对方我们是友好且正常的浏览器访问。模拟常见浏览器的 User-Agent 字段,如 “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36”,让服务器误以为我们是普通用户操作。同时,Referer 字段也不可忽视,它记录着请求的来源页面,保持其合理性,能避免一些不必要的拦截。最后,如果网站有动态验证的话我们需要设置 Cookie ,可以从自己浏览器访问记录中找到Cookie参数。
# 拉勾网职位招聘信息爬取与数据分析
import requests# 模拟浏览器头部信息
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36","Referer": "https://www.lagou.com/jobs/list_python?px=default","Cookie": "index_location_city=%E5%85%A8%E5%9B%BD; user_trace_token=20250104093938-902c4ff5-f24c-45e5-aec2-3d1473035947; __lg_stoken__=a8290517006006e881e7779a471d837c8e507eea47d1d1fa6cc1ad03ccb44cefb814362b5ac691966eb8697d786c6e53e4f6c233c3d4eaa9ba7c50ac63afc8f768fef09ed4ae; JSESSIONID=ABAACCCABBFAAGBFE0BC31D870268EB481847F272508F4B; WEBTJ-ID=20250104094035-1942ef8a924bd-0dd7463ae6d789-26001851-1049088-1942ef8a9253d2; LGUID=20250104093941-930407fa-f7e8-4c42-81fc-756f97aefcb1; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1735954836; HMACCOUNT=D7BB61FCD5F74C1A; sajssdk_2015_cross_new_user=1; _ga=GA1.2.694435554.1735954836; _gid=GA1.2.74502511.1735954836; X_MIDDLE_TOKEN=bd70439f6dca25617ea4b718273bbf6d; SEARCH_ID=6e9a4c0e27e34ae3929ec6c60a10d1f7; X_HTTP_TOKEN=1226f88b1a607ea4951559537134b7e1ae0350e7f1; sensorsdata2015session=%7B%7D; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1735955277; LGRID=20250104094702-51a5d712-8f33-46b0-a616-3b54c420e4a4; _ga_DDLTLJDLHH=GS1.2.1735954837.1.1.1735955277.60.0.0; gate_login_token=v1####df3b53f43f17d1db42f281952270b469e8255336da4736f3; LG_LOGIN_USER_ID=v1####5496aa08cbf5a8587c4797982411a6af15950cd637352b0a; LG_HAS_LOGIN=1; _putrc=B6E2CB0ECCED9CDE; login=true; unick=%E7%94%B3%E7%99%BB%E5%B3%B0; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; hasDeliver=0; privacyPolicyPopup=true; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%221942ef8ab81cd-06cd07b2b912ae-26001851-1049088-1942ef8ab822d7%22%2C%22%24device_id%22%3A%221942ef8ab81cd-06cd07b2b912ae-26001851-1049088-1942ef8ab822d7%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24os%22%3A%22Windows%22%2C%22%24browser%22%3A%22Chrome%22%2C%22%24browser_version%22%3A%22121.0.0.0%22%7D%7D"
}# 目标URL,以Python职位为例,搜索西安地区,第一页数据,pn为页码,kd为职位关键词
url = "https://www.lagou.com/wn/jobs?fromSearch=true&kd=python&pn=1&city=%E8%A5%BF%E5%AE%89"# 发送get请求,获取响应
res = requests.get(url, headers=headers)
html = res.text
print(html)
在这段代码中,我们精心构建了请求头和请求参数,并发起 GET请求,若请求顺利,便能获得网页数据,为后续的数据解析铺就道路。
3.3 网页解析
当我们成功取回网页的 HTML 内容,需要合适的工具来解读其中的奥秘。在这里,我们使用BeautifulSoup来获取想要的信息。我们已获取到拉勾网职位列表页的 HTML 内容,存储在变量 html 中,提取职位名称、薪资、公司名称等信息的代码如下:
from bs4 import BeautifulSoupjob_list = []
# 创建BeautifulSoup对象,选用html.parser解析器
soup = BeautifulSoup(html, 'html.parser')# 查找所有职位列表项
job_list_items = soup.find_all('div', class_='item__10RTO')for item in job_list_items:# 提取职位名称job_title = item.find(id='openWinPostion').text.strip()# 提取薪资范围salary = item.find('span', class_='money__3Lkgq').text.strip()# 提取公司名称company_name = item.find('div', class_='company-name__2-SjF').text.strip()# 将职位信息写入列表job_list.append({"job_title": job_title, "salary": salary, "company_name": company_name})print(job_list)
在这段代码里,我们先创建了 BeautifulSoup 对象,然后定义了列表用于临时存储职位信息,接着利用 find_all 方法依据类名找出所有职位列表项,再深入每个列表项,通过标签与属性的组合,精准抓取职位名称、薪资、公司名称等关键信息,将其清晰呈现。
3.4 保存数据
辛苦抓取并解析得到的数据,需要妥善保存才能让其价值延续。常见的 CSV、JSON 等格式,各有千秋。
CSV 格式,以其简洁的表格形式,通用性强,能被 Excel 等众多软件直接打开编辑,方便数据的初步查看与简单分析。Python 内置的 csv 模块便能担此大任。以下是将获取到的拉勾网职位数据保存为 CSV 文件的示例:
import csv# CSV文件路径
csv_file_path = "lagou_jobs.csv"# 写入CSV文件
with open(csv_file_path, 'w', newline='', encoding='utf-8') as csvfile:fieldnames = ['job_title', 'salary', 'company_name'] # 定义列名writer = csv.DictWriter(csvfile, fieldnames=fieldnames)writer.writeheader() # 写入表头writer.writerows(job_list) # 写入数据行print(f"数据已成功保存至 {csv_file_path}")
在这段示例中,我们首先定义了 CSV 文件路径,运用 csv.DictWriter 以字典形式将数据逐行写入 CSV 文件,同时写入表头,确保数据存储的规范性与完整性,方便后续随时调取分析。
最后对代码进行整理优化,并增加多页面处理。
# 爬取拉勾网职位招聘信息
import requests
from bs4 import BeautifulSoup
import csvdef get_html(url):# 模拟浏览器头部信息headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36","Referer": "https://www.lagou.com/jobs/list_python?px=default","Cookie": "index_location_city=%E5%85%A8%E5%9B%BD; user_trace_token=20250104093938-902c4ff5-f24c-45e5-aec2-3d1473035947; __lg_stoken__=a8290517006006e881e7779a471d837c8e507eea47d1d1fa6cc1ad03ccb44cefb814362b5ac691966eb8697d786c6e53e4f6c233c3d4eaa9ba7c50ac63afc8f768fef09ed4ae; JSESSIONID=ABAACCCABBFAAGBFE0BC31D870268EB481847F272508F4B; WEBTJ-ID=20250104094035-1942ef8a924bd-0dd7463ae6d789-26001851-1049088-1942ef8a9253d2; LGUID=20250104093941-930407fa-f7e8-4c42-81fc-756f97aefcb1; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1735954836; HMACCOUNT=D7BB61FCD5F74C1A; sajssdk_2015_cross_new_user=1; _ga=GA1.2.694435554.1735954836; _gid=GA1.2.74502511.1735954836; X_MIDDLE_TOKEN=bd70439f6dca25617ea4b718273bbf6d; SEARCH_ID=6e9a4c0e27e34ae3929ec6c60a10d1f7; X_HTTP_TOKEN=1226f88b1a607ea4951559537134b7e1ae0350e7f1; sensorsdata2015session=%7B%7D; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1735955277; LGRID=20250104094702-51a5d712-8f33-46b0-a616-3b54c420e4a4; _ga_DDLTLJDLHH=GS1.2.1735954837.1.1.1735955277.60.0.0; gate_login_token=v1####df3b53f43f17d1db42f281952270b469e8255336da4736f3; LG_LOGIN_USER_ID=v1####5496aa08cbf5a8587c4797982411a6af15950cd637352b0a; LG_HAS_LOGIN=1; _putrc=B6E2CB0ECCED9CDE; login=true; unick=%E7%94%B3%E7%99%BB%E5%B3%B0; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; hasDeliver=0; privacyPolicyPopup=true; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%221942ef8ab81cd-06cd07b2b912ae-26001851-1049088-1942ef8ab822d7%22%2C%22%24device_id%22%3A%221942ef8ab81cd-06cd07b2b912ae-26001851-1049088-1942ef8ab822d7%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24os%22%3A%22Windows%22%2C%22%24browser%22%3A%22Chrome%22%2C%22%24browser_version%22%3A%22121.0.0.0%22%7D%7D"}# 发送get请求,获取响应res = requests.get(url, headers=headers)html = res.textif res.status_code == 200:print(f"请求成功,状态码:{res.status_code}")else:print(f"请求失败,状态码:{res.status_code}")return htmldef get_alljobs(html):job_list = []# 创建BeautifulSoup对象,选用html.parser解析器soup = BeautifulSoup(html, 'html.parser')# 查找所有职位列表项job_list_items = soup.find_all('div', class_='item__10RTO')for item in job_list_items:# 提取职位名称job_title = item.find(id='openWinPostion').text.strip()# 提取薪资范围salary = item.find('span', class_='money__3Lkgq').text.strip()# 提取公司名称company_name = item.find('div', class_='company-name__2-SjF').text.strip()# 将职位信息写入列表job_list.append({"job_title": job_title, "salary": salary, "company_name": company_name})return job_listdef save_to_csv(job_list):# CSV文件路径csv_file_path = "lagou_jobs.csv"# 写入CSV文件with open(csv_file_path, 'w', newline='', encoding='utf-8') as csvfile:fieldnames = ['job_title', 'salary', 'company_name'] # 定义列名writer = csv.DictWriter(csvfile, fieldnames=fieldnames)writer.writeheader() # 写入表头writer.writerows(job_list) # 写入数据行return f"数据已成功保存至 {csv_file_path}"if __name__ == "__main__":# 目标URL,以Python职位为例,搜索西安地区,第一页数据,pn为页码,kd为职位关键词base_url = "https://www.lagou.com/wn/jobs?fromSearch=true&kd=python&city=%E8%A5%BF%E5%AE%89"# 配置页码数量num_pages = 3# 定义一个空列表,存储所有的职位jobs = []for i in range(1, num_pages+1):url = f"{base_url}&pn={i}"html = get_html(url)job_list = get_alljobs(html)jobs.extend(job_list)save_to_csv(jobs)print("爬取完成,数据已保存至 lagou_jobs.csv")
总结
本文通过详细步骤展示了如何使用Python爬取拉勾网的职位招聘信息。我们使用了requests、BeautifulSoup、csv等常见库完成拉勾网数据的抓取、解析与存储,并且介绍了如何处理反爬虫机制、分页问题以及数据存储。
在享受爬虫技术带来便利的同时,务必铭记要遵循网站规则。合理设置爬取频率,模拟真实用户行为,不恶意冲击服务器;尊重网站的 robots.txt 协议,不越界访问禁止区域。只有如此,才能确保爬虫技术在合法合规的轨道上稳健前行,实现数据获取与网站运营的和谐共生。
相关文章:

Python 爬虫实战案例 - 获取拉勾网招聘职位信息
引言 拉勾网,作为互联网招聘领域的佼佼者,汇聚了海量且多样的职位招聘信息。这些信息涵盖了从新兴科技领域到传统行业转型所需的各类岗位,无论是初出茅庐的应届生,还是经验丰富的职场老手,都能在其中探寻到机遇。 对…...

结构型模式---外观模式
概念 外观模式是一种结构型设计模式,它的核心思想是为复杂的子系统提供一个统一的接口,简化客户端与子系统的交互。外观模式通过引入一个高层接口,隐藏子系统的复杂性,使客户端更容易使用。 适用场景 用于客户端无需具体操作子…...
Docker数据卷操作实战
什么是数据卷 数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数据卷 可以在容器之间共享和享用对 数据卷 的修改立马生效对 数据卷 的更新,不会影响镜像数据卷 默认会一直存在,即时容器被…...

技术速递|Copilot Usage Advanced Dashboard 教程
作者:Xuefeng Yin 排版:Alan Wang Copilot Usage Advanced Dashboard 是为了充分利用 GitHub Copilot API 中的几乎所有数据,用到的 API 有: List teams of an onganization Get a summary of Copilot metrics for a team Get C…...
【Python爬虫(90)】以Python爬虫为眼,洞察金融科技监管风云
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发…...
Shell学习(1/6) 教程-变量
一、教程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。 Shell…...

《Qt窗口动画实战:Qt实现呼吸灯效果》
Qt窗口动画实战:Qt实现呼吸灯效果 在嵌入式设备或桌面应用中,呼吸灯效果是一种常见且优雅的UI动画,常用于指示系统状态或吸引用户注意。本文将介绍如何使用Qt动画框架实现平滑的呼吸灯效果。 一、实现原理 利用Qt自带的动画框架来实现&…...
RabbitMQ系列(六)基本概念之Routing Key
在 RabbitMQ 中,Routing Key(路由键) 是用于将消息从交换机(Exchange)路由到指定队列(Queue)的关键参数。其核心作用是通过特定规则匹配绑定关系,确保消息被正确分发。以下是其核心机…...
Spring Boot 集成 Kafka
在现代软件开发中,分布式系统和微服务架构越来越受到关注。为了实现系统之间的异步通信和解耦,消息队列成为了一种重要的技术手段。Kafka 作为一种高性能、分布式的消息队列系统,被广泛应用于各种场景。而 Spring Boot 作为一种流行的 Java 开…...

CentOS中shell脚本对多台机器执行下载安装
1.建立免密ssh连接 详情见这篇: CentOS建立ssh免密连接(含流程剖析)-CSDN博客 2.脚本编写 我这里只是简单写了个demo进行演示,如果服务器很多可以先暂存成文件再逐行读取host进行连接并执行命令 用node1去ssh连接node2和node…...
浅析eBPF
目录 一、eBPF 原理 二、eBPF 已可投入使用的场景 三、eBPF 与 Jaeger/Zipkin 的区别及先进性 四、使用 eBPF 的开源软件 五、开源软件的局限性或待实现功能 猫哥说 一、eBPF 原理 eBPF (extended Berkeley Packet Filter) 是一种内核技术,允许用户在内核空间…...
HTML 基础 (快速入门)详细步骤和示例
目录 创建基本的 HTML 文件 添加内容到页面 页面布局与链接 HTML(超文本标记语言)是构建网页的基础技术,以下是 HTML 基础的详细步骤和示例: 创建基本的 HTML 文件 步骤一:新建文件 在本地计算机上选择一个合适的…...
力扣-动态规划-139 单词拆分
思路 dp数组定义:用wordDict数组可以完成不超过j的字符串的可能为dp[j]递推公式: tmp s.substr(j - wordDict[i].size(), wordDict[i].size()); dp[j] (dp[j - wordDict[i].size()] && wordDict[i] tmp) || dp[j]; dp数组初始化:…...

建筑能耗监测系统数据采集装置 物联网网关功能参数介绍
安科瑞刘鸿鹏 摘要 随着物联网(IoT)技术的迅猛发展,现代物联网系统的规模和复杂度不断增加,各种智能设备和传感器的广泛应用为数据采集和分析提供了丰富的信息源。然而,面对不同协议、标准和通信方式的设备ÿ…...
vue深拷贝:1、使用JSON.parse()和JSON.stringify();2、使用Lodash库;3、使用深拷贝函数(采用递归的方式)
文章目录 引言三种方法的优缺点在Vue中,实现数组的深拷贝I JSON.stringify和 JSON.parse的小技巧深拷贝步骤缺点:案例1:向后端请求路由数据案例2: 表单数据处理时复制用户输入的数据II 使用Lodash库步骤适用于复杂数据结构和需要处理循环引用的场景III 自定义的深拷贝函数(…...
ES 删除index 的curl
以下是使用 `curl` 命令删除 Elasticsearch 索引的格式和示例: ### 基本格式 ```bash curl -XDELETE "http://<node-ip|hostname>:9200/<index-name>" ``` - `<node-ip|hostname>`:Elasticsearch 节点的 IP 地址或主机名。 - `<index-name&g…...

游戏引擎学习第124天
仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾/复习 今天是继续完善和调试多线程的任务队列。之前的几天,我们已经介绍了多线程的一些基础知识,包括如何创建工作队列以及如何在线程中处理任务。今天,重点是解决那些我们之前没有注意到…...

第十四届蓝桥杯Scratch11月stema选拔赛真题——小猫照镜子
编程实现: 小猫照镜子。(背景非源素材) 具体要求: 1). 运行程序,角色、背景如图所示; 完整题目可点击下方链接查看,支持在线编程~ 小猫照镜子_scratch_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/s…...

使用vscode导出Markdown的PDF无法显示数学公式的问题
我的硬件环境是M2的MacBook air,在vscode中使用了Markdown PDF来导出md文件对应的PDF。但不管导出html还是PDF文件,数学公式都是显示的源代码。 我看了许多教程,给的是这个方法:在md文件对应的html文件中加上以下代码:…...

前端系列之:Blob
Blob 与二进制 什么是二进制? 二进制是计算机数据的基本表示形式,只使用 0 和 1 两个数字来表示数值。任何类型的数据(无论是文本、图片、音频文件等)都可以通过二进制表示。 什么是 Blob? 全称 Binary Large Object&a…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...