ニュースクロールを構築する方法:ステップバイステップガイド
Lead Scraping Automation Engineer
TL;DR:
- ニュースクローラーは二つのループ:発見と取得。 セクションのフロントページから記事リンクを抽出し、その後各リンクを訪れて見出しと本文を抽出する。この二つのステージを別々に保持することで、それぞれを再実行し、ペースを調整し、独立してスケールさせることができる。
- 発見はリンクフィルタリングの問題です。 フロントページは主にナビゲーションであり、記事リンクは認識可能なURLの形(
/news/articles/…、idで終わるスラグ)に一致します。その代わりに、すべてのアンカーを取得するのではなく、それらにフィルタリングします。 - 抽出は読みやすいコアを意味し、DOM全体ではありません。
h1と記事の段落を読み込み、ナビゲーション、関連リンク、広告の部分をスキップします。段落の数とテキストの長さは、取得が実際にストーリーを得たかどうかを瞬時に教えてくれます。 - ニュースサイトは地理ルーティングとレート制限を行います。
proxyCountryを固定し、セクションスイープが途中でボット対策の制限に引っかからないようにクローリングのペースを調整します。 - 普通のPuppeteerを使用したScrapeless Scraping Browserで動作します。 クラウドブラウザはJSで構築されたフロントページをレンダリングし、住宅用のエグレスを提供します。あなたのクローラーコードは通常のナビゲーションと抽出です。
- 無料で始められます。 新しいScrapelessアカウントには無料のScraping Browserランタイムが含まれています — app.scrapeless.comでサインアップしてください。
はじめに:ニュースクローラーが実際に行うこと
ニュースクローラーはセクションのフロントページを構造化された記事のストリームに変換します。二つの異なる仕事を行います。まず、発見:フロントページ(またはセクション、またはサイトマップ)を読み、実際のストーリーを指すリンクを収集します。次に、取得:各ストーリーを訪問し、見出しと読みやすい本文を引き出し、ナビゲーションや広告の構造は排除します。
これらの二つのステージを分離して保持することが肝心です。発見はスイープごとに1回実行され、コストが低く、取得は記事ごとに1回実行され、実際の作業とレート制限のリスクがあります。これを分けることで、最初にクリーンなリンクリストを収集し、その後控制されたペースで取得し、フロントページを再クローリングすることなく単一の記事を再取得することが可能になります。
このガイドでは、Scrapeless Scraping Browser上でNodeを使ってクローラーを構築します — 標準のエンドポイントを介してPuppeteerに接続されたアンチ検出クラウドブラウザです。以下の発見と抽出のステップは、いずれもライブニュースソースに対して実行されました。公開コンテンツのみ。
それを使ってできること
- セクションをスイープ(世界、ビジネス、テクノロジー)して、その日の新しい記事を探す。
- クリーンな記事の本文を抽出 — 見出しと段落を分析や読み取りのパイプラインに使用する。
- 読みやすいテキストを要約器やRAGストアに供給し、生のHTMLではなくする。
- 定期的に再発見を行い、新しいリンクだけを取得してテーマを追跡。
- 同じクローラーを複数のメディアに向けてクロスソースを行う。
なぜScrapeless Scraping Browserか
Scrapeless Scraping Browserは、ウェブクローラーやAIエージェントのために設計されたカスタマイズ可能なアンチ検出クラウドブラウザです。ニュースクローラーに特化して、次のような利点があります:
- クラウド側のJSレンダリング — 現代のフロントページはJavaScriptでリンクリストを構築します;クラウドブラウザはそれを実行してリンクを存在させます。
- 195以上の国での住宅プロキシ — サイトが提供する地域にエグレスを設定し、セクションスイープが引き起こす可能性のあるレート制限を避けます。
- アンチ検出フィンガープリンティング — クローリングは実際のブラウザとして読み取られるため、記事ページは長時間の実行中もレンダリングを維持します。
- 標準のPuppeteer接続 —
Puppeteer.connect()は通常のBrowserを返します;発見と抽出は通常のPuppeteerです。 - セッションの持続性 — スイープ全体にわたって1つのセッションを温めておきます。
無料プランでAPIキーを取得するには、app.scrapeless.comを訪問してください。
前提条件
- Node.js 18以降
- ScrapelessアカウントとAPIキー — app.scrapeless.comでサインアップ
- Puppeteerの基本的な知識
インストール
bash
npm install @scrapeless-ai/sdk puppeteer-core
bash
export SCRAPELESS_API_KEY="your_api_token_here"
ステップ 1 — 接続
javascript
import { Puppeteer } from '@scrapeless-ai/sdk';
const browser = await Puppeteer.connect({
apiKey: process.env.SCRAPELESS_API_KEY,
sessionName: 'news-crawler',
proxyCountry: 'US',
sessionTTL: 300,
});
const page = await browser.newPage();
ステップ 2 — 記事リンクを発見
フロントページを読み込み、記事のように見えるリンクを収集します。適切なセレクタはサイトによって異なりますが、原則はどこでも同じです:記事を指すアンカーにフィルタリングします。ここでは、ニュースソースのフロントページからの最初の数件の見出しリンクを取得しています:
javascript
await page.goto('https://text.npr.org/', {
waitUntil: 'domcontentloaded',
timeout: 40000,
});
const links = await page.evaluate(() =>
[...document.querySelectorAll('ul li a')]
.map((a) => ({ title: a.textContent.trim(), href: a.href }))
.filter((l) => l.title),
);
javascript
console.log(links.length, 'リンク —', links[0]);
// 5 リンク — { title: '...', href: 'https://text.npr.org/<article-id>' }
ほとんどのアウトレットでは、フィルターを URL の形状に絞ります。たとえば、パスが /news/articles/ に一致するリンクや、長い数値 ID で終わるリンクを選択し、ナビゲーションやセクションのリンクを除外します:
javascript
const articleLinks = await page.evaluate(() =>
[...document.querySelectorAll('a[href]')]
.filter((a) => /\/news\/(articles\/|[a-z]+-\d{6,})/.test(a.getAttribute('href') || ''))
.map((a) => a.href),
);
ステップ 3 — 各記事を取得して抽出する
次に、各リンクを訪れ、読みやすいコア — h1 と本文の段落を取得します。段落数とテキストの長さは、リダイレクトやペイウォールのスタブではなく、ストーリーを取得したことを迅速に確認するためのチェックです:
javascript
async function fetchArticle(page, url) {
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 40000 });
return page.evaluate(() => ({
title: document.querySelector('h1')?.textContent?.trim(),
paragraphs: document.querySelectorAll('p').length,
text: [...document.querySelectorAll('p')].map((p) => p.textContent).join('\n\n'),
}));
}
const article = await fetchArticle(page, links[0].href);
console.log(article.title, '—', article.paragraphs, '段落');
// "アメリカとイランが戦争を終結させ、ホルムズ海峡を再開する合意を発表" — 40 段落
このライブ実行は、見出しリンクから 40 段落の記事(約 5,500 文字の本文テキスト)を返しました — 見出しと全文、ナビゲーションの chrome なし。
無料プランでの API キーを取得する: app.scrapeless.com
ステップ 4 — クロールを組み立てる
二つのステージを組み合わせます:一度発見し、その後各リンクを制御されたペースで取得します。seen セットを保ち、スケジュールされた再実行では新しいストーリーのみを取得します:
javascript
const seen = new Set();
const articles = [];
for (const url of articleLinks) {
if (seen.has(url)) continue;
seen.add(url);
try {
articles.push({ url, ...(await fetchArticle(page, url)) });
} catch {
// 表示されない記事はスキップ; スイープは続く
}
await new Promise((r) => setTimeout(r, 1000)); // クロールのペースを調整
}
await browser.close();
console.log(articles.length, '記事');
受け取るもの
各記事はフラットなレコードです — 見出しと読みやすい本文:
json
{
"url": "https://text.npr.org/nx-s1-5858590",
"title": "アメリカとイランが戦争を終結させ、ホルムズ海峡を再開する合意を発表",
"paragraphs": 40,
"text": "..."
}
// 示したサンプル — タイトル + 段落数は実際のキャプチャ; 本文テキストは省略。
いくつかの率直な観察:
- サイトごとに発見フィルターを厳しくする。 緩いアンカーの取得はナビゲーションやタグを引き寄せる; 記事の URL の形状に一致させる。
- 取得を検証する。 段落数がほぼゼロである場合は通常、リダイレクト、ペイウォール、または同意の壁を意味します — レコードを信頼する前に確認してください。
- スイープの間で重複を排除。 フロントページは同じストーリーを再リストする; URL に基づいてキーを設定する。
- ペースを調整し、固定する。 取得間に遅延を設け、固定の
proxyCountryを使うことで、セクションのスイープがレート制限に引っかかるのを防ぎます。
結論: 発見、取得、繰り返し
ニュースクロールは明確な二段階です — フロントページから記事リンクを発見し、次に各ストーリーの見出しと本文を取得して抽出します。これらを分けておくことで、クロールのペースを調整可能にし、再開可能で、スケジュールも簡単にできます。Scrapeless Scraping Browser で実行すると、JS で構築されたフロントページをレンダリングし、スイープがレート制限に引っかかるのを防ぐ住宅的エグレスを提供します。クロールの複数ページの側面については、ページネーションガイドを参照してください;Scraping Browser 製品ページとドキュメントは、完全な SDK の表面を網羅しています。発見のフィルターを厳しくし、各取得を検証し、スイープ間で重複を排除し、クロールのペースを調整してください。
AI を活用したデータパイプラインの構築の準備はできていますか?
ニュースやコンテンツパイプラインを構築している開発者とつながるために、コミュニティに参加して無料プランを取得してください:Discord · Telegram。
app.scrapeless.comにサインアップして無料の Scraping Browser 実行時間を取得し、上記のパターンをワークフローに必要なアウトレットやセクションに適応してください。スケールについては料金をご覧ください。
よくある質問
Q: ニュースサイトをクロールすることは合法ですか?
公開されているコンテンツの収集は一般的に許可されていますが、著作権と各サイトの利用規約が、保存や再公開に関して何が許可されるかを規定します。公開ページをクロールし、ロボット除外ルールや利用規約を尊重し、ご自身の利用ケースについて法律の専門家に相談してください。
Q: 記事リンクとナビゲーションをどのように分離しますか?
ページ上のすべてのリンクを取得するのではなく、サイトのアーティクルURLの形状(例:/news/articles/パスや長いIDで終わるスラッグ)にフィルターします。
Q: 記事が実際に取得されたかどうかはどうやって確認しますか?
段落数とテキストの長さを確認してください。ほぼゼロのカウントは、ストーリーではなくリダイレクト、ペイウォール、または同意壁を示します。
Q: プロキシは必要ですか?
持続的なクロールを行うには、必要です。proxyCountryをメディアがサービスを提供する地域に設定し、レート制限に引っかからないようにクロールのペースを調整します。
Q: 新しいストーリーのみをスケジュールで実行するにはどうすればいいですか?
URLの持続的なseenセットを保持し、指定した間隔で発見を再実行して、まだ記録していないリンクのみを取得します。
Q: AIエージェントなしでこれを実行できますか?
はい。Scrapelessセッション上の単純なPuppeteerで、エージェントは不要です。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



