Passer au contenu principal
Grâce à l’endpoint Olostep /v1/crawls, tu peux crawler un site web et obtenir le contenu de toutes les pages.
  • Crawler un site web et obtenir le contenu de toutes les sous-pages (ou limiter la profondeur du crawl)
  • Utiliser des motifs spéciaux pour crawler des pages spécifiques (par exemple, /blog/**)
  • Passer une webhook_url pour être notifié lorsque le crawl est terminé
  • Requête de recherche pour ne trouver que des pages spécifiques et trier par pertinence
Pour les détails de l’API, voir la Référence de l’API de l’Endpoint Crawl.

Installation

# pip install requests

import requests

Démarrer un crawl

Fournis l’URL de départ, inclus/exclus des globes d’URL, et max_pages. Optionnel : max_depth, include_external, include_subdomain, search_query, top_n, webhook_url, timeout.
import time, json

API_URL = 'https://api.olostep.com'
API_KEY = '<YOUR_API_KEY>'
HEADERS = { 
    'Content-Type': 'application/json',
    'Authorization': f'Bearer {API_KEY}' 
}

data = {
  "start_url": "https://sugarbooandco.com",
  "max_pages": 100,
  "include_urls": ["/**"],
  "exclude_urls": ["/collections/**"],
  "include_external": False
}

res = requests.post(f"{API_URL}/v1/crawls", headers=HEADERS, json=data)
crawl = res.json()
print(json.dumps(crawl, indent=2))
Puisque tout dans Olostep est un objet, tu recevras un objet crawl en réponse. L’objet crawl possède quelques propriétés comme id et status, que tu peux utiliser pour suivre le crawl.

Vérifier le statut du crawl

Interroger le crawl pour suivre la progression jusqu’à ce que le status soit completed.
import time

def get_crawl_info(crawl_id):
    return requests.get(f'{API_URL}/v1/crawls/{crawl_id}', headers=HEADERS).json()

crawl_id = crawl['id']
while True:
    info = get_crawl_info(crawl_id)
    print(info['status'], info.get('pages_count'))
    if info['status'] == 'completed':
        break
    time.sleep(5)
Alternativement, tu peux passer une webhook_url lors du démarrage du crawl pour être notifié lorsque le crawl est terminé.

Lister les pages (pagination/flux avec curseur)

Récupérer les pages et itérer en utilisant cursor et limit. Fonctionne pendant que le crawl est in_progress ou completed.
def get_pages(crawl_id, cursor=None, limit=10, search_query=None):
    params = { 
        'cursor': cursor, 
        'limit': limit
    }
    return requests.get(f'{API_URL}/v1/crawls/{crawl_id}/pages', headers=HEADERS, params=params).json()

cursor = 0
while True:
    page_batch = get_pages(crawl_id, cursor=cursor, limit=10)
    for page in page_batch['pages']:
        print(page['url'], page['retrieve_id'])
    if 'cursor' not in page_batch:
        break
    cursor = page_batch['cursor']
    time.sleep(5)

Requête de recherche (limiter aux N plus pertinents)

Utiliser search_query au début, et éventuellement filtrer la liste avec search_query. Limiter l’exploration par page avec top_n.
data = {
  "start_url": "https://sugarbooandco.com",
  "max_pages": 100,
  "include_urls": ["/**"],
  "search_query": "contact us",
  "top_n": 5
}
crawl = requests.post(f'{API_URL}/v1/crawls', headers=HEADERS, json=data).json()
pages = requests.get(f"{API_URL}/v1/crawls/{crawl['id']}/pages", headers=HEADERS, params={'search_query': 'contact us'}).json()
print(len(pages['pages']))

Récupérer le contenu

Utilise le retrieve_id de chaque page avec /v1/retrieve pour récupérer html_content et/ou markdown_content.
def retrieve_content(retrieve_id):
    return requests.get(f"{API_URL}/v1/retrieve", headers=HEADERS, params={"retrieve_id": retrieve_id}).json()

for page in get_pages(crawl['id'], limit=5)['pages']:
    retrieved = retrieve_content(page['retrieve_id'])
    print(retrieved.get('markdown_content'))

Remarques

  • La pagination est basée sur le curseur ; répéter les requêtes jusqu’à ce que le cursor soit absent.
  • Les champs de contenu sur /v1/crawls/{crawl_id}/pages sont obsolètes ; préférer /v1/retrieve.
  • Webhooks : définir webhook_url pour recevoir un POST lorsque le crawl est terminé.

Tarification

Le crawl coûte 1 crédit par page crawlée.