)
k-skill 实战naver-blog-research 技能实现 Naver 博客搜索、正文提取与图片下载零 API Key【免费下载链接】k-skill한국인을 위한 스킬 모음집 - 에이전트를 한국인으로项目地址: https://gitcode.com/GitHub_Trending/ks/k-skillnaver-blog-research 是 k-skill 技能库中面向韩语内容调研的轻量级技能它让 AI Agent 仅凭python3标准库即可完成 Naver 博客搜索、单篇正文提取与图片本地下载全程不需要任何 API Key。本文以其instruction.md为骨架结合仓库内 4 个脚本源码与单元测试完整讲解三个核心命令的参数用法、JSON 输出结构、底层实现原理与合规边界读完即可在 k-skill CLI 中直接落地韩语博客调研工作流。一、技能定位这个 Skill 能做什么naver-blog-research 的核心能力可以概括为三句话源自其 instruction.md 的 What this skill does搜索检索 Naver 博客블로그输出结构化的 JSON 结果阅读读取单篇博客的原文本内容下载把正文中的图片下载到本地目录。它的设计取舍非常有特点也是它区别于一般爬虫脚本的关键零依赖零密钥不依赖任何第三方 Python 包全部使用python33.8标准库完成 HTTP 请求与 HTML 解析结构化输出搜索结果、正文、图片列表都以 JSON 返回方便 Agent 或下游程序直接消费移动端直取正文PC 版blog.naver.com是 iframe 嵌套结构难以直接抓取脚本会主动把 URL 转为移动版m.blog.naver.com从而无 iframe 地直接提取正文CDN 定向下载只允许从 Naver 博客图片 CDN 域名blogfiles.naver.net、postfiles.pstatic.net下载图片。从 skill.json 的元数据可以看到它被归类为category: research、locale: ko-KR、phase: v1即面向韩国本土内容的调研型技能。二、适用与不适用场景什么时候用When to use文档给出了几类典型触发场景均是韩语内容调研的自然语言指令네이버 블로그에서 결혼식 체크리스트 검색해줘帮我在 Naver 博客搜索婚礼清单네이버 블로그 리서치 해줘帮我做 Naver 博客调研한국 블로그에서 관련 정보 조사해줘帮我调查韩国博客上的相关信息네이버 블로그 글 읽어줘帮我读这篇 Naver 博客文章이 네이버 블로그 포스트에서 이미지 다운로드해줘帮我下载这篇 Naver 博客里的图片在韩语内容调研中需要 Google 之外补充 Naver 博客这一信源时什么时候不要用When not to use文档明确划定了使用边界Agent 触发时应主动拒绝或改道搜索 Naver 新闻、Cafe、지식iN知识人等其他非博客服务——本技能只处理博客域大规模爬取/抓取单个会话内数十次以上的请求——本技能明确不适用商业性数据采集。三、前置条件按文档要求运行本技能需要可用的互联网连接python33.8 及以上版本标准库即可无第三方依赖技能目录scripts/内的 helper 脚本即本仓库 packages/k-skill-cli/skills/naver-blog-research/scripts/ 下的 4 个文件。此外实际调用依赖 k-skill CLI 执行环境。技能目录下的 SKILL.md 还提示可以先运行npx -y nomadamas/k-skill0 instruct naver-blog-research获取完整指令用npx -y nomadamas/k-skill0 files naver-blog-research查看随技能打包的 helper 文件清单。四、脚本架构4 个文件的分工从 scripts 目录 看技能由 3 个可执行脚本 1 个共享工具模块组成文件职责naver_search.py调用 Naver 搜索页抓取博客搜索结果输出结构化 JSONnaver_read.py读取单篇博客提取标题、正文与图片 URLnaver_download_images.py从 CDN 下载图片到本地目录_naver_http.py共享 HTTP 工具SSL 上下文管理、Naver 域名校验、urlopen封装这种共享工具 三个功能入口的结构保证了三处对 HTTP 行为的处理尤其是 SSL 与域名白名单完全一致是阅读源码时值得借鉴的分层方式。五、工作流 1博客搜索naver_search.py命令与参数npx -y nomadamas/k-skill0 exec naver-blog-research scripts/naver_search.py -- 검색어 --count 10 --sort sim参数表继承自 instruction.md参数必填说明默认值query是搜索词---count否返回结果数最大 3010--sort否sim相关度/ date最新sim--timeout否请求超时秒15输出示例{ 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 } ] }每个结果条目同时包含 PC URL 与 mobile URLauthor即博客作者 ID从 URL 路径中解析snippet为搜索摘要便于 Agent 先概览再决定是否深入阅读。源码级解析请求参数与分页查看 naver_search.py 可了解其底层实现搜索请求构造build_search_params约 L46-L53请求目标为https://search.naver.com/search.naver核心查询参数包括ssctab.blog.all锁定博客标签页smtab_jum首页跳转/tab_pge翻页两种模式start起始结果序号每页 15 条RESULTS_PER_PAGE 15nso排序控制sim对应so:r,p:all,a:all按相关度date对应so:dd,p:all,a:all按日期倒序。结果解析parse_search_results通过正则BLOG_ANCHOR_PATTERNL31-L34匹配形如blog.naver.com/{author}/{postId}的链接并利用标题/摘要的 class 特征如headline1、body1区分 title 与 snippet。值得注意的是解析时会专门剔除새 창 열림新窗口打开这类可访问性隐藏标签避免污染标题文本。分页与去重search函数L109-L150count会被钳制在 1~30 之间每页只取前 15 条跨页请求之间time.sleep(0.5)限速结果按 URL 去重不足目标数量时继续翻页直到取够或没有新结果为止。若首页就解析失败会向 stderr 打印警告提示 Naver HTML 结构可能已变化。六、工作流 2博客正文阅读naver_read.py命令与参数npx -y nomadamas/k-skill0 exec naver-blog-research scripts/naver_read.py -- https://blog.naver.com/user123/224212849946参数表参数必填说明默认值url是博客文章 URLPC 或移动版均可---no-images否输出中排除图片 URLfalse--max-length否正文最大字符数0不限0--timeout否请求超时秒20文档特别说明即使传入 PC 版 URL脚本也会自动转换为移动版 URL 再请求。源码级解析移动版转换与正文提取查看 naver_read.pyURL 转换to_mobile_urlL53-L60把https://blog.naver.com/...前缀替换为https://m.blog.naver.com/若 URL 本身不是该形式则用正则从任意 URL 中提取blog.naver.com/{id}/{postId}重组移动版地址。请求时使用 iPhone 版 User-AgentL15-L18。正文区域定位extract_content_areaL115-L131优先匹配se-main-container容器依次回退到post_ct、postViewArea、post-view等 class最后尝试idviewTypeSelector标记找到后通过括号配平的_extract_div_block切出完整 div 块并对 HTML 注释做了跳过处理。文本清洗extract_textL134-L148先剔除script、style、noscript块再把br与/p、/div、/li等块级结束标签替换为换行随后剥掉所有标签并做 HTML 实体反转义最后规整空白行。图片提取extract_imagesL151-L182仅接受来自三个 CDN 域blogfiles.naver.net、postfiles.pstatic.net、mblogthumb-phinf.pstatic.net的图片同时匹配data-lazy-src懒加载与src两种属性并按基础 URL 去重对带_blur模糊后缀的缩略图会改写为?typew800的高清版本并附带alt文本。输出结构read_blogL185-L209{ url: https://m.blog.naver.com/user123/224212849946, title: 결혼식 체크리스트 총정리, content: …正文文本…, char_count: 1024, images: [ { url: https://blogfiles.naver.net/..., alt: … } ] }--max-length生效时正文会被截断并追加...若未找到正文区域会输出warning字段提示 HTML 结构可能已变化。七、工作流 3图片下载naver_download_images.py命令与参数npx -y nomadamas/k-skill0 exec naver-blog-research scripts/naver_download_images.py -- --urls url1,url2,url3 --output ./images/也可以把naver_read.py的结果直接通过管道喂给它npx -y nomadamas/k-skill0 exec naver-blog-research scripts/naver_read.py -- https://... | npx -y nomadamas/k-skill0 exec naver-blog-research scripts/naver_download_images.py -- --output ./images/参数表参数必填说明默认值--urls否逗号分隔的图片 URL 列表---output否保存目录./naver-images/--max否最大下载数量10--timeout否请求超时秒15源码级解析管道读取、并发与安全查看 naver_download_images.pystdin 管道read_urls_from_stdinL180-L199若未传--urls且 stdin 不是 TTY会尝试把 stdin 作为 JSON 解析支持三种形态——含images键的字典即naver_read.py的输出、URL 字符串数组、{url: ...}对象数组。因此上一节的管道用法天然成立并发下载download_imagesL105-L150用ThreadPoolExecutor最多 4 个 worker 并发文件按001.jpg、002.png的序号命名保持传入顺序最终输出{downloaded, files[], failed[]}其中每个文件记录url、path、size_kb扩展名推断guess_extensionL47-L67依次依据Content-Type、URL 后缀、文件魔数magic bytes如 PNG/ GIF/ WebP/ BMP/ JPEG判断安全护栏download_image首先用is_naver_url校验 URL 必须属于.naver.com/.naver.net/.pstatic.net域见 _naver_http.py 的 is_naver_url并用realpath校验输出路径不能逃逸目标目录防路径穿越请求头还带上了Referer: https://m.blog.naver.com/。八、推荐工作流与跨源验证instruction.md 给出了一条完整的研究流水线用naver_search.py搜索先查看前 3~5 条结果概览挑出相关度高的文章用naver_read.py读取正文按需用naver_download_images.py保存图片与 WebSearchGoogle结果交叉验证提升信息可信度。这套流程的本质是先摘要后精读、多信源交叉的调研范式Agent 按此执行即可避免盲目抓取整页结果。九、响应策略与完成标准Response policy输出给用户时的约束搜索结果与正文要摘要化后传达给用户而非原文倾倒必须附上博客出处URL、作者单个会话内避免过量请求数十次以上下载图片后要告知用户本地保存路径。Done when判定任务完成的标准搜索结果能正常输出 JSON博客正文文本成功提取所需图片成功保存到本地出处来源明确告知用户。十、注意事项与限制Notes文档末尾明确列出了三条运维级提醒这是实际使用中必须接受的前提IP 风控脚本直接请求 Naver 搜索引擎大量/自动化使用存在 IP 被封锁的可能因此本技能被设计为小批量、非商业的轻量调研用途HTML 易变Naver 的页面结构可能随时调整解析失败时需查看报错信息并更新脚本。这一点在源码中也有呼应——naver_search.py首页解析失败会打警告、naver_read.py找不到正文区域会输出warning字段iframe 问题的技术缘由PC 版blog.naver.com采用 iframe 结构正文在嵌套文档中因此统一改用移动版m.blog.naver.com直接提取。另外根目录 SKILL.md 及 references/ 下的法律声明文件含韩国大法院判例与成文法依据要求自动收集公开信息必须限于个人、非组织用途不得用于系统化/批量爬取、构建数据库、绕过访问控制或妨碍第三方业务。这与文档当不要用时的约束完全一致。十一、质量保障单元测试覆盖仓库根目录的 scripts/test_naver_blog_search.py 为本技能提供了针对性测试可佐证其核心逻辑的稳定性RequestBuilderTest验证搜索参数构造——ssc锁定博客标签、首页用smtab_jum翻页切换为smtab_pge、sim/date分别映射到不同的nso值ParseSearchResultsHiddenLabelTest验证새 창 열림可访问性标签从标题/摘要中被正确剥离且不会误伤正文中原本就含该词组的合法文本SearchWorkflowTestmock 掉网络层验证count20时按 15 条一页翻页、URL 去重、跨页间隔sleep(0.5)以及date排序参数的透传。测试直接通过importlib从 naver-blog-research/scripts/naver_search.py 加载模块进行单测不依赖网络证明了解析与分页逻辑可离线验证——如果你要二次开发这个技能这套测试模式可以直接复用。结语naver-blog-research 是一个小而完整的调研技能样板它用纯标准库解决了韩语博客搜索、正文提取、图片下载三个实际问题并通过移动版 URL 转换、CDN 域名白名单、路径穿越防护、限速去重和明确的使用边界把轻量合规调研落到了工程实处。结合本仓库中 4 个脚本源码与根目录测试用例你可以直接掌握其请求构造、解析回退策略与并发下载的全部细节并在此基础上按需扩展。【免费下载链接】k-skill한국인을 위한 스킬 모음집 - 에이전트를 한국인으로项目地址: https://gitcode.com/GitHub_Trending/ks/k-skill创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考