Python爬虫实战:微信公众号文章批量采集与反爬对抗
简介这份资源是面向 Python 爬虫初学者与 Web 数据采集爱好者的微信公众号文章抓取实战项目聚焦于从微信公众平台批量获取公众号所有文章的 URL适合已掌握 Python 基础语法、希望进阶到真实站点采集的开发者练手。压缩包共 30 个文件约 17.22MB以 13 个 py 脚本为核心辅以 5 个 md 说明文档、若干 jpg/png 截图以及 chromedriver 驱动文件脚本按功能拆分为文章链接获取、文章信息解析、结果读取输出等模块文档则记录了接口调用与参数获取思路。目前已有 583 人学习下载。读者可借此理解微信公众号文章列表的请求构造、Cookie 与 token 参数处理、Selenium 驱动配合等关键环节并参考现成的目录结构与测试脚本快速跑通采集流程为后续扩展至其他平台爬虫打下基础。1. 公众号内容采集从手工复制到 Python 爬虫的落地路径做内容运营或者行业研究的人大概都经历过这种场景盯着十几个公众号想把历史文章导出来做词频分析、选题复盘或者竞品监控结果只能一篇篇点开、复制、粘贴到表格里一下午过去眼睛都花了。这个 Python 微信公众号爬虫资源包解决的就是这类批量采集问题——它把「搜狗微信入口检索 文章链接解析 正文提取 本地存储」串成一条可复现的流水线适合有 Python 基础、想自己搭一套内容采集管道的开发者。需要先说明的是公众号没有公开的内容 API所有方案本质上都是围绕搜狗微信搜索这个入口做文章所以它的能力边界、失效风险和反爬对抗是绕不开的话题。下面按「原理选型 → 环境搭建 → 核心实现 → 避坑 → 进阶」的顺序拆开讲每一步都落到能直接抄的代码和参数上。2. 搜狗微信入口的请求构造URL 参数与请求头怎么设2.1 为什么走搜狗而不是直接抓公众号公众号文章的原始链接格式是https://mp.weixin.qq.com/s?__bizxxxmidxxxidx1snxxx其中__biz、mid、sn这些参数是微信内部生成的外部无法枚举。你不可能靠遍历 ID 去猜文章地址所以必须有一个「发现层」来找到文章链接。搜狗微信weixin.sogou.com就是这个发现层——它收录了大量公众号的文章标题和摘要通过关键词搜索能拿到文章列表页再从列表页解析出跳转链接。这个资源包的核心思路就是用关键词在搜狗微信搜索拿到结果列表解析出每篇文章的临时链接再请求临时链接拿到真实的mp.weixin.qq.com地址最后请求真实地址提取正文。整条链路有三次 HTTP 请求每一层的参数和请求头都不一样这是最容易翻车的地方。2.2 搜索请求的 URL 结构与参数含义搜狗微信的搜索入口有两个搜公众号和搜文章。搜文章的 URL 是https://weixin.sogou.com/weixin?type2query关键词page1关键参数只有三个参数含义取值说明type搜索类型1搜公众号2搜文章query搜索关键词需要 URL 编码中文用 quote 处理page页码从 1 开始一般到 10 页左右就到底了请求头里必须带User-Agent和Referer否则大概率返回验证码页。Referer设成https://weixin.sogou.com/就行。另外搜狗会检查Cookie首次请求如果不带 Cookie它会在响应里Set-Cookie下发SNUID和SUV后续请求要带上这两个值否则会被判定为异常流量。import requests from urllib.parse import quote def build_search_url(keyword, page1): # 中文关键词必须 URL 编码否则搜狗会返回空结果 encoded quote(keyword) return fhttps://weixin.sogou.com/weixin?type2query{encoded}page{page} def make_session(): session requests.Session() # 先访问首页拿 Cookie这一步不能省 session.get(https://weixin.sogou.com/, headers{ 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 }) return session这段代码做了两件事build_search_url负责拼 URL 并处理中文编码make_session先请求一次首页把 Cookie 种到 session 里。很多人直接拿requests.get去请求搜索页结果拿到的是验证码页面就是因为少了这一步。User-Agent建议用桌面端 Chrome 的完整字符串不要用python-requests默认的那个一眼就被识别。2.3 列表页解析定位文章链接的 DOM 结构搜狗微信搜索结果页的文章列表在ul classnews-list下面每条记录是一个li标题在h3 a里摘要和来源公众号在div.txt-box里。文章的真实链接不是直接写在href上的而是一段 JavaScript 拼接的临时链接格式类似/link?urldn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgS...。from lxml import etree def parse_article_list(html): tree etree.HTML(html) items tree.xpath(//ul[classnews-list]/li) results [] for item in items: title item.xpath(.//h3/a//text()) link item.xpath(.//h3/a/href) account item.xpath(.//div[classs-p]//a//text()) if title and link: results.append({ title: .join(title).strip(), # 搜狗返回的是相对路径要补全域名 url: https://weixin.sogou.com link[0] if link[0].startswith(/) else link[0], account: .join(account).strip() if account else }) return resultsparse_article_list用 lxml 的 XPath 定位列表项把标题、链接、公众号名称抽出来。注意link[0]拿到的是相对路径必须补上https://weixin.sogou.com前缀。标题里可能包含em高亮标签用//text()取全部文本节点再 join 就能去掉标签。如果某次请求返回的items为空先检查是不是被重定向到验证码页了——打印response.url看看是不是weixin.sogou.com/antispider/。3. 从临时链接到正文提取三次跳转的完整实现3.1 临时链接的跳转机制搜狗列表页给出的/link?urlxxx是一个跳转链接请求它之后服务端会返回一段 JavaScript里面用url ...的方式拼接出真实的mp.weixin.qq.com地址。这段 JS 里通常有三个url 语句拼完之后还会有一个window.location.replace(url)触发跳转。处理方式有两种一种是用正则把 JS 里的片段抠出来拼成完整 URL另一种是直接用requests请求这个临时链接设置allow_redirectsTrue让它自动跟随跳转。但搜狗的这个跳转是 JS 触发的不是 HTTP 302所以requests不会自动跟。常见做法是用正则解析import re def extract_real_url(js_content): # 搜狗返回的 JS 里 url 被拆成多段拼接 fragments re.findall(rurl \ ([^]*), js_content) if not fragments: return None real_url .join(fragments) # 把转义字符还原 real_url real_url.replace(, ) return real_urlextract_real_url把 JS 里所有url ...的片段按顺序拼起来然后去掉搜狗加的符号它用来干扰直接复制。拼出来的 URL 就是https://mp.weixin.qq.com/s?__biz...mid...idx...sn...这种格式。如果fragments为空说明这次请求被拦截了需要换 IP 或者等一段时间再试。3.2 正文提取定位#js_content容器拿到真实链接后请求mp.weixin.qq.com的页面正文在div idjs_content里面。这个 div 的样式是visibility: hidden但 HTML 内容是完整的用 XPath 直接取文本就行。def extract_article_content(html): tree etree.HTML(html) # 正文容器 content_div tree.xpath(//div[idjs_content]) if not content_div: return None # 取所有文本节点过滤空行 paragraphs content_div[0].xpath(.//p//text() | .//section//text()) text \n.join(p.strip() for p in paragraphs if p.strip()) # 标题 title tree.xpath(//h1[classrich_media_title]//text()) title .join(title).strip() if title else # 发布时间 pub_time tree.xpath(//em[idpublish_time]//text()) pub_time pub_time[0] if pub_time else return {title: title, content: text, publish_time: pub_time}extract_article_content从#js_content里取所有p和section的文本节点。公众号文章的正文结构不统一有的用p有的用section所以两个都要覆盖。publish_time在em idpublish_time里格式是2024-01-15 08:30。如果content_div为空大概率是文章被删了或者需要验证这时候要记录下 URL 方便后续排查。3.3 存储与去重SQLite 落地方案采集到的数据建议直接落 SQLite轻量、不用额外装服务而且支持按 URL 去重。表结构设计三个字段就够url主键、title、content、account、publish_time、crawl_time。import sqlite3 from datetime import datetime def init_db(db_patharticles.db): conn sqlite3.connect(db_path) conn.execute( CREATE TABLE IF NOT EXISTS articles ( url TEXT PRIMARY KEY, title TEXT, account TEXT, content TEXT, publish_time TEXT, crawl_time TEXT ) ) conn.commit() return conn def save_article(conn, article): try: conn.execute( INSERT OR IGNORE INTO articles VALUES (?,?,?,?,?,?), (article[url], article[title], article.get(account, ), article[content], article.get(publish_time, ), datetime.now().strftime(%Y-%m-%d %H:%M:%S)) ) conn.commit() return True except sqlite3.Error as e: print(f写入失败: {e}) return FalseINSERT OR IGNORE配合url主键实现天然去重——同一篇文章重复采集时不会报错也不会重复写入。crawl_time记录采集时间方便后续做增量更新。如果内容量很大可以把content单独存文件数据库里只存路径但一般几千篇以内直接存 SQLite 完全够用。4. 反爬对抗与稳定性请求频率、验证码与代理轮换4.1 请求频率控制搜狗微信对同一 IP 的请求频率很敏感连续快速请求十几次就会弹验证码。经验值是每次请求间隔 3 到 8 秒用随机间隔比固定间隔更安全。import time import random def polite_delay(min_sec3, max_sec8): delay random.uniform(min_sec, max_sec) time.sleep(delay)polite_delay在每次请求之间插入随机等待。min_sec和max_sec可以根据实际被封的情况调整——如果频繁遇到验证码把下限提到 5 秒以上。这个函数要放在每次session.get之前调用包括搜索请求和文章请求。4.2 验证码识别与绕过策略搜狗微信的验证码是图片验证码出现在weixin.sogou.com/antispider/页面。遇到验证码时程序应该做三件事记录当前关键词和页码、暂停一段时间、切换 IP 后从断点继续。def check_antispider(response): # 判断是否被重定向到验证码页 if antispider in response.url or 请输入验证码 in response.text: return True return False def handle_antispider(keyword, page, wait_minutes10): print(f触发验证码关键词{keyword} 页码{page}等待 {wait_minutes} 分钟) time.sleep(wait_minutes * 60) # 返回断点信息供上层重新调度 return {keyword: keyword, page: page}check_antispider通过检查response.url里是否包含antispider来判断是否被拦截。handle_antispider做两件事等待一段时间让 IP 冷却返回断点信息。上层调度器拿到断点后可以换一个出口 IP 重新从这一页开始。如果用的是代理池切换代理的代码放在make_session里每次重建 session 时换一个代理地址。4.3 代理轮换的接入方式代理接入很简单在requests的proxies参数里指定就行。但要注意搜狗对代理 IP 的质量也有要求免费代理基本不能用一请求就触发验证码。常见做法是用付费代理服务每次请求前从代理池 API 拉一个新鲜 IP。def get_proxy(): # 从代理服务 API 获取一个 IP这里用占位地址示意 resp requests.get(http://proxy-service-api/get, timeout5) if resp.status_code 200: ip resp.text.strip() return {http: fhttp://{ip}, https: fhttp://{ip}} return None def request_with_proxy(url, session, proxiesNone): headers { 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: https://weixin.sogou.com/ } return session.get(url, headersheaders, proxiesproxies, timeout15)get_proxy从代理服务拉 IPrequest_with_proxy把代理传进去。注意timeout要设代理不稳定时避免程序卡死。如果代理请求失败要捕获异常并重试重试次数建议不超过 3 次超过就换 IP。5. 避坑指南公众号爬虫最容易翻车的五个地方5.1 现象搜索返回空列表XPath 取不到任何 li原因搜狗检测到请求异常返回了验证码页面或者空结果页但 HTTP 状态码还是 200程序不会报错。解决在parse_article_list之前先判断response.text里有没有news-list这个 class没有就说明被拦截了走handle_antispider逻辑。5.2 现象临时链接解析出的真实 URL 请求后返回「参数错误」原因搜狗在 JS 拼接的 URL 里插入了和amp;等干扰字符直接拼出来的 URL 带了脏数据。解决拼接后做一次清洗把去掉把amp;替换成再用urlparse校验一下参数完整性。5.3 现象正文提取为空#js_content存在但里面没文本原因部分公众号文章用了纯图片或者视频作为正文文本节点为空另一种情况是文章被删除页面返回的是「该内容已被发布者删除」的提示页。解决判断content长度小于 50 个字符的标记为「低质量内容」单独存一张表不混入主表。5.4 现象跑了几百篇之后突然全部失败换 IP 也没用原因搜狗对SNUID这个 Cookie 做了频次限制同一个SNUID请求太多会被拉黑换 IP 但复用旧 Cookie 依然被拒。解决每次触发验证码后不仅要换 IP还要重建 session 重新获取 Cookie确保SNUID是新的。5.5 现象采集到的文章发布时间全是空的原因publish_time这个元素在部分文章模板里不存在或者被 JavaScript 动态渲染。解决优先从页面里的var ct 1700000000这种时间戳变量提取用正则匹配var ct (\d)拿到 Unix 时间戳后转换。如果都没有就留空不要编造。6. 增量采集与内容清洗把原始数据变成可用语料6.1 增量采集的断点设计全量采集跑一次就够了日常维护更需要增量——只抓新发布的文章。实现方式是在 SQLite 里记录每个公众号最近一次采集到的publish_time下次采集时只保留比这个时间新的文章。def get_last_publish_time(conn, account): cursor conn.execute( SELECT MAX(publish_time) FROM articles WHERE account ?, (account,) ) row cursor.fetchone() return row[0] if row and row[0] else 1970-01-01 00:00 def filter_new_articles(articles, last_time): # publish_time 格式为 2024-01-15 08:30字符串比较即可 return [a for a in articles if a.get(publish_time, ) last_time]get_last_publish_time从数据库里查该公众号最新一篇文章的时间filter_new_articles过滤掉比这个时间旧的文章。这样每次增量采集只需要请求前几页就能覆盖新内容大幅减少请求量降低被封风险。6.2 正文清洗去掉噪声保留有效文本公众号正文里混着大量噪声图片说明、关注引导、往期推荐、广告位。清洗的目标是只保留段落文本去掉短于 10 个字符的行和包含特定关键词的行。NOISE_KEYWORDS [点击上方, 关注我们, 长按识别, 往期回顾, 阅读原文] def clean_content(text): lines text.split(\n) cleaned [] for line in lines: line line.strip() # 过滤太短的行 if len(line) 10: continue # 过滤包含噪声关键词的行 if any(kw in line for kw in NOISE_KEYWORDS): continue cleaned.append(line) return \n.join(cleaned)clean_content按行处理NOISE_KEYWORDS列表可以根据实际采集结果持续补充。清洗后的文本可以直接喂给 jieba 做分词或者存成 txt 做后续的 TF-IDF 分析。注意清洗是不可逆的建议原始content和清洗后的clean_content分两个字段存方便回溯。6.3 验证采集质量的三个指标跑完一轮采集后用三个指标判断数据质量文章成功率成功提取正文的数量 / 总请求数、正文平均长度、时间字段完整率。成功率低于 70% 说明反爬对抗需要加强平均长度低于 200 字说明正文提取逻辑有问题时间完整率低于 50% 说明发布时间提取需要补其他来源。这三个指标建议每次采集后打印出来作为调参依据。从那以后我每次跑采集任务都会先拿一个关键词跑 10 页做小样本验证确认成功率、正文长度、时间字段都正常了再放开全量跑。这个习惯帮我省了很多事后补数据的麻烦。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

