YouTube APIは1日100検索で止まります。Web Unlockerなら、依頼した検索ページをすべて返し、1ページに最大20本の動画が付いて、1,000ページで$0.98です。Google APIキーは不要です。
無料リクエスト1,000件 · 課金は成功時のみ · 195以上の国 · Claude対応
チームについて簡単にご記入いただくと、次の内容をお届けします。
Web UnlockerはYouTubeの検索結果ページを、最大20本の動画をすべて含めて1ページとして課金します。ApifyやBright DataのYouTubeスクレイパーは、その動画を1本ずつ別の行として課金します。
APIは1日100検索まで。
ここでは検索1,000件が$0.98です。
YouTubeと同じように、アップロード日や再生回数で検索を絞り込めます。フィルターごとに、同じ料金でページが1つ増えます。
動画20本ずつの検索1,000件の料金
検索結果1,000ページと動画20,000本、公開価格で
SerpApiは検索ごとに課金します。Bright Dataは動画を1件のレコードとして課金し、1,000件あたり$1.50です。Apifyで最も使われているYouTubeスクレイパーは動画ごとに課金し、1,000本あたり$2.40〜$4.00です。
YouTube Data APIは1日100検索を使い切るまで無料で、YouTubeスクレイパーは動画ごとに課金します。同じ1,000検索を取得する場合に、各方法で必要になるものは次のとおりです。
| 必要なもの | YouTube Data API | Apify | SerpApi | |
|---|---|---|---|---|
| 1日の検索数 | 上限なし | 100 | 上限なし | プランによる |
| 課金の対象 | 1ページ | クォータ内は無料 | 動画ごと | 検索ごと |
| 動画20本付きの検索1,000件 | $0.98 | クォータ10日分 | $48〜$80 | $25 |
| あらゆる動画の文字起こし | Cloud Browserで対応 | 自分の動画のみ | あり | なし |
| Googleプロジェクトなしで開始 | あり | なし | あり | あり |
| ページ全体をHTMLで | あり | なし | なし | なし |
YouTube以外もスクレイピングしますか?Web Unlockerなら、どのページも同じ方法、同じ料金で返します。
チャンネルのアップロード再生リストは、最初のページに動画100本が並び、次のページごとにさらに78本が加わります。Web Unlockerは各ページを1回だけ課金します。10ページ、802本、$0.0098です。
Apifyは動画1,000本あたり$2.40〜$4.00を課金します。
ここでは800本が1セントです。
YouTubeは、ページ上のすべての動画をHTMLの中にJSONとして持っています。Web UnlockerがそのHTMLを返し、数行のコードで動画を読み取れます。
上のフォームにご記入ください。キーは1営業日以内にメールで届きます。
キーワードなら検索、数値を見るなら動画、すべての動画ならチャンネルのアップロードを選びます。
ページ上の各動画に、タイトル、再生回数、チャンネル、日付、長さが付いています。
pip install requestsGOLOGIN_SCRAPING_API_KEY=your_key python youtube_search.pyhttps://parsing.webunlocker.gologin.com/v1/scrapeimport json
import os
import time
from urllib.parse import quote_plus
import requests
search = "home espresso"
def scrape(url):
for attempt in range(3):
response = requests.get(
"https://parsing.webunlocker.gologin.com/v1/scrape",
params={"url": url, "geo": "us", "format": "json"},
headers={"apikey": os.environ["GOLOGIN_SCRAPING_API_KEY"]},
timeout=90,
)
page = response.json().get("data", {}).get("html", "") if response.ok else ""
if '"videoRenderer"' in page:
return page
time.sleep(5)
raise RuntimeError("No videos came back, try again later")
def find(node, key):
if isinstance(node, dict):
for name, value in node.items():
if name == key:
yield value
yield from find(value, key)
elif isinstance(node, list):
for item in node:
yield from find(item, key)
def text(field):
if not field:
return None
return field.get("simpleText") or "".join(run["text"] for run in field.get("runs", []))
page = scrape(f"https://www.youtube.com/results?search_query={quote_plus(search)}")
data = json.loads(page.split("var ytInitialData = ")[1].split(";</script>")[0])
videos = {}
for video in find(data, "videoRenderer"):
videos[video["videoId"]] = {
"title": text(video.get("title")),
"url": f"https://www.youtube.com/watch?v={video['videoId']}",
"channel": text(video.get("ownerText")),
"views": text(video.get("viewCountText")),
"published": text(video.get("publishedTimeText")),
"length": text(video.get("lengthText")),
}
print(json.dumps(list(videos.values()), indent=2, ensure_ascii=False))
print(f"{len(videos)} videos from one search page")GOLOGIN_SCRAPING_API_KEY=your_key node youtube-channel.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeconst channelId = 'UCBJycsmduvYEL83R_U4JriQ';
const wanted = 800;
const uploads = `UU${channelId.slice(2)}`;
async function scrape(url) {
for (let attempt = 1; attempt <= 3; attempt++) {
const params = new URLSearchParams({ url, geo: 'us', format: 'json' });
const response = await fetch(`https://parsing.webunlocker.gologin.com/v1/scrape?${params}`, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
});
const page = response.ok ? (await response.json()).data?.html : '';
if (page?.includes('var ytInitialData = ')) return JSON.parse(page.split('var ytInitialData = ')[1].split(';</script>')[0]);
await new Promise((resolve) => setTimeout(resolve, 5000));
}
throw new Error('The page came back without videos, try again later');
}
function* find(node, key) {
if (Array.isArray(node)) for (const item of node) yield* find(item, key);
else if (node && typeof node === 'object') {
for (const [name, value] of Object.entries(node)) {
if (name === key) yield value;
yield* find(value, key);
}
}
}
const videos = new Map();
for (const item of find(await scrape(`https://www.youtube.com/playlist?list=${uploads}`), 'lockupViewModel')) {
if (item.contentType === 'LOCKUP_CONTENT_TYPE_VIDEO') videos.set(item.contentId, item.metadata.lockupMetadataViewModel.title.content);
}
let pages = 1;
while (videos.size < wanted) {
const last = [...videos.keys()].at(-1);
const before = videos.size;
for (const item of find(await scrape(`https://www.youtube.com/watch?v=${last}&list=${uploads}`), 'playlistPanelVideoRenderer')) {
videos.set(item.videoId, item.title.simpleText);
}
pages++;
if (videos.size === before) break;
}
console.table([...videos].slice(0, 5).map(([id, title]) => ({ title, url: `https://www.youtube.com/watch?v=${id}` })));
console.log(`${videos.size} videos in ${pages} pages: $${(pages * 0.00098).toFixed(4)} on the Growth plan`);GOLOGIN_SCRAPING_API_KEY=your_key node youtube-video.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeconst video = 'https://www.youtube.com/watch?v=jNQXAC9IVRw';
async function scrape(url) {
for (let attempt = 1; attempt <= 3; attempt++) {
const params = new URLSearchParams({ url, geo: 'us', format: 'json' });
const response = await fetch(`https://parsing.webunlocker.gologin.com/v1/scrape?${params}`, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
});
const page = response.ok ? (await response.json()).data?.html : '';
if (page?.includes('var ytInitialPlayerResponse = ')) return page;
await new Promise((resolve) => setTimeout(resolve, 5000));
}
throw new Error('The video page came back empty, try again later');
}
const page = await scrape(video);
const player = JSON.parse(page.split('var ytInitialPlayerResponse = ')[1].split(';var meta')[0]);
const { videoDetails: details, microformat, captions } = player;
console.log({
title: details.title,
channel: details.author,
views: Number(details.viewCount),
likes: Number(page.match(/along with ([\d,]+) other/)?.[1].replaceAll(',', '')),
comments: page.match(/"contextualInfo":\{"runs":\[\{"text":"([^"]+)"/)?.[1],
published: microformat.playerMicroformatRenderer.publishDate,
seconds: Number(details.lengthSeconds),
tags: details.keywords ?? [],
captions: captions?.playerCaptionsTracklistRenderer.captionTracks.map((track) => track.languageCode) ?? [],
});ご自身の検索で実行しますか?APIキーと無料リクエストを入手しましょう。
Web UnlockerはYouTubeが最初に送るとおりのページを返します。コメントはスクロールしたときだけ、文字起こしはクリックしたときだけ読み込まれます。Cloud Browserは、スクロールとクリックを代わりに行うアドオンで、ブラウザ50時間が月$4.50からです。
動画1,000本からそれぞれコメント100件を取得して$6.95:ブラウザ8.3時間とトラフィック6.2 GB。同じ取得でApifyは$30〜$200です。
YouTube APIで文字起こしを取得できるのは自分の動画のみで、サーバーからのリクエストには空のファイルが返ります。Cloud Browserは視聴者と同じように文字起こしを開き、25秒で取得します。
各セッションは、選んだ国のレジデンシャルIPで動作します。プランを超えたトラフィックは$1/GBです。
Playwright、PuppeteerまたはClaudeから実行できます。Cloud Browserを見る。
1つのアカウント、1つのプロキシネットワーク、1つのエコシステム。用途に合った製品をお選びください。
ほかのサイトもスクレイピングしますか?Reddit、Google Maps、Amazonのスクレイパー、またはすべてのWebスクレイピングツールをご覧ください。
はい。Web UnlockerはYouTubeスクレイパーAPIです。検索、動画、チャンネルのアップロードを送ると、本物のブラウザでページを読み込み、YouTubeがページ内に持つデータ(タイトル、再生回数、チャンネル、日付、長さ)とともに返します。1,000ページで$0.98で、上のコードがそれを読み取ります。
はい。YouTubeの動画ページからは、正確な再生回数、高評価、コメント数、説明、タグ、公開日、字幕の言語のほか、関連動画20本が取得でき、課金は1ページ分です。上の「動画データ」タブがそれを読み取ります。
キーワードを付けてyoutube.com/resultsを送ります。1ページで最大20本の動画と最大25本のShortsが、それぞれ再生回数、チャンネル、公開時期、長さ付きで返り、課金は1ページ分です。アップロード日や再生回数などYouTube自身のフィルターを加えると、別の結果が得られます。
既定ではプロジェクトごとに1日100回の検索コールで、1回あたり最大50件の結果です。それ以上にはクォータの申請とGoogleの審査が必要です。Web Unlockerに1日の上限はなく、ページ単位の課金で1,000ページ$0.98です。
はい、クォータの範囲内なら無料です。ほとんどのコールで1日10,000ユニット、それに検索100回が含まれます。それを超えると、Googleはプロジェクトの審査後にのみクォータを引き上げます。
はい。検索、動画、チャンネルのページは、ログインなしで読み込める公開ページです。Web Unlockerは訪問者のブラウザと同じ見え方でページを返すため、Googleプロジェクトも、APIキーも不要です。
チャンネルのアップロード再生リストを開きます。最初のページには動画100本が再生回数と公開時期付きで並びます。次に、その再生リストの最後の動画を開くと、そのようなページごとにさらに78本が並びます。10ページで802本、費用は1セントです。
YouTubeはスクロールに合わせてコメントを読み込むため、Web Unlockerはコメントを返しません。Cloud Browserが動画をスクロールします。コメント100件が26秒で、動画1,000本からそれぞれ100件を取得して$6.95です。
はい、Cloud Browserで可能です。YouTube APIで文字起こしを取得できるのは自分の動画のみで、サーバーからのリクエストには空のファイルが返ります。Cloud Browserは視聴者と同じように文字起こしを開き、1本あたり25秒です。
requestsライブラリで検索のアドレスをWeb Unlockerに送り、ページから動画を読み取ります。上のPythonタブは完全なスクリプトで、実際のAPIでテスト済みです。
はい。検索ページからは最大25本のShortsがタイトルと再生回数付きで取得でき、チャンネルのShortsタブには48本が並び、Short自身のページには高評価、コメント数、日付があります。
Web Unlockerが返すのは表ではなくページなので、取得前に何も削られません。CSVへの変換は数行のコードか、1回のプロンプトで済みます。Gologin scraping skillを使ってページをClaudeに渡し、CSVを依頼してください。
1,000ページあたり$0.98で、どのページも同じ料金です。動画20本までの検索は1ページ、数値付きの動画も1ページです。読み込みに失敗したページは無料です。プランは50,000リクエストで月$49からです。
はい、まずは無料で試せます。Web Unlockerには1,000件の無料リクエストが付き、検索1,000件または動画1,000本に相当します。
目的によります。YouTube APIは1日100検索まで無料です。ApifyとBright Dataは完成した行を提供し、すべての動画に課金します。Web Unlockerはページ全体を1つの料金で返すため、動画20本でも1本でも料金は同じです。
検索、動画、チャンネルのページは、ログインなしで読み込める公開ページです。Web Unlockerは訪問者のブラウザと同じようにページを読み込んで返します。何を収集し、どう使うかはお客様の判断ですので、プロジェクトに適用されるルールに照らして確認してください。
チームについて簡単にご記入いただくと、次の内容をお届けします。