crawlbaseДокументация
Войти

Использование API

Добавьте &scraper=exercism-solutions к запросу Crawling API. URL-кодируйте целевой URL в параметре url. Список постраничный (24 на страницу); передайте запрос ?page=N в целевом URL для последующих страниц.

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

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

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',
  { scraper: 'exercism-solutions' }
);
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', scraper: 'exercism-solutions')
data = JSON.parse(res.body)

Пример входного URL

В параметре url работает любая страница сообществ решений упражнения Exercism - страница по адресу /tracks/<track>/exercises/<slug>/solutions, при необходимости с запросом ?page=N. Например:

https://exercism.org/tracks/ruby/exercises/two-fer/solutions
https://exercism.org/tracks/go/exercises/hello-world/solutions
https://exercism.org/tracks/python/exercises/leap/solutions?page=2

Структура ответа

Тело ответа в формате JSON. Типы полей могут быть null, если исходная страница не содержит значения.

url
string
URL страницы списка решений, которая была обработана.
track
object
Контекст трека, взятый из первой строки решения.
track.title
string | null
Отображаемый заголовок трека (например, Ruby).
track.iconUrl
string | null
URL иконки трека.
exercise
object
Контекст упражнения, взятый из первой строки решения.
exercise.title
string | null
Отображаемый заголовок упражнения.
exercise.iconUrl
string | null
URL иконки упражнения.
page
integer | null
Номер текущей возвращённой страницы списка (начиная с 1).
totalPages
integer | null
Общее количество страниц решений для упражнения.
totalCount
integer | null
Общее количество опубликованных решений для упражнения.
solutionCount
integer
Количество решений, возвращённых в solutions на этой странице.
solutions
array
Опубликованные решения на этой странице, в порядке списка.
solutions[].uuid
string
UUID решения Exercism.
solutions[].author
object
Автор решения.
solutions[].author.handle
string
Хэндл автора (имя пользователя Exercism).
solutions[].author.avatarUrl
string | null
URL аватара автора.
solutions[].author.flair
string | null
Значок flair автора (например, insider), или null, если отсутствует.
solutions[].language
string
Язык программирования решения.
solutions[].numStars
integer
Количество звёзд у решения.
solutions[].numComments
integer
Количество комментариев к решению.
solutions[].numViews
integer
Количество просмотров решения.
solutions[].numIterations
integer
Количество итераций, отправленных автором.
solutions[].numLoc
integer | null
Количество строк кода в решении, или null, если не указано.
solutions[].isOutOfDate
boolean
True, если решение устарело относительно текущего упражнения.
solutions[].publishedAt
string | null
Время публикации решения (ISO 8601), или null, если отсутствует.
solutions[].snippet
string | null
Короткий фрагмент кода решения для предпросмотра, или null, если отсутствует.
solutions[].url
string | null
Публичный URL страницы отдельного решения, или null, если отсутствует.

Пример ответа

{
  "url": "https://exercism.org/tracks/ruby/exercises/two-fer/solutions",
  "track": {
    "title": "Ruby",
    "iconUrl": "https://assets.exercism.org/tracks/ruby.svg"
  },
  "exercise": {
    "title": "Two Fer",
    "iconUrl": "https://assets.exercism.org/exercises/two-fer.svg"
  },
  "page": 1,
  "totalPages": 412,
  "totalCount": 9876,
  "solutionCount": 2,
  "solutions": [
    {
      "uuid": "b3f2c1a0-9d8e-4f7a-8c6b-1a2b3c4d5e6f",
      "author": {
        "handle": "neilnorthrop",
        "avatarUrl": "https://avatars.exercism.org/u/12345",
        "flair": "insider"
      },
      "language": "ruby",
      "numStars": 42,
      "numComments": 3,
      "numViews": 1280,
      "numIterations": 2,
      "numLoc": 3,
      "isOutOfDate": false,
      "publishedAt": "2026-05-18T14:03:27Z",
      "snippet": "def two_fer(name = \"you\")\n  \"One for #{name}, one for me.\"\nend",
      "url": "https://exercism.org/tracks/ruby/exercises/two-fer/solutions/neilnorthrop"
    },
    {
      "uuid": "c4e3d2b1-0a9f-4e8b-9d7c-2b3c4d5e6f70",
      "author": {
        "handle": "erikschierboom",
        "avatarUrl": "https://avatars.exercism.org/u/67890",
        "flair": null
      },
      "language": "ruby",
      "numStars": 17,
      "numComments": 0,
      "numViews": 640,
      "numIterations": 1,
      "numLoc": 4,
      "isOutOfDate": false,
      "publishedAt": "2026-04-02T09:11:50Z",
      "snippet": "def two_fer(name = \"you\")\n  format(\"One for %s, one for me.\", name)\nend",
      "url": "https://exercism.org/tracks/ruby/exercises/two-fer/solutions/erikschierboom"
    }
  ]
}