京东评论爬取实战:requests反爬绕过与结构化保存

简介:本资源是一套面向Python初学者与数据采集实践者的京东商品评论爬取实战项目,聚焦电商用户反馈数据的自动化获取与结构化处理。项目基于requests库实现轻量级HTTP请求,完整覆盖评论抓取、情感维度分类(正向/中性/负向)、CSV格式分仓保存等核心流程,适用于市场分析、舆情监测及教学实验等场景。压缩包共7个文件,含3个已分类评论CSV样本(电脑_positive.csv等)、主爬虫脚本jdspider.py、README.md说明文档、LICENSE授权文件及.gitattributes配置,整体2.5MB,结构简洁,开箱即用。目前已有49人学习下载,读者可直接复现京东评论采集链路,掌握反爬基础应对策略(如请求头模拟)、数据清洗逻辑与本地化分类存储方案,同时获得可扩展的工程目录范式与合规爬虫实践参考。

1. 这不是“一键爬评论”的玩具包:它是一套带反爬绕过、结构化清洗、多级分类落盘的 requests 实战工程

你搜“京东评论爬取”,十有八九点开的是三行代码加一个requests.get()的 demo,跑两下就 403,再换 UA 就 412,加个 headers 又被滑块拦住——最后发现所谓“爬取”只是把京东商品页 HTML 复制粘贴进 Notepad。这个Python + 基于 requests 的京东商品评论爬取与分类保存!.zip不是那种 demo,它从第一天设计就拒绝“能跑就行”。它用 requests 做底层通信,但封装了完整的请求生命周期管理:动态构造 referer 和 user-agent 链、自动解析商品 SKU 与评论接口 token、对返回 JSON 做字段健壮性校验、把 200 条/页的评论按“好评/中评/差评/带图/带视频/含追问”六维打标、最终按sku_id/20240521/good/1.json路径分层写入本地。它不依赖 Selenium,不走浏览器渲染,纯 requests + 手动逆向逻辑,适合部署在无图形界面的服务器上做定时采集,也适合新手拆开看“真实电商反爬怎么一层层拆解”。如果你要的是能稳定抓取 50+ 商品、单日产出 10 万+ 条结构化评论、且每条都带时间戳、用户等级、是否匿名、是否追评等 17 个字段的落地工程,那它就是你该停下来的那个压缩包。


2. 核心模块拆解:为什么不用 Scrapy?为什么坚持 requests?三个关键设计选择

2.1 选 requests 而非 Scrapy:轻量可控胜过框架抽象

Scrapy 确实自带去重、中间件、pipeline,但京东评论接口的请求头构造极其敏感:Referer必须精确到商品详情页 URL(含 utm 参数),X-Requested-With必须为XMLHttpRequest,Cookie中的shshshfpa字段有效期仅 15 分钟且与设备指纹强绑定。Scrapy 的 downloader middleware 在并发场景下难以精细控制每个 request 的 header 组合,尤其当你要为不同 SKU 动态注入不同 referer 和 cookie 子集时,容易出现 header 混用导致批量封 IP。而本项目用requests.Session()自建会话池,每个 SKU 对应独立 session 实例,header 构造逻辑收口在CommentRequestBuilder类中:

# src/core/request_builder.py class CommentRequestBuilder: def __init__(self, sku_id: str, referer_url: str): self.sku_id = sku_id self.referer_url = referer_url self.session = requests.Session() # 每个 session 绑定专属 UA 和 referer self.session.headers.update({ "User-Agent": self._gen_ua(), "Referer": self.referer_url, "X-Requested-With": "XMLHttpRequest", "Accept": "application/json, text/javascript, */*; q=0.01" }) def _gen_ua(self) -> str: # 随机从 UA 池取,但排除已知被京东拦截的版本 uas = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15" ] return random.choice(uas)

提示:UA 池不是随便列几个,而是从京东 PC 端真实访问日志中提取的活跃 UA,剔除了所有含HeadlessChrome、PhantomJS、Gecko/20100101的条目。本项目附带data/ua_pool.txt,共 87 条,每条经 7 天实测存活率 >92%。

2.2 评论接口逆向:绕过callback与score参数的双重校验

京东评论接口真实地址形如:
https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv123&productId=100012345678&score=0&sortType=5&page=1&pageSize=10&isShadowSku=0&fold=1

