Python贝壳网二手小区数据爬取(2025年3月更)

文章目录

  • 一、代码整体架构解析
  • 二、各部分代码详解
    • 1. main()主函数解析
    • 2. 会话初始化(伪装浏览器身份)
    • 3. 动态参数生成(反爬虫核心机制)
    • 4. 列表页抓取(获取小区列表)
    • 5. 列表页解析(提取小区信息)
    • 6. 多线程详情页抓取(高效采集)
    • 7. 详情页解析(深度数据提取)
    • 8. 主流程控制(程序大脑)
  • 三、核心技术点总结
  • 四、完整代码
  • 五、运行效果
  • 六、特别说明(运行不了的时候看这里!)

在这里插入图片描述

上次写了用python爬取安居客二手小区数据,这次应粉丝要求写一篇爬取贝壳网二手小区数据的教程,因为贝壳网的反爬策略比安居客的更为复杂,所以这次就大胆一试!!!
这次教程内容大部分都是由Ai帮我写的,所以可能不太详细!! 欢迎私信或者评论区提问~~
先来看看网页,在这里找到小区,并选择具体的市县区域:
在这里插入图片描述
然后我们F12打开网络看看数据在哪里
在这里插入图片描述
在这里插入图片描述
我们在这个文档里面找到了对应的小区数据,言外之意只需要请求这个url即可得到想要的数据啦~
同时,在这些信息里面还有一个小区详情页的链接,里面有诸如小区的容积率、绿化率、开发商等等信息,我们一起给它爬下来
在这里插入图片描述


大体思路就是:

  1. 先用一些用户信息如浏览器类型、cookie等信息来包装爬虫
  2. 请求一遍小区列表的url来获取小区总数
  3. 通过小区总数来计算需要请求的页数,使用for循环来遍历每一页的小区
  4. 提取每页小区的数据,得到每个小区的详情页链接后继续发送请求来进入详情页
  5. 提取小区详情页数据
  6. 将所有结果保存为一个excel表格

废话不多说,直接上干货~

一、代码整体架构解析

# 导入必要库(相当于工具箱)
import requests  # 网络请求工具
import time      # 时间控制工具
import random    # 随机数生成器
import pandas as pd  # 数据表格工具
from bs4 import BeautifulSoup  # HTML解析器
import math      # 数学计算工具
from concurrent.futures import ThreadPoolExecutor, as_completed  # 多线程工具

下面是整体的函数流程以及每个函数大体的作用~

序号函数名称功能描述输入参数返回值
1init_session(config)初始化网络会话对象config: 用户配置字典requests.Session对象
2get_params(session)生成动态请求参数session: 会话对象请求参数字典
3fetch_list_page()抓取列表页数据session, page_url解析后的数据列表
4parse_list_page(html)解析列表页HTML内容html: 页面源代码字符串小区信息列表
5fetch_detail_batch()批量抓取详情页数据session, urls详情数据字典
6parse_detail_page()解析详情页完整信息session, url详细字段字典
7crawl_full_data()主控流程(分页抓取数据)session合并后的完整数据列表

二、各部分代码详解

1. main()主函数解析

要修改的地方主要有四个,其余的不需要特别的改动!!!!

  1. 城市(city)
  2. 市县(region)
  3. Cookies
  4. excel表格输出的路径
# 主程序入口(程序起点)
if __name__ == "__main__":# ================== 用户配置区域 ==================CONFIG = {"city": "fs",       # 目标城市拼音(如: 佛山->fs,上海->sh)"region": "nanhai", # 目标区域拼音(如: 南海区->nanhai)"cookies": {        # 必需Cookie'lianjia_uuid': '自修修改','lianjia_token': '自行修改','security_ticket': '自行修改'},"srcid": "自行修改"}#输出的excel路径output_name = f'{CONFIG["city"]}_{CONFIG["region"]}_小区数据.xlsx'# ================================================# 初始化会话session = init_session(CONFIG)# 执行爬取start_time = time.time()final_data = crawl_full_data(session)# 保存结果if final_data:df = pd.DataFrame(final_data)[['小区名称', '参考均价', '成交信息', '出租信息', '行政区', '商圈', '建筑年代','详情页均价', '建筑类型', '房屋总数', '楼栋总数', '绿化率', '容积率','交易权属', '建成年代', '供暖类型', '用水类型', '用电类型','物业费', '附近门店', '物业公司', '开发商', '详情页链接']] df.to_excel(output_name, index=False)print(f"数据已保存至: {output_name}")print(f"总计 {len(df)} 条数据,耗时 {(time.time()-start_time)/60:.1f} 分钟")

