メインコンテンツへスキップ
Olostepの/v1/crawlsエンドポイントを通じて、ウェブサイトをクロールし、すべてのページからコンテンツを取得できます。
  • ウェブサイトをクロールし、すべてのサブページからコンテンツを取得(またはクロールの深さを制限)
  • 特定のページをクロールするための特別なパターンを使用(例:/blog/**
  • クロールが完了したときに通知を受け取るためにwebhook_urlを渡す
  • 特定のページを見つけるための検索クエリと関連性でソート
APIの詳細については、クロールエンドポイントAPIリファレンスを参照してください。

インストール

# pip install requests

import requests

クロールを開始する

開始URL、含める/除外するURLのグロブ、max_pagesを指定します。オプション:max_depthinclude_externalinclude_subdomainsearch_querytop_nwebhook_urltimeout
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))
Olostepではすべてがオブジェクトなので、レスポンスとしてcrawlオブジェクトを受け取ります。crawlオブジェクトには、idstatusなどのプロパティがあり、クロールを追跡するのに使用できます。

クロールのステータスを確認する

クロールをポーリングして進行状況を追跡し、statuscompletedになるまで確認します。
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)
または、クロールを開始する際にwebhook_urlを渡して、クロールが完了したときに通知を受け取ることもできます。

ページのリスト(カーソルでページネーション/ストリーム)

cursorlimitを使用してページを取得し、反復します。クロールがin_progressまたは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)

検索クエリ(関連性の高いトップNに制限)

開始時にsearch_queryを使用し、オプションでsearch_queryでリストをフィルタリングします。ページごとの探索を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']))

コンテンツの取得

各ページのretrieve_idを使用して、/v1/retrieveからhtml_contentmarkdown_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'))

注意事項

  • ページネーションはカーソルベースです。cursorがなくなるまでリクエストを繰り返します。
  • /v1/crawls/{crawl_id}/pagesのコンテンツフィールドは非推奨です。/v1/retrieveを使用してください。
  • Webhooks: クロールが完了したときにPOSTを受け取るためにwebhook_urlを設定します。

料金

クロールには、クロールされたページごとに1クレジットがかかります。