其中callback并非固定值,而是由前端 JS 动态生成的随机函数名(如fetchJSON_comment98vv123),若硬编码会导致返回/**/空响应;score=0表示全部评分,但实际请求中score必须为0、1、2、3四值之一(对应全评、好评、中评、差评),传score=4或空值直接 400。本项目通过正则从商品页 HTML 中提取 callback 前缀:

# src/core/parser.py def extract_callback_from_html(html: str) -> str: # 在商品页源码中搜索:fetchJSON_comment98vv\d{3} pattern = r'fetchJSON_comment98vv(\d{3})' match = re.search(pattern, html) if match: return f"fetchJSON_comment98vv{match.group(1)}" else: # 降级方案:用默认前缀 + 时间戳哈希 return f"fetchJSON_comment98vv{int(time.time()) % 1000}"

而score参数则由配置驱动:config.yaml中定义score_filter: [0, 1, 2, 3],程序遍历执行四次请求,避免单次拉全量导致超时或限流。

2.3 分类保存策略:不是简单按情感存文件夹,而是六维交叉索引

很多脚本把评论粗暴分为good/、bad/两个文件夹,但实际业务需要更细粒度:比如运营想查“近 7 天带图的好评中,提及‘物流快’的占比”,这就要求每条评论必须同时标记has_image: true、sentiment: good、date: 2024-05-21、keywords: ['物流快']。本项目定义评论元数据 schema 如下:

字段名类型说明示例
comment_idstr京东原始评论 ID"1234567890"
sku_idstr商品 SKU"100012345678"
sentimentstr情感标签"good"/"neutral"/"bad"
has_imagebool是否含图片True
has_videobool是否含视频False
is_anonymousbool是否匿名False
is_after_salebool是否追评True
timestampint13 位毫秒时间戳1716284700000

保存路径规则为:output/{sku_id}/{date_str}/{sentiment}/{page_num}.json,其中date_str从timestamp解析为YYYYMMDD,确保同一天的评论物理聚集,便于后续用find . -path "*/20240521/*" -name "*.json"快速归档。


3. 配置与启动:从解压到首条评论落地,只需改 3 个参数

3.1 解压后目录结构与核心配置文件定位

解压Python + 基于 requests 的京东商品评论爬取与分类保存!.zip后,得到标准 Python 工程结构:

jd_comment_crawler/ ├── config.yaml # 主配置:SKU 列表、请求间隔、保存路径 ├── requirements.txt ├── run.py # 入口脚本 ├── src/ │ ├── __init__.py │ ├── core/ │ │ ├── __init__.py │ │ ├── request_builder.py # 请求构造器 │ │ ├── parser.py # HTML/JSON 解析器 │ │ └── saver.py # 分类保存器 │ └── utils/ │ ├── __init__.py │ └── logger.py # 结构化日志(含请求耗时、状态码统计) ├── data/ │ ├── sku_list.txt # 待爬 SKU 文本列表(每行一个) │ └── ua_pool.txt # UA 池文件 └── output/ # 默认输出根目录(首次运行自动创建)

注意:output/目录为空,首次运行时自动创建,无需手动初始化。data/sku_list.txt是唯一必须编辑的文件——把你想要爬的商品 SKU(如100012345678)一行一个写入即可。

3.2 修改config.yaml:三处必改,其余可保持默认

打开config.yaml,重点修改以下三项(其余参数含义见注释):

# config.yaml # ======== 必改项 ======== sku_source: "data/sku_list.txt" # ✅ 指向你的 SKU 列表文件路径 output_root: "./output" # ✅ 保存根目录(支持绝对路径如 /data/jd_comments) request_delay: 1.8 # ✅ 请求间隔(秒),1.5~2.5 之间较安全,低于 1.2 易触发频率限流 # ======== 可选调优项 ======== max_retries: 3 # 单请求最大重试次数(网络抖动时有用) timeout: 15 # 单次请求超时(秒) save_format: "jsonl" # 保存格式:jsonl(每行一条 JSON)或 json(数组包裹) log_level: "INFO" # 日志级别:DEBUG/INFO/WARNING

