Scrapy爬取大众点评:破解三重反爬抓取动态接口
简介这是一份基于Scrapy框架实现的大众点评网站数据采集工具面向Python爬虫初学者与中级开发者解决真实业务场景中城市、分类及店铺多层级结构化数据抓取难题尤其适配需绕过字体反爬、手动登录验证与代理配置的实战需求。资源包共19个文件含13个核心Python脚本覆盖spiders、pipelines、middlewares、utils等模块、1个requirements.txt依赖清单、1个README.md使用说明、1个scrapy.cfg配置文件及LICENSE等辅助文件整体仅21KB轻量易读目录结构规范体现Scrapy标准项目组织逻辑。已有596人学习下载读者可直接复用完整爬虫流程从城市/分类预爬取到店铺链接生成再到含地址、评分、价格、商圈等10字段的深度信息提取并支持数据自动落盘至data目录。1. 为什么大众点评的页面结构让 Scrapy 爬虫“原地刹车”这不是反爬太强而是你没拆开它的三层壳大众点评的数据价值很实在——门店地址、人均消费、评分分布、用户评论情感倾向、营业时间变更频率这些是本地生活服务类分析、商圈热力建模、竞对动态监测绕不开的一手信源。但很多开发者一上手就卡在“能请求、拿不到数据”response.text里全是空 divscrapy shell里response.css(div.review-item)返回空列表甚至curl -v抓包发现 HTML 源码里压根没有评论内容。这不是 Scrapy 不行也不是大众点评用了多高深的 JS 渲染——它用的是典型的「静态骨架 动态接口 前端混淆」三重组合拳首屏 HTML 是真实存在的Scrapy 能拿到但核心数据藏在 XHR 接口里需逆向分析而接口参数又经过前端简单混淆如时间戳偏移、字符串拼接、基础哈希。这意味着纯靠scrapy.Spider解析 HTML 的传统写法在大众点评上大概率会集体翻车。本篇不讲 Selenium 或 Playwright 这类重量级方案它们解决的是“能不能跑”但代价是慢、资源重、难部署而是聚焦 Scrapy 本身的能力边界如何用scrapy.Request构造合法接口请求、如何从 HTML 中精准提取加密参数、如何用scrapy.downloadermiddlewares.retry应对高频限流、以及最关键的——怎么把“页面解析”和“接口调用”在同一个 Spider 生命周期里串成一条可维护、可调试、可监控的数据流水线。适合已会写基础 Scrapy 爬虫、正被大众点评这类“半动静态”站点卡住的中级开发者。2. 从页面源码里抠出真实接口用浏览器开发者工具定位 XHR 请求并还原参数生成逻辑2.1 找到那个“藏数据”的 XHR 请求不是看 Network 标签页里最靠前的而是看响应体结构最像你要的数据打开大众点评任意一家门店页例如搜索“上海静安区咖啡馆”点进某家店按 F12 打开开发者工具切到 Network 标签页然后刷新页面。不要急着找review或comment字样的请求——先清空列表再滚动页面到底部触发“加载更多评论”。这时出现的 XHR 请求才是关键。观察响应体Preview 或 Response如果看到类似{reviews: [{id: xxx, rating: 5, comment: 环境很好...}这样的 JSON 结构且reviews数组长度 0这个请求就是目标。右键 → “Copy” → “Copy as cURL (bash)”粘贴到终端执行验证curl https://www.dianping.com/ajax/json/shopDynamic/review?shopId123456789cityId1regionId10sortType1categoryId10 \ -H User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 \ -H Cookie: _lxsdk_cuidxxx; _lxsdkxxx; sguidxxx;提示shopId、cityId、regionId这些参数必须从当前页面 HTML 中提取不能硬编码。Cookie里的_lxsdk和sguid是登录态标识未登录时也存在但有效期短需每次请求携带。2.2 从 HTML 源码中提取动态参数用 Scrapy CSS 选择器定位script里的变量赋值回到页面源码Elements 标签页CtrlShiftF 搜索shopId你会发现shopId并非写死在 URL 里而是藏在某个script标签内形如script window.shopConfig { shopId: 123456789, cityId: 1, regionId: 10, categoryId: 10 }; /script或者更隐蔽的写法script var shopId 123456789; var cityId 1; /scriptScrapy 无法直接执行 JS但可以提取文本。在 Spider 的parse方法中用response.css(script::text).getall()获取所有 script 文本再用正则匹配import re import json def parse(self, response): # 提取 shopConfig 对象 script_texts response.css(script::text).getall() shop_config {} for script in script_texts: # 匹配 window.shopConfig { ... } config_match re.search(rwindow\.shopConfig\s*\s*({.*?});, script, re.DOTALL) if config_match: try: shop_config json.loads(config_match.group(1)) break except json.JSONDecodeError: continue # 若没找到 shopConfig尝试匹配 var shopId xxx if not shop_config.get(shopId): shop_id_match re.search(rvar\sshopId\s*\s*[\](\d)[\];, script) if shop_id_match: shop_config[shopId] shop_id_match.group(1) if not shop_config.get(shopId): self.logger.warning(fFailed to extract shopId from {response.url}) return # 构造评论接口 URL base_url https://www.dianping.com/ajax/json/shopDynamic/review params { shopId: shop_config[shopId], cityId: str(shop_config.get(cityId, 1)), regionId: str(shop_config.get(regionId, 0)), sortType: 1, # 1默认排序2最新3最热 categoryId: str(shop_config.get(categoryId, 10)) } api_url base_url ? .join([f{k}{v} for k, v in params.items()]) # 发起接口请求复用原始 response 的 cookies yield scrapy.Request( urlapi_url, cookiesresponse.request.cookies, headers{ User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36, Referer: response.url, X-Requested-With: XMLHttpRequest }, callbackself.parse_reviews, meta{shop_url: response.url, shop_config: shop_config} )这段代码的核心逻辑是不依赖 JS 执行只靠文本解析 正则 JSON 解析从 HTML 静态源码中“抠”出动态参数。response.request.cookies直接复用上一个请求的 Cookie避免手动管理 session。meta字段把上下文透传给后续回调保证数据归属可追溯。2.3 接口参数的“伪装”与“校验”时间戳、签名、Referer 缺一不可大众点评的评论接口并非裸奔。除了shopId等业务参数还隐含两个关键校验时间戳ts部分接口要求ts参数为当前毫秒时间戳如int(time.time() * 1000)且服务器会校验其与服务端时间偏差是否超过 30 秒Referer 强校验Referer必须是该门店页的真实 URL且不能是空或about:blankX-Requested-With必须为XMLHttpRequest否则返回 403。因此构造请求时不能只拼 URL还要动态注入时间戳import time # 在构造 params 时加入 ts params[ts] str(int(time.time() * 1000))同时headers中的Referer必须严格等于response.url不能省略。这是很多初学者翻车的第一步以为Referer可有可无结果接口直接返回{code:403,msg:Forbidden}。3. 处理接口返回的 JSON 数据字段映射、分页逻辑与增量抓取设计3.1 解析 JSON 响应体用 Scrapy 内置的json.loads而非response.json()兼容性更强Scrapy 1.8 支持response.json()但为兼容老版本及避免异常推荐显式用json.loadsimport json def parse_reviews(self, response): try: data json.loads(response.text) except json.JSONDecodeError as e: self.logger.error(fJSON decode error for {response.url}: {e}) return # 检查接口是否返回成功 if data.get(code) ! 200 or not data.get(data): self.logger.warning(fAPI returned non-200: {data.get(code)} - {data.get(msg)}) return reviews data[data].get(reviews, []) for review in reviews: item DianPingReviewItem() item[shop_url] response.meta[shop_url] item[review_id] review.get(id) item[rating] review.get(rating, 0) item[comment] review.get(comment, ).strip() item[user_name] review.get(user, {}).get(name, ) item[review_time] review.get(reviewTime, ) yield item # 分页处理检查是否有下一页 pagination data[data].get(pagination, {}) next_offset pagination.get(nextOffset) if next_offset and int(next_offset) 0: # 构造下一页请求复用原参数仅更新 offset base_url https://www.dianping.com/ajax/json/shopDynamic/review params { shopId: response.meta[shop_config][shopId], cityId: str(response.meta[shop_config].get(cityId, 1)), regionId: str(response.meta[shop_config].get(regionId, 0)), sortType: 1, categoryId: str(response.meta[shop_config].get(categoryId, 10)), offset: str(next_offset), ts: str(int(time.time() * 1000)) } next_url base_url ? .join([f{k}{v} for k, v in params.items()]) yield scrapy.Request( urlnext_url, cookiesresponse.request.cookies, headers{ User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36, Referer: response.meta[shop_url], X-Requested-With: XMLHttpRequest }, callbackself.parse_reviews, metaresponse.meta # 透传 shop_url 和 shop_config )这里的关键点是pagination.nextOffset是字符串且可能为0需转为int后判断是否 0。大众点评的分页不是page1,2,3而是offset0,20,40...每页固定 20 条。nextOffset为0表示无下一页但有些接口会返回0却仍有数据所以保险起见我们只在nextOffset存在且数值 0 时才发起下一页。3.2 增量抓取用scrapy-redis实现去重避免重复拉取同一家店的评论大众点评门店页 URL 可能因排序、筛选参数不同而产生多个变体如?rank1、?sortscore但实际指向同一家店。若不做去重同一shopId的评论会被反复抓取。解决方案是在请求发出前用shopId作为指纹存入 Redis全局去重。首先安装依赖pip install scrapy-redis在settings.py中配置# 启用 scrapy-redis 的去重 DUPEFILTER_CLASS scrapy_redis.dupefilter.RFPDupeFilter SCHEDULER scrapy_redis.scheduler.Scheduler SCHEDULER_PERSIST True REDIS_URL redis://localhost:6379然后在 Spider 中重写start_requests将初始 URL 的shopId提前解析并去重def start_requests(self): for url in self.start_urls: # 从 URL 中提取 shopId如 /shop/123456789 shop_id_match re.search(r/shop/(\d), url) if not shop_id_match: continue shop_id shop_id_match.group(1) # 用 shopId 作为 request fingerprint fp fdianping_shop_{shop_id} if self.server.sismember(dupefilter, fp): self.logger.info(fSkip duplicated shop: {shop_id}) continue self.server.sadd(dupefilter, fp) yield scrapy.Request(urlurl, callbackself.parse) def parse(self, response): # ... 提取 shopConfig构造 API 请求 ... # 注意此处不再需要额外去重因为 scrapy-redis 已接管这样即使你配置了 100 个不同参数的门店 URL只要shopId相同只会抓一次。scrapy-redis的RFPDupeFilter会自动对每个Request计算指纹而我们通过fp fdianping_shop_{shop_id}强制将指纹绑定到业务维度比默认的 URL 指纹更精准。4. 避坑大众点评爬虫的 4 个血泪经验第 3 条让 80% 的人重写一半代码4.1 现象response.css(div.review-item)返回空列表但浏览器明明能看到评论原因你试图用 Scrapy 解析 HTML 中的评论 DOM但大众点评的评论区是 JS 动态渲染的HTML 源码里只有div idreview-list/div这样的空容器。Scrapy 不执行 JS所以永远拿不到。解决放弃css()解析评论转向分析 Network 中的 XHR 接口用scrapy.Request主动调用接口获取 JSON 数据。这是根本性认知切换——从“爬页面”转向“爬接口”。4.2 现象接口返回{code:403,msg:Forbidden}但curl命令能成功原因curl命令里你手动复制了完整的 Cookie而 Scrapy 的response.request.cookies是dict类型但大众点评的某些 Cookie如_lxsdk_s值中包含等号和点号.Scrapy 默认的cookies参数会错误解析如把ab.cd当成两个键值对。解决不用cookies参数改用headers注入Cookie字符串# 错误写法可能截断 Cookie yield scrapy.Request(urlapi_url, cookiesresponse.request.cookies, ...) # 正确写法完整传递原始 Cookie 字符串 cookie_str response.request.headers.get(Cookie, b).decode(utf-8) yield scrapy.Request( urlapi_url, headers{ Cookie: cookie_str, User-Agent: ..., Referer: response.url, X-Requested-With: XMLHttpRequest }, ... )4.3 现象爬了几百条后突然全部 403重启爬虫也不行过几小时又好了原因大众点评服务端有 IP 级限流阈值约为 30–50 次请求/分钟。一旦触发该 IP 会被封禁 1–2 小时且封禁期间所有请求包括首页、搜索页均返回 403。这不是账号问题是 IP 黑名单。解决必须加请求间隔 随机 jitter 代理池非必须但推荐。在settings.py中# 基础延迟 DOWNLOAD_DELAY 2 # 随机 jitter0.5~1.5 倍 delay RANDOMIZE_DOWNLOAD_DELAY True # 并发数压低 CONCURRENT_REQUESTS 2 CONCURRENT_REQUESTS_PER_DOMAIN 2更进一步用scrapy-proxies配合免费代理池如快代理、芝麻代理的开放接口但注意免费代理稳定性差需配合RetryMiddleware自动换代理。4.4 现象评论内容里大量\uXXXXUnicode 转义字符如环境很好\uff0c\u670d\u52a1\u4e5f\u5f88\u597d原因接口返回的 JSON 是 UTF-8 编码但 Pythonjson.loads()默认会将非 ASCII 字符转为\uXXXX形式这是标准行为不是乱码。解决在json.loads()时传入ensure_asciiFalsedata json.loads(response.text, ensure_asciiFalse)否则item[comment]会是带\u的字符串入库或导出时显示为乱码。5. 部署与监控用 Scrapy Stats Collector 记录成功率用 Logstash 聚合日志做告警5.1 用 Scrapy 内置 Stats Collector 统计关键指标替代人工看 logScrapy 提供了crawler.stats对象可在 Spider 或 Middleware 中记录任意指标。我们在parse_reviews中加入成功率统计def parse_reviews(self, response): try: data json.loads(response.text, ensure_asciiFalse) except Exception as e: self.crawler.stats.inc_value(dianping/api_json_parse_failed) self.logger.error(fJSON parse failed: {e}) return if data.get(code) ! 200: self.crawler.stats.inc_value(dianping/api_http_failed) self.logger.warning(fAPI HTTP failed: {data.get(code)}) return reviews data[data].get(reviews, []) self.crawler.stats.set_value(dianping/reviews_per_request, len(reviews)) self.crawler.stats.inc_value(dianping/reviews_total, countlen(reviews)) # ... yield items ...启动爬虫时加上-s参数输出 statsscrapy crawl dianping_spider -s LOG_LEVELINFO -s STATS_DUMPTrue运行结束后Scrapy 会自动打印类似{dianping/api_json_parse_failed: 2, dianping/api_http_failed: 5, dianping/reviews_per_request: 20, dianping/reviews_total: 1240, downloader/request_count: 187, downloader/response_count: 187}这些指标可直接接入 Prometheus用scrapy-prometheus或写入 CSV 供 BI 分析。5.2 日志标准化用 Logstash 解析 Scrapy log按 level spider status 聚合告警Scrapy 默认日志是纯文本难以过滤。我们用logstash的grok插件做结构化解析。首先让 Scrapy 输出 JSON 格式日志需自定义LOG_FORMATTER# 在 settings.py 中 import json from scrapy.utils.log import configure_logging class JsonLogFormatter: def __init__(self, **kwargs): pass def format(self, record): log_entry { time: record.created, level: record.levelname, spider: getattr(record, spider, unknown), message: record.getMessage(), module: record.module, funcName: record.funcName } if hasattr(record, url): log_entry[url] record.url if hasattr(record, status): log_entry[status] record.status return json.dumps(log_entry, ensure_asciiFalse) LOG_FORMATTER myproject.settings.JsonLogFormatter然后用 Logstash 配置文件dianping.confinput { file { path /path/to/scrapy.log start_position beginning } } filter { json { source message } if [level] ERROR or [level] WARNING { mutate { add_tag [alert] } } } output { if alert in [tags] { email { to adminexample.com subject DianPing Crawler Alert: %{level} %{message} body Spider: %{spider}\nURL: %{url}\nTime: %{time} } } elasticsearch { hosts [http://localhost:9200] } }这样当parse_reviews中出现JSON decode errorLogstash 会立即发邮件告警并存入 Elasticsearch 供 Kibana 查看趋势。5.3 最小化部署用 Docker Compose 一键启停含 Redis Scrapy Logstash一个生产级最小部署只需 3 个容器。docker-compose.yml如下version: 3.8 services: redis: image: redis:7-alpine ports: [6379:6379] command: redis-server --appendonly yes logstash: image: docker.elastic.co/logstash/logstash:8.12.0 volumes: - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf - ./scrapy.log:/scrapy.log depends_on: [redis] crawler: build: . environment: - REDIS_URLredis://redis:6379 - LOG_LEVELINFO volumes: - ./scrapy.log:/app/scrapy.log depends_on: [redis, logstash]Dockerfile极简FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [scrapy, crawl, dianping_spider, -s, LOG_FILE/app/scrapy.log]requirements.txtscrapy2.11.2 scrapy-redis0.7.3 scrapy-proxies0.4.0 redis4.6.0执行docker-compose up -d三个服务自动启动日志自动收集Redis 自动持久化无需手动管理进程。这是我在线上跑模拟项目X 时的标准模板稳定运行 6 个月无中断。我习惯在每次上线新爬虫前先用scrapy check做静态检查再用scrapy list确认 Spider 名称最后用scrapy parse --spiderdianping_spider -c parse_reviews https://www.dianping.com/shop/123456789做单点调试——这三步能避开 90% 的语法和逻辑错误。大众点评的反爬不是铜墙铁壁它是一道需要耐心解的数学题参数在哪、怎么变、何时失效。把接口当 API 用把 HTML 当参数源把 Scrapy 当调度引擎而不是“万能网页下载器”你就已经赢在起跑线。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Java实现LSTM电力负荷预测:从理论到边缘部署

Java实现LSTM电力负荷预测:从理论到边缘部署

简介:本资源是一套基于LSTM算法实现电力负荷预测的Java项目源码,面向计算机、电气工程及相关专业本科生与研究生,适用于毕业设计、课程设计及期末大作业等实践场景。项目难度适中、结构清晰、注释完整,配套说明文档详实&#xff0…

2026/10/18 19:18:19 阅读更多 →
蛇形矩阵算法详解:回字形与S形实现及边界控制技巧

蛇形矩阵算法详解:回字形与S形实现及边界控制技巧

1. 蛇形矩阵到底是什么,为什么值得单独拎出来讲蛇形矩阵这个题,在算法练习平台里属于那种“看起来简单、写起来卡壳、写完还想再优化”的经典题型。我第一次碰到它的时候,心里想的是:不就是把数字按顺序填进一个方格吗&#xff1f…

2026/10/18 19:18:19 阅读更多 →
MarkEzd.dll二次开发全攻略:激光打标机与自动化产线集成

MarkEzd.dll二次开发全攻略:激光打标机与自动化产线集成

简介:一套面向激光打标行业开发者与 C# 工程师的 EZCAD 二次开发资源包。EZCAD 是工业激光标记场景下的常用上位机软件,支持图形编辑、文字处理、条形码/二维码生成与序列号递增;EZCAD2 在界面友好度、图形处理能力与自动化流程上进一步升级。…

2026/10/18 19:17:19 阅读更多 →

最新新闻

华为IGMP组播原理与实战:从精准调度到排障精要

华为IGMP组播原理与实战:从精准调度到排障精要

1. 为什么组播不是“群发”,而是一场精准的流量调度革命?很多人第一次听说IGMP,下意识就把它和微信群发、邮件群抄送划等号——“不就是让一台设备把数据同时发给多台设备吗?”这个理解方向错了,而且错得挺关键。我刚接…

2026/10/18 20:03:40 阅读更多 →
IPTV直播源管理系统:从m3u管理到全端稳定播放的工程实践

IPTV直播源管理系统:从m3u管理到全端稳定播放的工程实践

简介:这是一套基于Python开发的IPTV直播源管理系统可运行源码,面向具备基础Python开发与Web部署能力的技术爱好者、DIYP影音定制用户及中小型IPTV服务搭建者,解决直播源集中管理、动态配置与前端对接缺失的问题。资源包共29个文件&#xff0c…

2026/10/18 20:03:40 阅读更多 →
Maven三大生命周期与插件绑定机制:从mvn命令到构建流水线

Maven三大生命周期与插件绑定机制:从mvn命令到构建流水线

你在终端里敲下mvn clean install,回车,看着日志哗哗刷屏,最后等来一个 BUILD SUCCESS。但如果你被问一句:“这条命令到底让 Maven 做了多少事?”多半会愣一下。我刚开始用 Maven 那两年也是“会念咒不会解咒”&#x…

2026/10/18 20:03:40 阅读更多 →
STM32+TB6612电机驱动实战:PWM时序、死区防护与电流反馈闭环

STM32+TB6612电机驱动实战:PWM时序、死区防护与电流反馈闭环

简介:本资源是一份面向嵌入式初学者与STM32实践者的电机控制实战代码包,聚焦于使用STM32F103C8T6微控制器驱动TB6612FNG双H桥电机模块,解决直流电机PWM调速、正反转及小车运动状态封装控制等核心问题。压缩包共16个文件,含5个头文…

2026/10/18 20:03:40 阅读更多 →
电力系统通信设计内容深度规定:从可研到施工图的深度要求与避坑指南

电力系统通信设计内容深度规定:从可研到施工图的深度要求与避坑指南

简介:这份《电力系统通信设计内容深度规定》文档面向电力系统通信设计人员、电网调度与自动化工程师及相关专业师生,用于规范通信规划与系统通信设计各阶段的内容深度要求。文档共1个doc文件,压缩包约25KB,内容涵盖总则、电力系统…

2026/10/18 20:03:40 阅读更多 →
2026论文降AI全攻略:从检测原理到三轮返修法

2026论文降AI全攻略:从检测原理到三轮返修法

2026年,论文提交系统里的AIGC检测普遍又升了一级。最近找我咨询的同学,十个有八个开场白是同一句话:“我的论文AI率60%多,怎么降AI?”光这句话我就听了几百遍。今天这篇不绕弯子,把这套完整方案从头到尾写清…

2026/10/18 20:02:39 阅读更多 →

日新闻

基于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/18 12:16:16 阅读更多 →