テスト
10,000ページ
$3.75
$0.38/1Kページ
- 実際のURLで試す
- 最大のパックと同じAPI
- クレジットの有効期限なし
ユースケース · 監視 · /batch
生のHTMLを比較すると、広告やトークンが変わるたびにアラートが上がります。本文をMarkdownとして比較すれば、読者が気づく変化だけが検出されます:新しい価格、言い回しが変わった条項、新しく追加された変更履歴の項目です。
概要
ウェブページのコンテンツ変更を監視するには?
各ページをスケジュールに従って本文のMarkdownとして読み取り、テキストを保存し、前のバージョンと比較します。テキストが変わったときだけアラートを出します。WebReaderAPIは1回のバッチジョブで最大100 URLを読み取り、広告やメニューを除去して誤検知を防ぎ、2026年10月時点で$0.07/1Kページから1ページにつき1クレジットで課金します。KYC不要、暗号資産で支払い。
| エンドポイント | POST https://webreaderapi.com/api/v1/batch、次にGET https://webreaderapi.com/api/v1/jobs/{job_id} |
|---|---|
| バッチサイズ | バッチジョブあたり最大100 URL |
| 比較対象 | 広告、メニュー、バナーを除いた本文のMarkdown |
| 課金 | 1クレジット = ブラウザなしでページを1回読み取り。ページのJavaScriptレンダリングにブラウザが必要な場合は2クレジット。失敗したリクエスト、またはサイトのrobots.txtが拒否したリクエストは課金されません |
| ボリュームの例 | 1日に200ページをチェック = 1か月あたり約6,000ページ |
| 料金 | 10,000ページで$3.75。クレジットに有効期限はありません |
ビジネスに関わる文言が含まれ、予告なく変更されるページ:
リストは公開ページに限定してください。個人プロフィールやログインの背後にあるページは対象外です。
HTMLはコンテンツが変わらなくても常に変化するからです。ローテーションする広告、セッショントークン、フッターのタイムスタンプ、A/Bテストのマークアップにより、同じページを2回読み込むだけで差異が生まれます。HTMLのdiffはこうしたノイズをアラートにしてしまい、人はそのアラートを読まなくなります。
メインコンテンツのMarkdownは、比較する前にノイズの大部分を取り除きます。残るのは人が読むテキスト、つまり見出し、段落、リスト、表です。そのテキストのdiffは短く、読みやすく、アラートを出す価値があります。
import difflib
import json
import os
import pathlib
import time
import requests
API = "https://webreaderapi.com/api/v1"
HEADERS = {"Authorization": "Bearer " + os.environ["WEBREADER_API_KEY"]}
STORE = pathlib.Path("snapshots.json")
URLS = [
"https://example.com/pricing",
"https://example.com/legal/terms",
"https://example.com/changelog",
]
old = json.loads(STORE.read_text(encoding="utf-8")) if STORE.exists() else {}
job = requests.post(API + "/batch", headers=HEADERS, json={"urls": URLS}, timeout=60).json()
results, cursor, delay = [], None, 5
while True:
params = {"cursor": cursor} if cursor else {}
page = requests.get(API + "/jobs/" + job["job_id"], headers=HEADERS, params=params, timeout=60).json()
results += page.get("results", [])
cursor = page.get("next_cursor")
if page["status"] == "done" and not cursor:
break
if not cursor:
time.sleep(delay)
delay = min(delay * 2, 60)
new = dict(old)
for item in results:
if "markdown" not in item:
print("not read:", item["url"], item.get("error", {}).get("code"))
continue
before = old.get(item["url"], "")
if before and before != item["markdown"]:
diff = difflib.unified_diff(before.splitlines(), item["markdown"].splitlines(), lineterm="", n=0)
print("CHANGED:", item["url"])
print("\n".join(list(diff)[:40]))
new[item["url"]] = item["markdown"]
STORE.write_text(json.dumps(new, ensure_ascii=False), encoding="utf-8")
ページが現実的に変わる頻度でチェックし、それ以上は行わないでください。料金ページや変更履歴には毎日、ポリシーやドキュメントには週次が適しています。1時間ごとに読むページが1日1回の読み取りより多くのことを教えてくれることはほとんどなく、コストは24倍になります。
WebReaderAPIはすべてのページでrobots.txtに従い、クロールジョブではサイトのCrawl-delayを尊重します。サイトが許可していないページはスキップされ、課金されないため、厳格なサイトはレポートから外れるだけです。robotsを拒否するページへのアクセスが必要な場合は、サイト所有者に問い合わせてください。
チェック1回につき1ページ1クレジットです。2026年10月時点の価格での例:
ブラウザが必要なページは2クレジットを使用します。プレーンHTMLと分かっているページにはrender=falseを設定して、クレジットを1に抑えてください。
ページ数に1か月あたりのチェック回数を掛け、数か月持つパックを選んでください。クレジットは失効しません。
10,000ページ
$3.75
$0.38/1Kページ
50,000ページ
$14.25
$0.28/1Kページ
100,000ページ
$21.75
$0.22/1Kページ
すべてのプランに含まれるもの: 本文抽出 · 必要な場合はJavaScriptをレンダリング · 失敗・拒否されたページは課金なし · クレジットの有効期限なし
いいえ。ページを読み取ってMarkdownを返すのみです。スクリプトがバージョンを比較し、メール、チャット、チケットでアラートを送信します。上記のコードは変更された行を出力する出発点です。
HTMLではなくメインコンテンツのMarkdownを比較し、diffの前に「5分前に更新」など毎回の読み込みで変わる行を除去してください。ローテーションする要素のほとんどはメインコンテンツの抽出で既に取り除かれています。
はい。render=autoを使うと、JavaScriptなしでは空になるページがブラウザでレンダリングされ、2クレジットかかります。JavaScriptなしで動作するページは1クレジットのままです。
はい。バッチではなくクロールジョブを実行し、ページごとに比較してください。大規模なサイトでは、まずサイトマップのlastmodの日付を比較し、更新されたページだけを再読み取りしてください。
$0.07/1Kページから · KYC不要
APIキーを取得