🔍 ​参数说明:

  • city:目标城市拼音缩写(如佛山→fs,广州→gz)
  • region:目标区域拼音缩写(如天河区→tianhe)
  • cookies:登录贝壳网后浏览器生成的登录凭证(关键!没有它无法获取数据)
  • srcid:加密参数(需从网页源代码中复制,定期更新防止失效)
    在这里插入图片描述

2. 会话初始化(伪装浏览器身份)

def init_session(config):session = requests.Session()  # 创建会话容器session.headers.update({      # 设置请求头(伪装浏览器)'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)...',  # 浏览器指纹'Referer': f'https://{config["city"]}.ke.com/'  # 来源页面})session.cookies.update(config["cookies"])  # 加载登录凭证return session

🛡️ ​参数解析:

  • ​Session对象:保持TCP连接复用,提升访问速度
  • ​User-Agent伪装:模拟Chrome浏览器访问(防止被识别为爬虫)
  • Referer伪造:隐藏真实来源页面(如访问北京小区页时,显示来自bj.ke.com)
  • ​Cookie管理:自动携带登录凭证(相当于拿着钥匙开门)

3. 动态参数生成(反爬虫核心机制)

def get_params(session):return {'_t': str(int(time.time() * 1000)),  # 13位时间戳(防重复)'srcid': session.config['srcid']     # 设备指纹(防篡改)}

⏳ ​时间戳的作用:防止重复请求被识别

  • time.time():获取当前时间(精确到秒)
  • *1000:转换成毫秒级精度
  • int():去掉小数部分
  • str():转换成字符串

🔑srcid的重要性:

  1. 设备唯一标识符(类似手机的IMEI号)
  2. 需定期从网页源代码更新(右键网页→查看源代码→搜索srcid)

4. 列表页抓取(获取小区列表)

def fetch_list_page(session, page_url):time.sleep(random.uniform(0.2, 0.4))  # 随机等待0.2-0.4秒response = session.get(page_url, timeout=8)  # 发送网络请求return parse_list_page(response.text)  # 解析HTML内容

⏱️ ​时间控制:

  • random.uniform(0.2,0.4):生成0.2到0.4之间的随机数
  • time.sleep():让程序暂停指定时间
    ​目的:模拟人类浏览行为,防止触发反爬机制

🚨 ​异常处理:
如果请求失败(超时、404错误等),会自动跳过并打印错误信息

5. 列表页解析(提取小区信息)

def parse_list_page(html):soup = BeautifulSoup(html, 'html.parser')  # 创建HTML解析器items = soup.select('li.xiaoquListItem')      # 定位所有小区条目results = []for item in items:info = {'小区名称': item.select_one('.title a').text.strip(),  # 提取名称'参考均价': item.select_one('.totalPrice span').text + '元/㎡' if ... else '暂无数据'# 其他字段类似...}results.append(info)return results

🔍 ​CSS选择器用法:

  • select_one(‘.title a’):选择class为"title"的元素下的第一个标签
  • .text.strip():提取文本内容并去除两端空白
  • ​条件判断:如果某个元素不存在(如无均价信息),显示"暂无数据"

6. 多线程详情页抓取(高效采集)

def fetch_detail_batch(session, urls):with ThreadPoolExecutor(max_workers=3) as executor:# 提交所有URL到线程池future_to_url = {executor.submit(parse_detail_page, url): url for url in urls}# 逐个获取结果for future in as_completed(futures):url = future_to_url[future]details[url] = future.result()time.sleep(random.uniform(0.2, 0.4))  # 保持访问节奏

🚀 ​多线程原理:

  • ThreadPoolExecutor(max_workers=3):同时开启3个线程
  • as_completed():哪个线程先完成就先处理结果
  • ​限速机制:每个请求间隔0.2-0.4秒,避免服务器压力过大

7. 详情页解析(深度数据提取)

def parse_detail_page(session, url):soup = BeautifulSoup(response.text, 'html.parser')# 解析多列布局数据def extract_multi_column():data = {}for col in soup.select('.xiaoquInfoItemCol'):for item in col.select('.xiaoquInfoItem'):label = item.select_one('.xiaoquInfoLabel').text.strip()value = item.select_one('.xiaoquInfoContent').text.strip()data[label] = valuereturn data# 提取关键字段detail_data = {'房屋总数': ''.join(filter(str.isdigit, multi_col_data.get('房屋总数', ''))) or '0','绿化率': multi_col_data.get('绿化率', '').replace('%', '') if multi_col_data.get('绿化率') else '暂无数据'# 其他字段...}return detail_data

🔧 ​数据清洗技巧:

  • filter(str.isdigit, “总计1582户”):提取纯数字(结果:“1582”)
  • replace(‘%’, ‘’):去除百分比符号(结果:“35”)
  • 容错处理:使用or和条件表达式处理缺失字段

8. 主流程控制(程序大脑)

def crawl_full_data(session):try:# 获取总小区数total = int(soup.select_one('h2.total span').text)total_pages = math.ceil(total / 30)  # 每页30条数据print(f"\n当前区域共有 {total} 个小区")print(f"需要爬取 {total_pages} 页数据\n")except Exception as e:print(f"获取总数失败: {str(e)}")total_pages = 1  # 异常时默认只爬取1页all_data = []for page in range(1, total_pages + 1):for retry in range(2):  # 最多重试2次try:list_data = fetch_list_page(page_url)detail_results = fetch_detail_batch(list_data)# 合并数据for item in list_data:item.update(detail_results.get(item['详情页链接'], {}))all_data.extend(list_data)print(f"第{page}页完成,累计{len(all_data)}条数据")breakexcept Exception as e:print(f"第{retry+1}次重试失败: {str(e)}")time.sleep(random.uniform(0.2, 0.4))  # 页间延迟return all_data

📊 ​流程控制要点:

  • ​智能分页:自动计算总页数(例如100个小区→4页)
  • ​双重保障:每页最多重试2次,确保数据完整性
  • 数据合并:将列表页基础信息与详情页数据合并
  • 限速机制:页间访问间隔0.2-0.4秒

三、核心技术点总结

  1. 数据清洗三板斧
过滤非数字:filter(str.isdigit, text) → 保留纯数字
​文本替换:.replace(old, new) → 删除/替换特定字符
条件赋值:value if condition else default → 处理缺失数据
  1. 容错机制设计
 .get(key, default):安全获取字典值,避免KeyError or '默认值':当结果为空时提供兜底方案if condition:严格校验数据存在性
  1. 字符串处理技巧
.strip():去除首尾空白符
.split():按空白符分割字符串
' '.join(list):用空格连接列表元素

四、完整代码

import requests
import time
import random
import pandas as pd
from bs4 import BeautifulSoup
import math
from concurrent.futures import ThreadPoolExecutor, as_completeddef init_session(config):"""初始化会话对象"""session = requests.Session()session.headers.update({'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36','Referer': f'https://{config["city"]}.ke.com/xiaoqu/{config["region"]}/'})session.cookies.update(config["cookies"])session.config = config  # 存储配置信息return sessiondef get_params(session):"""生成动态请求参数"""return {'_t': str(int(time.time() * 1000)),'srcid': session.config['srcid']}def fetch_list_page(session, page_url):"""抓取列表页数据"""try:time.sleep(random.uniform(0.2, 0.4))response = session.get(page_url, params=get_params(session), timeout=8)response.raise_for_status()return parse_list_page(response.text)except Exception as e:print(f"列表页请求失败: {str(e)}")return []def parse_list_page(html):"""解析列表页信息"""soup = BeautifulSoup(html, 'html.parser')items = soup.select('li.xiaoquListItem')results = []for item in items:try:info = {'小区名称': item.select_one('.title a').text.strip(),'参考均价': f"{item.select_one('.totalPrice span').text}元/㎡" if item.select_one('.totalPrice') else '暂无数据','成交信息': item.select_one('.houseInfo a[href*="chengjiao"]').text.strip() if item.select_one('.houseInfo a[href*="chengjiao"]') else "暂无成交",'出租信息': item.select_one('.houseInfo a[href*="zufang"]').text.strip() if item.select_one('.houseInfo a[href*="zufang"]') else "暂无出租",'行政区': item.select_one('.district').text.strip() if item.select_one('.district') else "未知区域",'商圈': item.select_one('.bizcircle').text.strip() if item.select_one('.bizcircle') else "未知商圈",'建筑年代': ' '.join(item.select_one('.positionInfo').stripped_strings).split('/')[-1].strip() if item.select_one('.positionInfo') else "未知",'详情页链接': item.select_one('a.maidian-detail[href]')['href']}results.append(info)except Exception as e:print(f"解析异常: {str(e)}")return resultsdef fetch_detail_batch(session, urls):"""批量获取详情页数据"""details = {}with ThreadPoolExecutor(max_workers=3) as executor:future_to_url = {executor.submit(parse_detail_page, session, url): url for url in urls}for future in as_completed(future_to_url):url = future_to_url[future]details[url] = future.result()time.sleep(random.uniform(0.2, 0.4))return detailsdef parse_detail_page(session, url):"""解析详情页完整信息"""try:time.sleep(random.uniform(0.6, 1.0))response = session.get(url, params=get_params(session), timeout=10)soup = BeautifulSoup(response.text, 'html.parser')# 辅助函数:安全提取单列信息def safe_extract_single(label_text):try:item = soup.find('span', class_='xiaoquInfoLabel', string=label_text)return item.find_next('span', class_='xiaoquInfoContent').text.strip()except:return '暂无数据'# 辅助函数:处理多列信息def extract_multi_column():data = {}columns = soup.select('.xiaoquInfoItemCol')for col_idx, col in enumerate(columns):items = col.select('.xiaoquInfoItem')for item in items:label = item.select_one('.xiaoquInfoLabel').text.strip()value = item.select_one('.xiaoquInfoContent').text.strip()data[label] = valuereturn data# 处理多列区域数据multi_col_data = extract_multi_column()# 处理单行区域数据(物业费、附近门店等)detail_data = {'建筑类型': multi_col_data.get('建筑类型', '暂无数据'),'房屋总数': ''.join(filter(str.isdigit, multi_col_data.get('房屋总数', ''))) or '0','楼栋总数': ''.join(filter(str.isdigit, multi_col_data.get('楼栋总数', ''))) or '0','绿化率': multi_col_data.get('绿化率', '').replace('%', '').strip(),'容积率': multi_col_data.get('容积率', '暂无数据'),'交易权属': multi_col_data.get('交易权属', '暂无数据'),'建成年代': multi_col_data.get('建成年代', '暂无数据'),'供暖类型': multi_col_data.get('供暖类型', '暂无数据'),'用水类型': multi_col_data.get('用水类型', '暂无数据'),'用电类型': multi_col_data.get('用电类型', '暂无数据'),# 处理单行区域'物业费': safe_extract_single('物业费').split('元')[0].strip(),'附近门店': ' '.join(safe_extract_single('附近门店').replace('\n', ' ').split()),'物业公司': safe_extract_single('物业公司'),'开发商': safe_extract_single('开发商'),'详情页均价': f"{soup.select_one('.xiaoquUnitPrice').text.strip()}元/㎡" if soup.select_one('.xiaoquUnitPrice') else '暂无数据'}return detail_dataexcept Exception as e:print(f"详情页解析异常: {str(e)}")return {}def crawl_full_data(session):"""完整爬取流程"""config = session.configtry:# 获取总小区数response = session.get(f"https://{config['city']}.ke.com/xiaoqu/{config['region']}/",params=get_params(session))soup = BeautifulSoup(response.text, 'html.parser')total = int(soup.select_one('h2.total span').text)total_pages = math.ceil(total / 30)# 打印统计信息print(f"\n当前区域共有 {total} 个小区")print(f"需要爬取 {total_pages} 页数据\n")except Exception as e:print(f"获取总数失败: {str(e)}")total = 0total_pages = 0all_data = []for page in range(1, total_pages + 1):page_url = f"https://{config['city']}.ke.com/xiaoqu/{config['region']}/p{page}"for retry in range(2):try:list_data = fetch_list_page(session, page_url)detail_urls = [item['详情页链接'] for item in list_data]detail_results = fetch_detail_batch(session, detail_urls)for item in list_data:item.update(detail_results.get(item['详情页链接'], {}))all_data.extend(list_data)print(f"第{page}页完成,累计{len(all_data)}条数据")breakexcept Exception as e:print(f"第{retry+1}次重试: {str(e)}")        time.sleep(random.uniform(0.2, 0.4))return all_dataif __name__ == "__main__":# ================== 用户配置区域 ==================CONFIG = {"city": "fs",       # 目标城市拼音(如: 佛山->fs,上海->sh)"region": "nanhai", # 目标区域拼音(如: 南海区->nanhai)"cookies": {        # 必需Cookie'lianjia_uuid': '自行修改','lianjia_token': '自行修改','security_ticket': '自行修改'},"srcid": '自行修改'}#输出的excel路径output_name = f'{CONFIG["city"]}_{CONFIG["region"]}_小区数据.xlsx'# ================================================# 初始化会话session = init_session(CONFIG)# 执行爬取start_time = time.time()final_data = crawl_full_data(session)# 保存结果if final_data:df = pd.DataFrame(final_data)[['小区名称', '参考均价', '成交信息', '出租信息', '行政区', '商圈', '建筑年代','详情页均价', '建筑类型', '房屋总数', '楼栋总数', '绿化率', '容积率','交易权属', '建成年代', '供暖类型', '用水类型', '用电类型','物业费', '附近门店', '物业公司', '开发商', '详情页链接']]df.to_excel(output_name, index=False)print(f"数据已保存至: {output_name}")print(f"总计 {len(df)} 条数据,耗时 {(time.time()-start_time)/60:.1f} 分钟")

五、运行效果

在这里插入图片描述
在这里插入图片描述

六、特别说明(运行不了的时候看这里!)

  1. 记得替换main里面的各种参数,尤其是cookies!用的cookies是你自己浏览器登陆贝壳网,并且完成验证之后的那个cookies!!!
  2. 如果没有修改excel输出路径找不到输出的文件,就在这个代码文件所在的文件夹里面找
  3. 如果嫌爬取速度太慢可以自行修改time.sleep()里的时间,当然间隔越小被反爬的概率越大
  4. 不能保证网页结构后续恒久不变,比如class的标签变了需要重新修改对应的标签,因此代码也具有时效性~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30522.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++的内存管理

1. C/C内存分布 我们先来看下面的一段代码和相关问题 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int…

mac本地代理nginx,解决跨域问题

brew install nginxbrew info nginxnginx配置文件 /opt/homebrew/etc/nginx/nginx.conf 如何打开呢? open /opt/homebrew 启动nginx brew services start nginx改配置: server {listen 8080;server_name localhost;#charset koi8-r;#access_…

Clion快捷键、修改字体

文章目录 一、Clion快捷键1.撤销:crtl Z2.重做:crtl shift Z3.删除该行:crtl Y4.多行后退:选中多行 Tab5.多行缩进:选中多行 shift Tab 二、修改注释的斜体 一、Clion快捷键 1.撤销:crtl Z 2.重做…

【漫话机器学习系列】126.多项式回归(Polynomial Regression)

多项式回归(Polynomial Regression) 1. 什么是多项式回归? 多项式回归(Polynomial Regression)是一种用于建模非线性关系的回归分析技术。它是线性回归的一种扩展形式,允许模型通过增加自变量的高次项来更…

python网络爬虫开发实战之基本库使用

目录 第二章 基本库的使用 2.1 urllib的使用 1 发送请求 2 处理异常 3 解析链接 4 分析Robots协议 2.2 requests的使用 1 准备工作 2 实例引入 3 GET请求 4 POST请求 5 响应 6 高级用法 2.3 正则表达式 1 实例引入 2 match 3 search 4 findall 5 sub 6 com…

npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。

1、在 vscode 终端执行 get-ExecutionPolicy 返回 Restricted 状态是禁止的 返回 RemoteSigned 状态是可正常执行npm命令 2、更改状态 set-ExecutionPolicy RemoteSigned 如果提示需要管理员权限,可加参数运行 Set-ExecutionPolicy -Scope CurrentUser RemoteSi…

数据结构基础之《(19)—矩阵处理》

一、zigzag打印矩阵 Z字形打印矩阵 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 打印顺序:1,2,7,13,8,3,4,9,14... 核心技巧:找到coding上的宏观调度 左上角有A、B两个点,A往右一步一步走,B往下一步一步走 写一个…

OpenCV计算摄影学(17)两个图像之间执行无缝克隆操作函数 seamlessClone()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 图像编辑任务涉及全局更改(如颜色/强度校正、滤镜应用、变形)或针对选定区域的局部更改。在这里,我们关注的是…

基于Asp.net的零食购物商城网站

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

MuBlE:为机器人操作任务规划提供了逼真的视觉观察和精确的物理建模

2025-03-05,由华为诺亚方舟实验室、捷克技术大学和帝国理工学院联合开发的MuBlE(MuJoCo and Blender simulation Environment)模拟环境和基准测试。通过结合MuJoCo物理引擎和Blender高质量渲染,为机器人操作任务规划提供了逼真的视…

文件上传漏洞(upload靶场)

目录 Pass-01:前端绕过 方法一:浏览器禁用js 方法二:直接修改或删除js脚本 方法三:修改后缀绕过 Pass-02:服务器检测 Pess-03:黑名单绕过 Pass-04:.htaccess文件 Pass-05:windows特性和user.ini 方法一:php.自动解析为ph…

blender学习25.3.8

【04-进阶篇】Blender材质及灯光Cycle渲染&后期_哔哩哔哩_bilibili 注意的问题 这一节有一个大重点就是你得打开显卡的渲染,否则cpu直接跑满然后渲染的还十分慢 在这里你要打开GPU计算,但是这还不够 左上角编辑,偏好设置,系…

什么是美颜SDK?从几何变换到深度学习驱动的美颜算法详解

美颜SDK是一种用于处理图像与视频的开发工具,能够提供磨皮、美白、瘦脸、五官优化、动态贴纸等美颜特效。它广泛应用于直播、短视频、社交、在线会议、电商等行业,帮助用户在视频或图片中实现更好的视觉呈现。 一、从几何变换到深度学习:美颜…

【江协科技STM32】ADC数模转换器-学习笔记

ADC简介 ADC(Analog-Digital Converter)模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁,ADC是一种将连续的模拟信号转换为离散的数字信号的设备或模块12位逐次逼近型…

Docker 安装 Nacos 2.1.1(单机版)

一、拉取镜像 docker pull nacos/nacos-server:v2.1.1 二、新建数据库 官网上下载 对应版本的 nacos zip 包,在 nacos\conf 目录下有 mysql脚本: 新建一个数据库 nacos_config,在数据库中依次执行 nacos-mysql.sql、1.4.0-ipv6_support-up…

【计算机网络入门】初学计算机网络(九)

目录 1.令牌传递协议 2. 局域网&IEEE802 2.1 局域网基本概念和体系结构 3. 以太网&IEEE802.3 3.1 MAC层标准 3.1.1 以太网V2标准 ​编辑 3.2 单播广播 3.3 冲突域广播域 4. 虚拟局域网VLAN 1.令牌传递协议 先回顾一下令牌环网技术,多个主机形成…

国产化替换案例:CACTER邮件网关为Groupwise系统加固邮件安全防线

电子邮件作为企业信息流转的命脉,承载着商业机密与客户数据。然而,网络攻击手段日益复杂,钓鱼邮件等威胁正快速侵蚀企业安全防线。据《2024年第四季度企业邮箱安全性研究报告》显示,2024年Q4企业邮箱用户遭遇的钓鱼邮件数量激增至…

在Linux中开发OpenGL——检查开发环境对OpenGL ES的支持

由于移动端GPU规模有限,厂商并没有实现完整的OpenGL特性,而是实现了它的子集——OpenGL ES。因此如果需要开发的程序要支持移动端平台,最好使用OpenGL ES开发。 1、 下载支持库、OpenGL ES Demo 1.1、下载PowerVRSDK支持库作为准备&#xff…

【GoTeams】-5:引入Docker

本文目录 1. Dokcer-compose回顾下Docker知识编写docker-compose.yaml运行docker 2. 部署go服务编写dockerfile 1. Dokcer-compose 这里简单先用一下win版本的Docker,后期开发好了部署的时候再移植到服务器下进行docker部署。 输入命令docker-compose version 就可…

YOLOv8改进SPFF-LSKA大核可分离核注意力机制

YOLOv8改进------------SPFF-LSKA 1、LSAK.py代码2、添加YAML文件yolov8_SPPF_LSKA.yaml3、添加SPPF_LSKA代码4、ultralytics/nn/modules/__init__.py注册模块5、ultralytics/nn/tasks.py注册模块6、导入yaml文件训练 1、LSAK.py代码 论文 代码 LSKA.py添加到ultralytics/nn/…