Blog›Guides

停止抓取,开始下载:获取提示数据的礼貌方式

抓取wikiprompt搜索界面既慢又脆弱,还会给我们的服务器带来负担。公开的批量数据集以干净的JSON格式提供了全部55,000多个提示词,并内置了归属信息。

停止抓取,开始下载:获取提示数据的礼貌方式

停止爬取,开始下载:获取提示词数据的礼貌方式

如果你现在正用无头浏览器访问 /search,一页一页地翻结果,解析那些本不该被解析的 HTML,这篇文章就是为你写的。有一种更快的方式,而且不需要假装自己是人类。

我们能看到流量。每周都有几个爬虫用轮换的 user agent、随机延迟,偶尔还有重试风暴来访问 wikiprompt.org 的搜索页面,因为我们发布了一个 UI 改动,某个选择器失效了。这种方式勉强能用,直到它不能用为止。然后有人就得去重写爬虫,又一次,因为我们重命名了一个 CSS 类或改变了分页的渲染方式。

而与此同时,整个目录,全部 55,000+ 条提示词,就放在一个 JSON 端点后面,毫秒级响应,而且不在乎你请求多少次。

为什么爬取网站在这里是错误工具

在没有替代方案时,爬取搜索 UI 是合理的技术手段。但有替代方案时它就是糟糕的技术手段,以下是它为什么对提示词目录特别不适用:

  • 它很慢。 每次 /search 页面加载都要渲染完整的 HTML 文档,运行客户端 JS,而且只给你大概 20-40 条结果。要拿到全部数据,你需要成千上万次页面加载,每次都有你根本不需要的渲染开销。
  • 它很脆弱。 你解析的是标记,不是数据。任何 CSS 重构、任何 A/B 测试、任何重新设计,都会悄悄破坏你的提取逻辑。你直到数字看起来不对时才会发现。
  • 它给服务器造成压力。 爬虫分不清缓存响应和新响应。每个请求都可能变成绕过缓存的查询,在规模大了之后,这就会变成那种导致 IP 被限速或封禁的负载模式。
  • 它丢掉了你本需要重建的结构。 渲染后的页面有标题和描述。它不会干净地给你 model、metadata.aspect_ratio、metadata.style,或者我们附加在图像和视频提示词上的评估分数。你是在逆向工程我们已经以 JSON 形式发布的字段。
  • 它在法律和道德上都更麻烦。 爬取的 HTML 没有干净的方式把署名带回原作者。结构化数据可以。
  • 这些都不是威胁,只是描述爬取会给你带来什么成本。我们宁愿你完全跳过这些。

    礼貌的方式:批量数据集

    我们发布数据集,正是为了让没人需要爬我们。先访问清单:

    curl "https://www.wikiprompt.org/dataset"

    它返回 total_prompts、每条记录上你能预期的 record_fields,以及分页方案。然后从 /dataset/prompts 拉取记录:

    curl "https://www.wikiprompt.org/dataset/prompts?limit=500"

    这一个请求就能让你一次拿到最多 500 条完全结构化的提示词记录,不需要无头浏览器,不需要解析 HTML,不需要等待渲染。每条记录已经包含 slug、url、title、description、content(实际提示词文本)、category、tags、media、model、结构化的 metadata 对象、author、original_source,以及两个时间戳。这就是你想从页面里爬出来的所有东西,直接以预解析的形式交给你。

    分页用的是 keyset 而不是 offset,如果你曾经因为底层列表在爬取过程中移动而导致爬虫悄悄跳过或重复记录,这个细节最重要。跟随每个响应中的 next URL,直到它返回 null。一个最小的 Python 循环:

    import requests

    url = "https://www.wikiprompt.org/dataset/prompts?limit=500"

    records = []

    while url:

    resp = requests.get(url).json()

    records.extend(resp["records"])

    url = resp.get("next")

    print(len(records), "prompts pulled, zero pages rendered")

    不需要 sleep 和重试逻辑,不需要轮换 user agent,不需要维护选择器。整个目录,用一个几秒钟就能跑完的循环搞定,因为每个响应都是边缘缓存且启用了 CORS(Access-Control-Allow-Origin: *),也可以直接在浏览器里用。

    你能得到爬取永远给不了的东西

    除了速度,数据集还携带了从未以可用形式出现在渲染页面上的信号。拿一张手工刻制的油毡版画旅行海报提示词来说:记录里包含 style 数组和 metadata 中的宽高比,这种字段你本来只能从图片里推断。或者一张围绕建筑楼梯构建的编辑肖像,其中的 model 字段精确告诉你是什么生成的,不用你从图片风格去猜。又或者一个把角色变形为蛛形纲形态的提示词,它自带质量评估,这是任何爬虫读可见页面都永远无法干净提取的东西。

    每条记录还保留着 original_source,即提示词来源的原始推文或帖子的链接。这就是让复用变得合法的关键:wikiprompt.org 聚合的是别人写的公开提示词,我们不是底层内容的作者,如果你从数据集拉取,你也不是。当你使用这些记录时,请同时注明 wikiprompt.org 作为来源,以及每条提示词的 original_source。我们不对别人的帖子主张正式许可,我们只是目录,也请你这样对待它。

    如果你需要比全量导出更窄的东西

    完整数据集是给批量使用、训练集、分析、镜像用的。如果你实际上只需要一个实时查询,用搜索 API 而不是爬取 /search,它针对单个查询返回同样的结构化 JSON,你完全不需要碰 UI。如果你在构建 agent,MCP 服务器把搜索、检索甚至提交都暴露为工具。如果你想在写任何代码之前先搞清楚范围里有什么,llms.txt 就是地图。

    实际的请求

    爬取 /search 得到的是我们本来就免费提供的数据的更差副本,更慢、更脆弱,对我们的服务器也更重。数据集给你同样的内容,结构化、分页合理、持续更新,而且只需要一条 curl 命令就能开始。

    如果你现在在维护针对 wikiprompt.org 的爬虫,我们并不恼火,我们理解,大多数网站不提供这个。我们提供了。把你的脚本指向 /dataset/prompts,删掉爬虫,把省下来的时间花在你本来想构建的东西上。

    Tags
    open-data·dataset·scraping·api·ai-prompts·download