crawlbase文档
登录

API 用法

Crawling API 请求中添加 &scraper=exercism-solution。在 url 参数中对目标 URL 进行 URL 编码。

curl 'https://api.crawlbase.com/?token=YOUR_TOKEN' \
  --data-urlencode 'url=https://exercism.org/tracks/ruby/exercises/two-fer/solutions/neilnorthrop' \
  --data-urlencode 'scraper=exercism-solution' -G
from crawlbase import CrawlingAPI

api = CrawlingAPI({'token': 'YOUR_TOKEN'})
res = api.get(
    'https://exercism.org/tracks/ruby/exercises/two-fer/solutions/neilnorthrop',
    {'scraper': 'exercism-solution'}
)

import json
data = json.loads(res['body'])
const { CrawlingAPI } = require('crawlbase');
const api = new CrawlingAPI({ token: 'YOUR_TOKEN' });

const res = await api.get(
  'https://exercism.org/tracks/ruby/exercises/two-fer/solutions/neilnorthrop',
  { scraper: 'exercism-solution' }
);
const data = JSON.parse(res.body);
require 'crawlbase'
api = Crawlbase::API.new(token: 'YOUR_TOKEN')

res = api.get('https://exercism.org/tracks/ruby/exercises/two-fer/solutions/neilnorthrop', scraper: 'exercism-solution')
data = JSON.parse(res.body)

示例输入 URL

url 参数支持任意单个已发布的 Exercism 解决方案页面 - 即 /tracks/<track>/exercises/<slug>/solutions/<handle> 的页面。例如:

https://exercism.org/tracks/ruby/exercises/two-fer/solutions/neilnorthrop
https://exercism.org/tracks/go/exercises/hello-world/solutions/erikschierboom

响应结构

JSON 响应体。当源页面省略对应值时,字段类型可能为 null

url
string
被抓取的解决方案页面的 URL。
track
object
解决方案所属的轨道。
track.slug
string | null
轨道 slug(例如 ruby)。
track.title
string | null
轨道显示标题(例如 Ruby)。
track.iconUrl
string | null
轨道图标的 URL。
exercise
object
解决方案所属的练习。
exercise.slug
string | null
练习 slug(例如 two-fer)。
exercise.type
string | null
练习类型(例如 practiceconcept)。
exercise.title
string | null
练习显示标题。
exercise.iconUrl
string | null
练习图标的 URL。
exercise.difficulty
string | null
难度标签(例如 easymediumhard)。
exercise.blurb
string | null
练习的简短描述。
author
object
解决方案的作者。
author.handle
string | null
作者用户名(Exercism username)。
language
string | null
解决方案的编程语言。
indentSize
integer | null
作者使用的编辑器缩进大小,未报告时为 null。
numStars
integer | null
解决方案的星标数量。
numIterations
integer
iterations 数组中的迭代次数。
isOutOfDate
boolean
当解决方案与当前练习不同步(过时)时为 true。
publishedIterationIdx
integer | null
已发布迭代的索引(idx),无则为 null。
publishedAt
string | null
解决方案的发布时间(ISO 8601),缺失时为 null。
iterations
array
解决方案的迭代历史,最早的排在前面。
iterations[].idx
integer | null
迭代索引(从 1 开始)。
iterations[].status
string | null
迭代的分析状态(例如 no_automated_feedback)。
iterations[].testsStatus
string | null
迭代的测试运行状态(例如 passed)。
iterations[].submissionMethod
string | null
迭代的提交方式(例如 cliapi)。
iterations[].createdAt
string | null
迭代的创建时间(ISO 8601),缺失时为 null。
iterations[].isPublished
boolean
当此迭代为已发布的迭代时为 true。
iterations[].isLatest
boolean
当此迭代为最新的迭代时为 true。
code
string | null
已发布解决方案的完整源代码,缺失时为 null。

示例响应

{
  "url": "https://exercism.org/tracks/ruby/exercises/two-fer/solutions/neilnorthrop",
  "track": {
    "slug": "ruby",
    "title": "Ruby",
    "iconUrl": "https://assets.exercism.org/tracks/ruby.svg"
  },
  "exercise": {
    "slug": "two-fer",
    "type": "practice",
    "title": "Two Fer",
    "iconUrl": "https://assets.exercism.org/exercises/two-fer.svg",
    "difficulty": "easy",
    "blurb": "Create a sentence of the form \"One for X, one for me.\""
  },
  "author": {
    "handle": "neilnorthrop"
  },
  "language": "ruby",
  "indentSize": 2,
  "numStars": 42,
  "numIterations": 2,
  "isOutOfDate": false,
  "publishedIterationIdx": 2,
  "publishedAt": "2026-05-18T14:03:27Z",
  "iterations": [
    {
      "idx": 1,
      "status": "no_automated_feedback",
      "testsStatus": "passed",
      "submissionMethod": "cli",
      "createdAt": "2026-05-17T22:41:03Z",
      "isPublished": false,
      "isLatest": false
    },
    {
      "idx": 2,
      "status": "no_automated_feedback",
      "testsStatus": "passed",
      "submissionMethod": "cli",
      "createdAt": "2026-05-18T14:03:27Z",
      "isPublished": true,
      "isLatest": true
    }
  ],
  "code": "def two_fer(name = \"you\")\n  \"One for #{name}, one for me.\"\nend"
}