
k-skill naver-blog-research 实战无需 API 密钥的韩国博客检索、正文提取与图片下载全流程【免费下载链接】k-skill한국인을 위한 스킬 모음집 - 에이전트를 한국인으로项目地址: https://gitcode.com/GitHub_Trending/ks/k-skill本文基于 k-skill 仓库的 naver-blog-research 功能指南完整讲解如何用python3标准库零第三方依赖、零 API 密钥完成韩国 Naver 博客的关键词检索、正文原文提取和图片本地下载并结合 脚本源码 深入剖析移动端 URL 转换、div 块提取、图片 CDN 识别与路径穿越防护等关键实现帮助你在 Agent 工作流中构建可复现的“博客检索 → 原文阅读 → 图片落盘 → 多源交叉验证”调研管线。一、这个技能能做什么naver-blog-research 是 k-skill 中的调研research类技能定位为小量、非商业性的韩语内容调研工具。根据 instruction.md 的描述它覆盖四个核心能力Naver 博客关键词搜索支持按相关度관련도순或最新최신순排序博客帖子原文文本提取输出结构化 JSON包含标题、正文、字符数图片 URL 提取与本地下载从博客图片 CDNblogfiles.naver.net、postfiles.pstatic.net拉取图片到本地目录与谷歌搜索WebSearch并行做韩语内容交叉验证提升信息可信度。它的适用场景典型表述如“帮我搜一下 Naver 博客里的婚礼检查清单”“读这篇 Naver 博客”“从这篇帖子下载图片”等。反过来instruction.md 明确了不适用场景Naver 新闻/카페/지식iN 等非博客服务、单会话数十条以上的大规模抓取、商业性数据采集。前置条件与输入运行该技能只需三个前提无需任何密钥python33.8互联网连接技能目录自带的scripts/helper 脚本。输入按三个子命令划分子命令输入说明搜索搜索词字符串如서울 맛집 추천返回结构化 JSON 结果原文读取Naver 博客帖子 URLPC 版或移动版均可返回标题 正文 图片列表图片下载图片 URL 列表或naver_read.py的管道输出落盘到本地目录二、官方请求面搜索、帖子与图片 CDN 的 URL 结构理解三个“官方表面”是后续所有脚本行为的钥匙博客搜索端点https://search.naver.com/search.naver?whereblogquery{query}博客原文移动版https://m.blog.naver.com/{userId}/{postId}图片 CDN 域名blogfiles.naver.net、postfiles.pstatic.net其中第 2 点是整个设计的关键决策PC 版博客blog.naver.com的正文嵌在 iframe 里纯 HTTP 抓取拿不到正文内容而移动版m.blog.naver.com是同文档结构因此脚本统一走移动版。这一点在 naver_read.py 的to_mobile_url()函数中落地——传入 PC URL 时会自动重写为移动版 URL用户无需关心差异。三、整体工作流五步调研管线功能指南给出的标准流程是用naver_search.py执行 Naver 博客搜索从搜索结果中挑选前 3~5 篇帖子用naver_read.py读取所选帖子原文必要时用naver_download_images.py将图片保存到本地将结果与谷歌搜索WebSearch的结果交叉验证确认信息可信度。下面按脚本逐个展开。四、搜索脚本 naver_search.py参数、输出与实现细节基本用法npx -y nomadamas/k-skill0 exec naver-blog-research scripts/naver_search.py -- 제주도 여행 코스 --count 5 --sort sim参数表源自 instruction.md与源码parse_args完全一致参数必需说明默认值query是搜索词---count否返回结果数最大 3010--sort否sim相关度或date最新sim--timeout否HTTP 请求超时秒15--insecure否跳过 SSL 证书校验仅在证书报错时使用关输出为结构化 JSON例如{ query: 결혼식 체크리스트, total_results: 7, results: [ { title: 결혼식 체크리스트 총정리, url: https://blog.naver.com/user123/224212849946, mobile_url: https://m.blog.naver.com/user123/224212849946, snippet: 결혼식 1주일 전에 반드시 확인해야 할..., author: user123 } ] }每条结果同时携带urlPC 版和mobile_url移动版以及从 URL 中解析出的author博主 ID供下游naver_read.py直接消费。源码级实现搜索参数构造与分页从 naver_search.py 的build_search_params()看真实请求并不只带whereblog而是组装了 Naver 搜索内部使用的参数集{ query: query, ssc: tab.blog.all, # 锁定博客标签页全量 sm: tab_jum if start 1 else tab_pge, # 首页/翻页两种跳转模式 start: str(start), # 起始偏移 nso: {sim: so:r,p:all,a:all, date: so:dd,p:all,a:all}.get(sort, so:r,p:all,a:all), }这里有两个值得注意的细节排序通过nso参数实现so:rrelevance对应相关度排序so:dddate desc对应最新排序。--sort的取值被限制为sim/date二选一非法值会回落到相关度分页采用 15 条/页RESULTS_PER_PAGE 15sm参数在首页与翻页间切换为tab_jum/tab_pge。search()中的分页循环允许额外多抓 3 页作为缓冲max_pages count // 15 3因为 Naver 每页返回条数不一定精确为 15 条页间会time.sleep(0.5)节流并用seen_urls集合跨页去重。单元测试 test_naver_blog_search.py 对上述行为做了固化验证build_search_params在start1与start16时分别产出smtab_jum/tab_pgesortdate时nso变为so:dd,p:all,a:all分页测试则用 mock 断言抓取起点为[1, 16]、且页面窗口外的多余锚点会被忽略。源码级实现结果解析与“隐藏标签”清洗解析器用正则BLOG_ANCHOR_PATTERN捕获形如a hrefhttps://blog.naver.com/{userId}/{postId}的锚点再从锚点内 HTML 的 class 特征区分标题含headline1/text-type-headline与摘要含body1/text-type-body。一个容易被忽视的工程细节是无障碍标签的清洗Naver 搜索结果锚点里嵌有视觉上隐藏的span새 창 열림/span“新窗口打开”。由于该类是 CSS 模块哈希如fender-ui_0cb57fb2随时会变因此代码选择按标签文本而非 class 名来剥离NEW_WINDOW_LABEL_RE re.compile(rspan[^]*\s*새\s*창\s*열림\s*/span)对应测试覆盖了三种刁钻情况标签紧跟在标题后、标签紧贴正文无空格、以及正文本身合法地包含“새 창 열림”字样引号包裹时不得误删。这类细节保证了输出 title/snippet 的干净度。此外当首页解析不到任何结果时脚本会向 stderr 打印[warn] 검색 결과 파싱 실패...可能是 Naver HTML 结构变更而 HTTP 错误会被包装为包含状态码的RuntimeError最终以{error: ...}JSON 形式输出到 stderr 并返回退出码 1——对 Agent 调用方来说是可判定的失败信号。五、原文读取脚本 naver_read.py从 PC URL 到干净正文基本用法npx -y nomadamas/k-skill0 exec naver-blog-research scripts/naver_read.py -- https://blog.naver.com/user123/224212849946参数必需说明默认值url是博客帖子 URLPC 或移动版---no-images否输出中排除图片 URL关--max-length否正文最大字符数0 不限制0--timeout否HTTP 请求超时秒20--insecure否跳过 SSL 证书校验关输出 JSON 包含url已规范为移动版、title、content、char_count以及未加--no-images时的images数组每项含url与alt。源码级实现URL 归一化、内容区定位与文本清洗naver_read.py 的处理链分为四段URL 归一化to_mobile_url()先把blog.naver.com/前缀替换为m.blog.naver.com/若 URL 不含标准前缀则用正则blog\.naver\.com/([a-zA-Z0-9_])/(\d)兜底提取userId/postId重新拼装。请求前还会经过共享层is_naver_url()白名单校验.naver.com/.naver.net/.pstatic.net非 Naver 域名直接报ValueError。同时 User-Agent 固定为iPhone Safari 移动版与移动版页面相匹配。内容区定位extract_content_area()先剥掉script/style/noscript再按优先级尝试定位正文容器——首选se-main-containerclass回退候选为post_ct、postViewArea、post-view兼容不同年代的 Naver 模板最后兜底找idviewTypeSelector标记。定位到起始位置后_extract_div_block()用字符级 div 深度计数提取完整的配对 div 块跳过 HTML 注释这比简单正则匹配/div更能抵抗嵌套结构。文本清洗extract_text()将br与块级结束标签/p/div/li替换为换行剥掉全部标签HTML 实体反转义压缩行内空白、折叠 3 行以上的连续空行为 2 行保证输出是可读的纯文本。图片 URL 提取extract_images()在内容区 HTML 中扫描img标签优先取懒加载属性data-lazy-src其次src且仅接受三大图片 CDN 主机blogfiles.naver.net、postfiles.pstatic.net、mblogthumb-phinf.pstatic.net。去重基于去掉?type...尺寸参数后的基础 URL若 URL 含_blur模糊缩略标记则改写为?typew800请求较清晰的原图变体。输出示例中若正文为空会附带warning字段提示“본문 영역을 찾지 못했습니다”未找到正文区域可能是 HTML 结构变更为调用方提供结构化的降级信号。六、图片下载脚本 naver_download_images.py双入口与并发落盘基本用法显式传 URL 列表npx -y nomadamas/k-skill0 exec naver-blog-research scripts/naver_download_images.py -- --urls url1,url2,url3 --output ./images/或与前一步管道直连功能指南推荐的方式npx -y nomadamas/k-skill0 exec naver-blog-research scripts/naver_read.py -- https://blog.naver.com/user123/224212849946 \ | npx -y nomadamas/k-skill0 exec naver-blog-research scripts/naver_download_images.py -- --output ./images/ --max 5参数必需说明默认值--urls否逗号分隔的图片 URL---output否保存目录./naver-images/--max否最大下载数10--timeout否HTTP 请求超时秒15URL 来源有两层回退优先使用--urls若未提供且 stdin 非 TTY则从 stdin 读取 JSON——read_urls_from_stdin()能识别naver_read.py的完整输出取images[].url也兼容纯 URL 数组若 stdin JSON 中缺少images键会提示检查是否误加了--no-images。没有任何 URL 时以 JSON 错误信息退出。源码级实现域名白名单、扩展名推断与安全落盘naver_download_images.py 有几处值得展开的实现只允许 Naver CDN每张图先过is_naver_url()白名单非 Naver 域名直接记为{error: Not a Naver CDN URL. Skipped.}从源头避免误抓任意 URL路径穿越防护download_image()用os.path.realpath校验最终落盘路径必须位于--output目录内否则拒绝写入扩展名三级推断guess_extension先看响应Content-Typejpeg/png/gif/webp/bmp/svg 映射再看 URL 后缀.jpeg归一为.jpg最后用文件头魔数兜底PNG/GIF/RIFF-WebP/BMP 前缀JPEG 用\xff\xd8仍无法判断则回退.jpg。因此下载文件名按001、002… 顺序编号并自动补上正确后缀有限并发ThreadPoolExecutor最多 4 个工作线程结果按原始 URL 顺序排序输出保证 JSON 中files/failed列表与输入顺序一致请求头携带Referer: https://m.blog.naver.com/模拟从博客页跳转而来的图片请求。下载完成后输出统计 JSONdownloaded计数、每个文件的path与size_kb、失败项便于 Agent 汇总并告知用户保存位置。七、共享 HTTP 层 _naver_http.pySSL 策略与域名白名单三个脚本共同依赖 _naver_http.py它收敛了两类横切逻辑urlopen封装默认使用ssl.create_default_context()完整证书校验当显式传入--insecure时切换到CERT_NONE上下文但有双重约束——目标 URL 必须命中 Naver 域名白名单否则抛ValueError且每次调用都会向 stderr 打印[warn] SSL 인증서 검증이 비활성화되었습니다已禁用证书校验连接可能不安全的警示。也就是说insecure 模式只能作为证书异常时的临时逃生舱而不是常规开关is_naver_url()域名守卫解析 hostname 后匹配.naver.com、.naver.net、.pstatic.net三个后缀被搜索页抓取、正文抓取、图片下载三处复用。八、合规边界与注意事项功能指南naver-blog-research.md与 instruction.md 给出的注意事项必须原样遵守IP 封禁风险脚本直接请求 Naver 搜索引擎大量自动化请求可能导致 IP 被封锁单个会话内应克制请求量instruction.md 明确将“数十条以上/会话”列为不适用场景设计用途限定本技能为小量、非商业内容调研而设计HTML 结构漂移Naver 前端改版会导致解析失败出错时应检查脚本并升级而不是盲目重试移动版优先的原因PC 版blog.naver.com为 iframe 结构故统一使用移动版m.blog.naver.com来源标注义务使用时必须向用户同时给出博客来源URL 与作者图片下载后也要告知用户保存路径结果以“摘要 链接”方式呈现而非整文搬运。此外references/DISCLAIMER.md 从法律角度进一步划界本技能与 Naver 及博主均无官方关联公开信息自动收集仅限个人信息查询用途不得用于组织化/大规模爬取、建立专门数据库或再分发且不得绕过访问控制、验证码或速率限制。文中还引用了韩国最高法院相关判例与《商标法》《信息通信网法》《著作权法》条款作为边界说明注意该文声明其本身不构成法律建议。在 Agent 侧的落地规则见 SKILL.md 的“Hard rules”不执行支付/提交等不可逆操作、不在对话或参数中留存明文凭据、不绕过 CAPTCHA 与身份核验边界。九、验收标准与延伸阅读按 instruction.md 的 “Done when” 定义一次成功的调研应满足搜索结果为正常 JSON 输出博客正文文本被成功提取所需图片已落盘到本地来源URL/作者已随结果一并给出。若需继续深入可对照仓库中以下文件功能总览docs/features/naver-blog-research.md三个可执行脚本naver_search.py、naver_read.py、naver_download_images.py共享 HTTP 层_naver_http.py搜索行为单元测试test_naver_blog_search.py使用边界与法律声明DISCLAIMER.md、TRADEMARK-LEGAL-STATEMENT.md。【免费下载链接】k-skill한국인을 위한 스킬 모음집 - 에이전트를 한국인으로项目地址: https://gitcode.com/GitHub_Trending/ks/k-skill创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考