SpringBoot项目部署实战:从JVM参数到systemd托管与发布回滚

SpringBoot项目部署实战:从JVM参数到systemd托管与发布回滚

先聊几句题外话。我见过太多项目在本地跑得好好的,一上服务器就各种花式出问题,时间差8小时、中文乱码、进程三天两头挂掉、日志不知道去哪了、升级一次心惊胆战。这些事见多了之后我慢慢意识到,SpringBoot项目部署这个看似基础的话题&#x…

2026/10/18 3:37:18 阅读更多 →
Ubuntu挂载报错WRONG FS TYPE、BAD OPTION、BAD SUPERBLOCK详解

Ubuntu挂载报错WRONG FS TYPE、BAD OPTION、BAD SUPERBLOCK详解

1. 项目概述:当Ubuntu说“WRONG FS TYPE, BAD OPTION, BAD SUPERBLOCK”时,它到底在喊什么你刚给Ubuntu服务器加了一块全新的机械硬盘,或者把旧电脑里拆下来的SSD接进新机器,满怀期待地执行sudo mount /dev/sdb1 /mnt/data——结果…

2026/10/18 3:37:18 阅读更多 →
为什么 1.5B 小模型也能深度推理?DeepSeek-R1-Distill-Qwen-1.5B-chat-mlx-16bit 背后的 R1 蒸馏技术详解