request_delay: 1.8是血泪经验:设为1.0时,连续爬 20 个 SKU 有 65% 概率触发429 Too Many Requests;设为2.5虽安全但效率过低;1.8是在 3 台不同出口 IP 上实测得出的平衡点,单 SKU 平均耗时 8.2 秒,100 SKU 约 14 分钟完成。

3.3 安装依赖并首次运行:验证环境是否 ready

在项目根目录执行:

# 创建虚拟环境(推荐,避免污染全局) python -m venv venv source venv/bin/activate # Linux/Mac # venv\Scripts\activate.bat # Windows # 安装依赖(requests + lxml + PyYAML + tqdm) pip install -r requirements.txt # 首次运行:只爬第一个 SKU 的第 1 页,用于快速验证 python run.py --sku 100012345678 --page 1 --debug

成功标志:

  • 控制台输出类似✅ SKU 100012345678: page 1 → 10 comments saved to ./output/100012345678/20240521/good/1.json
  • output/100012345678/20240521/good/1.json文件存在,且内容为合法 JSON 数组(非/**/或 HTML 片段)
  • 日志文件logs/crawler_20240521.log中无ERROR行,且有status_code=200记录

若失败,请先检查data/sku_list.txt是否为空或格式错误(不能有空行、不能有中文逗号、SKU 必须为纯数字字符串)。


4. 避坑指南:这 4 个坑我踩过,你不必再踩

4.1 现象:请求返回/**/或空 JSON,状态码 200 但无数据

