Exercism 解决方案
将单个已发布的 Exercism 解决方案页面解析为结构化 JSON,包含其轨道、练习、作者、语言、迭代历史以及完整源代码。
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' -Gfrom 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。
解决方案所属的轨道。
轨道 slug(例如
ruby)。轨道显示标题(例如
Ruby)。轨道图标的 URL。
解决方案所属的练习。
练习 slug(例如
two-fer)。练习类型(例如
practice 或 concept)。练习显示标题。
练习图标的 URL。
难度标签(例如
easy、medium、hard)。练习的简短描述。
解决方案的作者。
作者用户名(Exercism username)。
解决方案的编程语言。
作者使用的编辑器缩进大小,未报告时为 null。
解决方案的星标数量。
iterations 数组中的迭代次数。当解决方案与当前练习不同步(过时)时为 true。
已发布迭代的索引(
idx),无则为 null。解决方案的发布时间(ISO 8601),缺失时为 null。
解决方案的迭代历史,最早的排在前面。
迭代索引(从 1 开始)。
迭代的分析状态(例如
no_automated_feedback)。迭代的测试运行状态(例如
passed)。迭代的提交方式(例如
cli 或 api)。迭代的创建时间(ISO 8601),缺失时为 null。
当此迭代为已发布的迭代时为 true。
当此迭代为最新的迭代时为 true。
已发布解决方案的完整源代码,缺失时为 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"
}