为什么 1.5B 小模型也能深度推理?DeepSeek-R1-Distill-Qwen-1.5B-chat-mlx-16bit 背后的 R1 蒸馏技术详解

大模型基础模型本地部署人工智能 【免费下载链接】DeepSeek-R1-Distill-Qwen-1.5B-chat-mlx-16bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/DeepSeek-R1-Distill-Qwen-1.5B-chat-mlx-16bit 点击查看 免费下载 DeepSeek-R1-Distill-Qwen-1.5B-c…

2026/10/18 3:37:18 阅读更多 →

最新新闻

Tomcat 7.0.108 部署实战:JDK 版本选择、环境变量配置与常见启动问题排查

Tomcat 7.0.108 部署实战:JDK 版本选择、环境变量配置与常见启动问题排查

简介:Apache Tomcat 7.0.108 是一款开源的 Java Servlet 容器,主要用于运行 JSP 与 Servlet 等 Java Web 应用。这份 zip 压缩包面向 Java Web 开发者、运维人员及计算机专业学生,帮助其快速搭建本地服务器环境,完成 Web 项目的部…

2026/10/18 4:20:29 阅读更多 →
机器人十年演进:从固定程序到环境自适应智能体

机器人十年演进:从固定程序到环境自适应智能体

聊到机器人技术十年演进,我最直观的感受是:十年前的机器人更像一台会点数的机床,现在的机器人开始像一个有感官、会判断的操作员。十年前我在现场调试机械臂,拿着示教器一格一格地按点位,工件稍微偏一点就抓空&#xf…