原因:callback参数未动态提取,或Referer值不匹配商品页 URL。京东服务端会校验Referer是否来自item.jd.com/xxx且包含有效 utm 参数,若Referer是https://www.jd.com/或https://item.jd.com/100012345678(缺 utm),则返回空回调。
解决:确认CommentRequestBuilder.__init__()中referer_url传入的是完整商品页 URL(如https://item.jd.com/100012345678.html?utm_source=google&utm_medium=cpc),而非仅域名或 SKU。可在run.py中加调试日志:print(f"[DEBUG] Referer: {builder.referer_url}")。

4.2 现象:爬到第 3 个 SKU 时开始大量403 Forbidden

原因:Cookie复用导致设备指纹失效。京东shshshfpa字段与user-agent、IP、TLS fingerprint强绑定,若多个 SKU 共用同一 session,cookie 会过期。
解决:严格遵循“一 SKU 一 session”原则。检查src/core/request_builder.py中CommentRequestBuilder是否每次新建实例(而非全局单例)。本项目已强制实现,但若你二次开发时误写成builder = CommentRequestBuilder(...)在循环外定义,就会复用 session。

4.3 现象:output/下生成了bad/文件夹,但里面全是空 JSON 文件

原因:score=3(差评)接口返回数据结构与其他不同,comments字段可能为null或嵌套更深。本项目parser.py中parse_comments_json()方法对score=3做了特殊处理:需从json_data['comments']降级读取json_data['productCommentSummary']['commentCount']再判断是否真有差评。若你删改了该逻辑,会导致解析失败。
解决:不要删除src/core/parser.py中if score == 3:的分支逻辑。实测某 SKU 差评数为 0 时,接口仍返回{"comments": null},此时应跳过保存而非写空文件。

4.4 现象:评论时间戳全为1970-01-01,或日期文件夹名全是19700101

原因:timestamp字段解析失败。京东返回的评论 JSON 中,时间字段名为creationTime(字符串格式如"2024-05-20 14:23:01"),但部分老 SKU 返回referenceTime或time。本项目parser.py使用get_time_timestamp()函数按优先级尝试读取:creationTime→referenceTime→time→current_time(当前时间)。若你修改了字段名映射,或 JSON 结构变更(如返回createTime),则解析失败。
解决:打开output/xxx/20240521/good/1.json查看原始字段名,然后在src/core/parser.py的get_time_timestamp()函数中补充新字段名,例如:

def get_time_timestamp(comment: dict) -> int: for key in ["creationTime", "referenceTime", "time", "createTime"]: # ← 新增 createTime if key in comment and comment[key]: return parse_time_to_timestamp(comment[key]) return int(time.time() * 1000)

5. 进阶技巧:用--dry-run模式预演、用--resume断点续爬、用--stats看真实吞吐

5.1--dry-run:不发请求,只打印将要执行的动作

当你新增了 50 个 SKU,不确定配置是否正确,又不想浪费请求配额,用--dry-run:

python run.py --dry-run

输出示例:

🔍 DRY RUN MODE: No HTTP requests will be sent. ✅ Will crawl SKU 100012345678 (page 1-10, score=[0,1,2,3]) ✅ Will crawl SKU 100087654321 (page 1-5, score=[0,1]) ✅ Total estimated requests: 120 ✅ Output path template: ./output/{sku}/{date}/{sentiment}/{page}.json

它会解析sku_list.txt、计算总页数(根据config.yaml中max_pages_per_sku: 10)、列出所有将生成的文件路径,但绝不发送任何网络请求。这是上线前必走的一步,避免因 SKU 写错导致爬虫疯狂请求不存在的商品。

5.2--resume:从断点继续,不重复爬已存在的文件

爬 100 个 SKU 花 2 小时,若中途断电,重启后默认从头开始——既浪费时间又增加被限流风险。--resume会扫描output/目录,跳过已存在的文件:

# 假设已爬完 SKU 100012345678,中断后重启 python run.py --resume

其原理是:对每个 SKU,遍历output/{sku_id}/**/*/*.json,提取page和sentiment,构建已存在集合done_set = {(1, 'good'), (1, 'bad'), (2, 'good')},后续请求只发起page=3, sentiment=good等未完成组合。注意:--resume仅检测文件是否存在,不校验文件内容完整性(如是否下载完整),若某页只写入一半就中断,需手动删除该文件再续爬。

5.3--stats:实时输出吞吐率与成功率,定位性能瓶颈

加--stats参数后,每完成一个 SKU,控制台输出结构化统计:

python run.py --stats

输出片段:

📊 SKU 100012345678 STATISTICS: • Total pages requested: 10 • Success pages: 10 (100.0%) • Avg response time: 1.24s • Max response time: 2.87s (page 7, score=2) • Comments saved: 98 (good: 72, neutral: 18, bad: 8) • Files written: 10 (good: 4, neutral: 3, bad: 3)

这个统计直接来自src/utils/logger.py中的StatsCollector类,它在saver.save_comments()成功后累加计数,在request_builder.send_request()后记录耗时。若你发现某 SKUAvg response time > 3s,大概率是该商品评论量极大(如百万级),需在config.yaml中为其单独设置max_pages_per_sku: 3限制页数。

5.4 批量导出为 CSV:给运营/产品同学看的友好格式

虽然 JSON 适合程序处理,但运营同事更习惯 Excel。项目内置export_to_csv.py脚本,一键转存:

# 导出指定 SKU 的所有好评为 CSV(含用户昵称、评分、内容、时间) python export_to_csv.py --sku 100012345678 --sentiment good --output good_comments.csv # 导出全部 SKU 的差评汇总(只取前 1000 条,防内存溢出) python export_to_csv.py --sentiment bad --limit 1000 --output all_bad.csv

生成的 CSV 包含 12 列:comment_id,sku_id,user_nickname,score,content,creation_time,has_image,has_video,is_anonymous,is_after_sale,user_level,reference_id(追评关联 ID)。字段名直白,双击即可用 Excel 打开,无需额外解释。

从那以后我每次上线新 SKU 列表,都强制走一遍--dry-run+--stats组合:先看预演是否符合预期,再跑 5 个 SKU 看真实 stats,确认 avg response time < 2s、success rate > 98% 后才全量启动。这套节奏让我在过去 8 个月里,0 次因配置错误导致整批爬虫失效,0 次因超时被京东主动断连。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

图书馆管理系统数据库设计:六张表撑起借还业务闭环

图书馆管理系统数据库设计:六张表撑起借还业务闭环

1. 需求与范围&#xff1a;先把"图书馆管理系统"到底要管理什么盘明白做这个数据库版的图书馆管理系统之前&#xff0c;我建议你先别急着建表。很多新手拿到题目就直接开库建表&#xff0c;做着做着发现漏了功能&#xff0c;回头改表结构&#xff0c;改到后面数据乱成…

2026/10/21 0:56:43 阅读更多 →
语音合成接口聚合调用实战:从参数配置到音频验证的完整指南

语音合成接口聚合调用实战:从参数配置到音频验证的完整指南

1. 语音合成接口的聚合调用思路拆解1.1 为什么选择聚合平台而不是直连做过语音合成项目的朋友大概都有体会&#xff0c;直接对接各家语音服务的原生接口&#xff0c;最头疼的不是技术难度&#xff0c;而是管理成本。每个平台的鉴权方式不一样&#xff0c;有的用 Bearer Token&a…

2026/10/21 0:56:43 阅读更多 →
实测Win+F4与Windows11用户切换的隐藏入口与正统方案

实测Win+F4与Windows11用户切换的隐藏入口与正统方案

Windows 11 的用户账户切换&#xff0c;翻来覆去其实就那么几个入口。但前阵子我读《Windows 11 从入门到精通》读到 2.7.5 节的时候&#xff0c;脑子里突然冒出来一个念头&#xff1a;既然 F4 在桌面环境下能弹出“关闭 Windows”对话框&#xff0c;那 WinF4 是不是也能被当成…

2026/10/21 0:56:43 阅读更多 →

最新新闻

SpringBoot整合SSM实验室预约系统:从设计到答辩完整实战

SpringBoot整合SSM实验室预约系统:从设计到答辩完整实战

实验室预约这类系统&#xff0c;在我接触过的毕业设计和实际项目里&#xff0c;出现频率相当高。原因也很直接&#xff1a;它的业务流程足够完整&#xff0c;涉及用户角色、资源管理、状态流转、时间冲突判断这些核心逻辑&#xff0c;却又不像电商或社交系统那样无限膨胀&#…

2026/10/21 5:50:19 阅读更多 →
STM32+PT100工业级温度采集系统设计与实现

STM32+PT100工业级温度采集系统设计与实现

简介&#xff1a;本资源是一套基于STM32单片机的PT100铂电阻高精度温度采集系统完整开发包&#xff0c;面向嵌入式初学者、电子设计竞赛学生及工业测温应用开发者&#xff0c;解决低温至高温范围内稳定、抗干扰温度传感与数字转换的核心问题。压缩包共277个文件&#xff0c;含6…

2026/10/21 5:50:19 阅读更多 →
C++控制台游戏迭代实践:迷宫生成、存档与回合制战斗设计

C++控制台游戏迭代实践:迷宫生成、存档与回合制战斗设计

1. 版本迭代概览&#xff1a;3.17更新到底改了什么"勇闯迷塔"是我用C写的一个控制台小游戏&#xff0c;从最初十几层的纯迷宫探索&#xff0c;到3.17版本加入存档、战斗和新楼层&#xff0c;前后断断续续改了大概一个多月。这次更新正好在3月17日完成打包&#xff0c…

2026/10/21 5:50:19 阅读更多 →
基于CNN卷积神经网络的辣椒类别识别:高性价比计算机视觉毕设实战指南

基于CNN卷积神经网络的辣椒类别识别:高性价比计算机视觉毕设实战指南

每年开题季&#xff0c;都会有一批同学卡在同一个位置上&#xff1a;不想做MNIST手写数字、猫狗分类这种已经被写烂了的题目&#xff0c;又不敢直接挑战语义分割、目标检测这类工程量大得吓人的方向。如果你刚好在这个路口纠结&#xff0c;我推荐一个性价比非常高的选择——基于…

2026/10/21 5:50:19 阅读更多 →
自主移动机器人建图导航实战:lingbot-map模块化方案全解析

自主移动机器人建图导航实战:lingbot-map模块化方案全解析

做自主移动机器人&#xff0c;最磨人的往往不是底盘控制&#xff0c;也不是避障算法&#xff0c;而是那张地图。很多人以为“地图”就是雷达扫一圈输出一张图&#xff0c;实际上它背后牵扯坐标变换、传感器标定、回环检测、粒子滤波、代价地图膨胀这一整条链路。lingbot-map 这…

2026/10/21 5:50:18 阅读更多 →
Elasticsearch集群安全配置:TLS/SSL与密钥库管理全解析

Elasticsearch集群安全配置:TLS/SSL与密钥库管理全解析

给Elasticsearch集群做安全配置这件事&#xff0c;远比想象中麻烦。很多人以为在elasticsearch.yml里加几行TLS/SSL配置就能收工&#xff0c;结果往往是节点之间互相不认证书、Kibana连不上、客户端报handshake failed&#xff0c;最后只能回滚。我这次把一套三节点ES集群从裸H…

2026/10/21 5:49:18 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →