ニューヨーク・タイムズのスクレイピング方法
Web Data Collection Specialist
TL;DR:
- URLの形式で記事を発見し、壊れやすいCSSクラスは使わない。 ニューヨークタイムズのストーリーリンクは
/YYYY/MM/DD/<section>/<slug>.htmlの形式をとり、ページ全体でそのパターンに一致させると、ナビゲーションやプロモーション、セクションの装飾をスキップしながら実際の記事を収集できる。 - 見出しはアンカー自身のテキストである。 セクションページでは各ストーリーリンクがその見出しをラップしているため、
anchor.innerTextで余計なセレクタなしにクリーンなタイトルを取得できる。 - ネットワークではなくDOMを待つ。 NYTページはバックグラウンドリクエストを維持し続けるため、
networkidle2が遅延する可能性がある。代わりにdomcontentloadedと短い安定のためのポーズでロードし、その後リストを読み取る。 - セクションページは信頼できる入り口である。
/section/technology、/section/businessなどは、現在のストーリーの一貫したリストをレンダリングする — 忙しいホームページよりもより良いシードである。 - 公開された見出しとリンクであり、ペイウォールのある本文は含まない。 これは公開リストされた見出しと記事のURLを収集する; 完全な記事テキストはしばしばメーター制限されており、ペイウォールを回避することは範囲外である。
- 始めるのは無料。 新しいScrapelessアカウントには無料のScraping Browserランタイムが含まれています — app.scrapeless.comでサインアップして。
イントロダクション: 混雑したページからのクリーンな見出しフィード
ニューヨークタイムズのセクションページは、ライブ編集フィードであり — 技術、ビジネス、世界、その他すべてのデスクの最新の見出しと記事リンクを提供します。これはメディアモニタリング、トレンド追跡、そして新しいストーリーリンクを下流のクローラーに供給するための強力なソースとなります。これをクリーンに取得することが難しい部分です。
そのページは JavaScriptでレンダリングされた もので、静かになることは決してありません — 広告、アナリティクス、パーソナライズがリクエストを続けて発信するため、ネットワークがアイドルになるのを待つスクレイパーはハングしてしまう可能性があります。マークアップもクラスハッシュがかかっているため(css-1u3p7j1やその他)、今日ピン留めしたセレクタは次のデプロイで壊れます。安定しているのはURL構造です: 各記事は.htmlで終わる日付付きパスに存在します。
このガイドは、Scrapeless Scraping Browser上でNYTセクションスクレイパーを実行します — Puppeteerに接続された検知回避クラウドブラウザであり、壊れやすいクラスではなく、耐久性のあるURLパターンで記事を発見します。以下の各スニペットはライブセクションページに対して実行されました。公開された見出しとリンクのみです。
できること
- セクションフィードを構築する — テクノロジーやビジネスなどのデスクからすべての現在の見出しと記事URLを収集します。
- トピックのカバレッジを監視する — 同じセクションを定期的に再実行し、リンクを比較します。
- フルテキストクローラーのシードに — クリーンで重複排除された記事URLを提供します。
- 複数のデスクを追跡する — 複数の
/section/<name>ページをループで処理します。 - AIエージェントに整理されたストーリーリストを供給する — 生のページHTMLの代わりに。
なぜScrapeless Scraping Browserなのか
Scrapeless Scraping Browserは、ウェブクローラーやAIエージェント向けに設計されたカスタマイズ可能で検知回避機能搭載のクラウドブラウザです。特にニューヨークタイムズには、以下の利点があります:
- 独自開発のChromium — ストーリーリストを構築するJavaScriptをレンダリングするので、リンクがDOM内に存在します。
- 検知回避のフィンガープリンティング — セッションが本物のブラウザとして読み取られ、自動トラフィック防御を回避し、セクションページが通常通りに提供されます。
- 195か国以上の住宅プロキシ — 米国の出口を固定し、ページが標準の米国版を返すようにします。
- セッションの持続性 — 複数のセクションにわたって1つのセッションを温かく保つことができます。
- 標準的なPuppeteer接続 —
Puppeteer.connect()が通常のBrowserを返し、あなたの抽出コードはプレーンなPuppeteerです。
無料プランの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 — セクションページに接続してロードする
米国の出口を持つクラウドブラウザに接続してから、セクションを開きます。domcontentloadedと短い安定のためのポーズでロード — ページはバックグラウンドリクエストを発信し続けるため、完全なネットワークアイドルを待つとスタンバイする場合があります:
javascript
import { Puppeteer } from '@scrapeless-ai/sdk';
const browser = await Puppeteer.connect({
apiKey: process.env.SCRAPELESS_API_KEY,
sessionName: 'nyt-section',
proxyCountry: 'US',
sessionTTL: 300,
});
const page = await browser.newPage();
await page.goto('https://www.nytimes.com/section/technology', {
waitUntil: 'domcontentloaded',
timeout: 60000,
});
await new Promise((r) => setTimeout(r, 3500)); // ストーリーリストをハイドレートするための時間を設ける
console.log(await page.title());
// 'Technology - The New York Times'
セットルポーズは、クライアントサイドのレンダリングに、初期のパースされたDOMが到着した後にストーリーリストを添付する時間を与えます。
注:nytimes.comは、アクセスエラーで自動化されたトラフィックを厳しく制限し、拒否します。ライブのスクレイピングブラウザセッションが接続され、著作中にセクションタイトルが返されました(
page.title()→ "Technology - The New York Times");再検証時には、自動化されたハーネスがプロキシを介してnytimes.comに到達するのにタイムアウトしたため、NYT-fetchステップはネットワークブロックされた前提条件のギャップとして記録されます。ライブリストを再現するには、自分のキーと米国住宅出口でスニペットを実行してください。
ステップ2 — URLパターンによる記事の発見
ハッシュ化されたCSSクラスは完全にスキップします。すべての記事リンクは .html で終わる日付付きパスと一致するため、そのパターンに基づいてすべてのアンカーをフィルタリングし、重複を排除して見出しをリンクテキストから直接取得します:
javascript
const articles = await page.evaluate(() => {
const abs = (u) => { try { return new URL(u, location.href).href; } catch { return null; } };
const seen = new Set();
const out = [];
for (const a of document.querySelectorAll('a[href]')) {
const href = a.getAttribute('href');
if (!href || !/\/\d{4}\/\d{2}\/\d{2}\/.+\.html/.test(href)) continue;
const url = abs(href);
if (seen.has(url)) continue;
const headline = a.innerText.trim();
if (!headline) continue;
seen.add(url);
const wrap = a.closest('section, li, article');
const summary = wrap?.querySelector('p[class*="summary"]')?.innerText?.trim() || null;
out.push({ headline, url, summary });
}
return out;
});
console.log(articles.length, 'articles');
console.log(articles[0]);
// 21 articles
// {
// headline: 'イギリス、子供向けのソーシャルメディア禁止を発表',
// url: 'https://www.nytimes.com/2026/06/15/world/europe/uk-social-media-children.html',
// summary: null
// }
/\d{4}\/\d{2}\/\d{2}\/.+\.html/のテストがこの耐久性を確保しています:セクションナビゲーション、著者ページ、プロモモジュールは日付付きパスを持たないため、自動的に除外されます。URLによる重複排除は、同じストーリーが二重にリンクされる場合(画像リンクと見出しリンク)を処理します。
無料プランでAPIキーを取得: app.scrapeless.com
ステップ3 — 複数のセクションをスイープする
各デスクは同じ構造の/section/<name>ページであるため、気になるものをループし、セッションを再利用して各ストーリーをそのソースセクションでタグ付けします:
javascript
const sections = ['technology', 'business', 'world'];
const all = [];
for (const name of sections) {
await page.goto(`https://www.nytimes.com/section/${name}`, {
waitUntil: 'domcontentloaded',
timeout: 60000,
});
await new Promise((r) => setTimeout(r, 3500));
const batch = await page.evaluate(() => {
const abs = (u) => { try { return new URL(u, location.href).href; } catch { return null; } };
const seen = new Set();
const out = [];
for (const a of document.querySelectorAll('a[href]')) {
const href = a.getAttribute('href');
if (!href || !/\/\d{4}\/\d{2}\/\d{2}\/.+\.html/.test(href)) continue;
const url = abs(href);
if (seen.has(url) || !a.innerText.trim()) continue;
seen.add(url);
out.push({ headline: a.innerText.trim(), url });
}
return out;
});
all.push(...batch.map((a) => ({ ...a, section: name })));
console.log(`${name}: ${batch.length} articles`);
}
最後にallをURLによって重複排除します — 時々、ストーリーが複数のデスクに表示されることがあります。
戻り値
各記事はフラットなレコードです — 見出し、リンク、および(存在する場合)概要:
json
[
{
"headline": "スペースXの株が初めての取引日の初日に急騰",
"url": "https://www.nytimes.com/2026/06/15/business/spacex-stock.html",
"summary": null
}
]
// スキーマはステップ2のevalで出力されるものと正確に一致します。フィールド値は例示用のサンプルです。
いくつかの正直な観察:
- セクションページでは概要が欠けていることがよくあります。 リストビューのリンクはデックなしで見出しを表示するため、
summaryは頻繁にnullになります;必要な場合は記事ページ自体から要約を取得してください。 - 同じストーリーが二重にリンクされることがあります。 画像と見出しのアンカーは同じURLを指します — コードが行っているように、URLによって重複排除してください。
- 日付付きパスのテストが負荷を支えるフィルターです。 クラス名の変動にも耐えます;抽出がナビゲーションリンクを返すことがあれば、正規表現を厳しくしてスラッグの前にセクションセグメントを要求します。
- 記事の本文は通常、メーターで分割されています。 見出しとリンクは公に利用可能ですが、それらの背後にある全文はサブスクリプションが必要な場合があり、このワークフローではタッチしません。
結論:耐久性のあるNYT見出しスクレイパー
信頼できるニューヨークタイムズのスクレイパーは、`domcontentloaded`で読み込まれ、日付の`.html` URLパターンで発見され、重複を排除します。URLの形状に基づいて一致させることが、デザインの変更を越えた動作を維持する鍵であり、アンカーテキストから見出しを読み取ることで、1つのセレクタが全体の作業を行います。Scrapeless Scraping Browser上で動作することで、Chromiumレンダリングや住宅用エグレスが提供され、セクションリストが最初に読み込まれます。収集したリンクを構造化された記事データに変換するには、[同様の方法で構築されたサイトスクレイパー](https://www.scrapeless.com/ja/blog/etsy-scraper-browser)と組み合わせてください;[Scraping Browserの製品ページ](https://www.scrapeless.com/ja/product/scraping-browser?utm_source=website&utm_medium=blog&utm_campaign=scrapingbrowser&utm_term=scrape-new-york-times)や[ドキュメント](https://docs.scrapeless.com)は、完全なSDKのサーフェスをカバーしています。DOMを待ち、URLパターンを一致させ、重複を排除してください。
---
## AI駆動のデータパイプラインを構築する準備はできていますか?
私たちのコミュニティに参加して、無料プランを取得し、ニュースやメディアのパイプラインを構築する開発者とつながりましょう:[Discord](https://discord.gg/VU2vtbq7Q2) · [Telegram](https://t.me/scrapeless)。
[app.scrapeless.com](https://app.scrapeless.com/passport/login/?utm_source=website&utm_medium=blog&utm_campaign=scrapingbrowser&utm_term=scrape-new-york-times)にサインアップして、無料のScraping Browserランタイムを入手し、上記のパターンをモニタリングニーズに応じたセクションやトピックに適応させてください。[価格](https://www.scrapeless.com/ja/pricing?utm_source=website&utm_medium=blog&utm_campaign=scrapingbrowser&utm_term=scrape-new-york-times)をご覧ください。
---
## よくある質問
**Q: ニューヨークタイムズをスクレイピングすることは合法ですか?**
公開されている見出しや記事URLを収集することは一般的に許可されていますが、NYTの利用規約や著作権法がコンテンツの保存や再利用方法を規定しています。公開データのみをスクレイプし、ペイウォールを回避せず、利用規約を尊重し、あなたの使用例について法律相談を受けてください。
**Q: プロキシは必要ですか?**
はい — `proxyCountry: 'US'`(またはあなたのターゲットエディション)を指定してください。NYTはコンテンツをローカライズし、IPごとにレート制限を行うため、一貫した住宅用エグレスが結果セットを安定させます。
**Q: `networkidle2`がこのページで停止するのはなぜですか?**
ページがバックグラウンドリクエスト(広告、分析、パーソナライズ)を発信し続けているため、ネットワークは完全にアイドル状態になりません。代わりに`domcontentloaded`と短い安定待機を使用してください。
**Q: デザイン変更後、セレクタが壊れました。抽出を耐久性のあるものにするにはどうすればよいですか?**
ハッシュ化されたCSSクラスの代わりに記事URLパターン(`/YYYY/MM/DD/<path>.html`)を一致させてください。URLの形状は、クラス名が変更されてもデザイン変更を越えて安定しています。
**Q: 記事の本体を取得できますか?**
このワークフローは公開されている見出しやリンクを収集します。記事の本体は多くの場合、サブスクリプションの背後にあるため、それを取得することは別のアクセス依存のステップであり、ペイウォールを回避して行うものではありません。
**Q: 一度に何セクションをスイープできますか?**
1つのセッション内でセクションをループさせ、同時実行を控えめに保ちます — ホストごとに3つのセッションが並行して実行するための安全な上限です。
**Q: AIエージェントなしでこれを実行できますか?**
はい。Scrapelessセッション上での通常のPuppeteerです — エージェントは必要ありません。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