2026/10/18 4:20:29 阅读更多 →
MATLAB手写K-means聚类算法及评价指标全解析

MATLAB手写K-means聚类算法及评价指标全解析

1. 项目概述与选题背景1.1 这个项目解决什么问题聚类分析在数据挖掘任务里属于频次特别高的前置步骤,而K-means又是聚类算法当中最基础、最常用的一把尺子。很多人学机器学习第一周就会接触K-means,原理看着就五行代码的事儿——选中心、算距离、更新中心…

2026/10/18 4:20:29 阅读更多 →
用HTML动画演示二极管工作原理:PN结与伏安特性可视化

用HTML动画演示二极管工作原理:PN结与伏安特性可视化

前阵子有朋友跟我抱怨,说“二极管工作原理”这一章在课本上翻来覆去就那几页,老师PPT里也画了PN结、画了耗尽层,上课听的时候觉得懂了,一做题就懵,尤其是“为什么正向导通、反向截止”这件事,脑子里始终没有…

2026/10/18 4:20:29 阅读更多 →
Vue3 + Webpack5 + Element Plus 环境搭建避坑指南

Vue3 + Webpack5 + Element Plus 环境搭建避坑指南

简介:这是一份基于 webpack5 搭建 Vue3 开发与生产环境的实战示例工程,面向希望熟悉 webpack5 新特性、掌握前端构建优化的初中级开发者。资源以 JavaScript 为主,配合 Vue 单文件组件与样式文件,完整演示了从开发调试到生产打包的…

2026/10/18 4:20:29 阅读更多 →
OpenClaw语音控制实战:多用户语音识别与声纹认证的权限隔离方案

OpenClaw语音控制实战:多用户语音识别与声纹认证的权限隔离方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 4:19:29 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →