ウェブスクレイピングにおけるページネーションの扱い方:すべてのタイプの説明
Expert in Web Scraping Technologies
TL;DR:
- ページネーションのタイプは4つあり、それぞれに終了条件があります。 次へボタン、番号付きページ、「もっと読み込む」、無限スクロール — 終了条件を間違えるとページを見逃したり、無限ループに陥ったりします。
- サイトの「次へ」リンクに従い、URLを推測しないでください。
li.next aを読み取り、ページごとに従うことで、?page=Nループが静かにスキップするギャップや不規則な番号付けを乗り越えられます。 - 無限スクロールはページの成長が止まったときに終了します。 スクロールし、待ち、
scrollHeightを比較します — 増加が止まったら終わりに達しています。それが信頼できる唯一の信号です。 - ページネーションではレートリミットがかかります。 一つのIPから数十ページを巡るのは、まさにアンチボットシステムが監視するパターンです。住宅用出口と本物のブラウザーを使用することで、クリーンに実行できます。
- すべてはScrapeless Scraping Browserを使ってPuppeteerで実行されます。 セッションを作成し、ナビゲートし、抽出し、進める — クラウドブラウザーがレンダリングと検出防止を処理し、ページが読み込まれ続けます。
- 無料で始められます。 新しいScrapelessアカウントには無料のScraping Browserランタイムが含まれます — app.scrapeless.comでサインアップしてください。
はじめに: ページネーションはスクレイパーを壊す部分です
1ページをスクレイピングするのは簡単です。しかし、すべてのページをスクレイピングするのは、多くのスクレイパーが静かに失敗する場所です — 彼らはページ1を取得して停止するか、空のページを取得しながら終端を過ぎてループするか、アンチボット防御によるレートリミットに引っかかることがあります。その理由は、「ページネーション」が単一のものではないからです。サイトは4つのメカニズムのいずれかを使用しており、それぞれ異なる進め方と、終了を知るための異なる方法が必要です。
タイプを正しく認識すれば、残りは機械的です: 現在のページを抽出し、前方への道を見つけ、終了条件に達するまで繰り返します。間違えてしまうと — サイトが「もっと読み込む」ボタンを使用しているときに?page=Nを仮定したり、新しいコンテンツを待つのではなく固定の時間だけ眠ることにしたりして — エラーの通知なしにデータを失います。
このガイドでは4つのタイプをすべてカバーし、Puppeteerに接続された検出防止クラウドブラウザーScrapeless Scraping Browserで実行します。以下の次へボタンを使った手順は、ライブのページネーションサイトに対して行われ、他のパターンも同じループの形状を共有します。
4つのページネーションタイプ
| タイプ | あなたの進め方 | 終了条件 |
|---|---|---|
| 次へボタン | nextリンクのhrefに従う |
次のリンクがなくなる |
| 番号付きページ | ?page=Nを構築するか、最大の番号を読む |
Nが最後のページを超える |
| もっと読み込む | 「もっと読み込む」ボタンをクリックする | ボタンが消える |
| 無限スクロール | 一番下までスクロールする | scrollHeightの増加が止まる |
最も一般的な間違いは、次へボタンまたはもっと読み込むサイトをあたかもきれいな番号付きのURLを持つかのように扱うことです。URLを構築するのではなく、サイト自身のコントロールに従うことで、番号にギャップがあっても正確性を保つことができます。
なぜScrapeless Scraping Browserなのか
Scrapeless Scraping Browserは、ウェブクローラーとAIエージェントのために設計されたカスタマイズ可能で検出防止機能を持つクラウドブラウザーです。特に複数ページのクローリングには、次の利点があります。
- 標準のPuppeteer接続 —
Puppeteer.connect()は通常のBrowserを返すため、ナビゲーションおよび抽出コードは変更されません。 - 195ヵ国以上の住宅用プロキシ — IPの評判の影響を受けずに多くのページを巡回します。
- 検出防止のフィンガープリンティング — 長時間のクローリングが本物のブラウザーとして読み取られるため、後のページがレンダリングされ続けます。
- クラウド側JSレンダリング — JavaScriptによって構築されたもっと読み込むコンテンツや無限スクロールコンテンツが実際に表示されます。
- セッションの持続性 — クローリング全体でクッキーを温かく保ちます。
無料プランでAPIキーを取得するには、app.scrapeless.comを訪れてください。
前提条件
- Node.js 18またはそれ以降のバージョン
- ScrapelessアカウントとAPIキー — app.scrapeless.comでサインアップ
- PuppeteerとページDOMおよびセレクタの基本的な理解
インストール
bash
npm install @scrapeless-ai/sdk puppeteer-core
bash
export SCRAPELESS_API_KEY="your_api_token_here"
接続
javascript
import { Puppeteer } from '@scrapeless-ai/sdk';
const browser = await Puppeteer.connect({
apiKey: process.env.SCRAPELESS_API_KEY,
sessionName: 'pagination',
proxyCountry: 'US',
sessionTTL: 300,
});
const page = await browser.newPage();
タイプ1 — 次へボタン (最も堅実)
サイトの「次へ」リンクに従い、それがなくなるまで続けます。これは番号にギャップがあっても生き残ります — URLを構築しないからです — サイトが提供するものを読み取るだけです:
javascript
const BASE = 'https://quotes.toscrape.com';
let url = `${BASE}/page/1/`;
const items = [];
let pages = 0;
while (url) {
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
pages++;
const pageItems = await page.evaluate(() =>
以下のテキストの翻訳です:
[...]document.querySelectorAll('.quote .text')].map((q) => q.textContent),
);
items.push(...pageItems);
// 次のリンクを読む;最後のページにいるときはnull
const next = await page.evaluate(() => {
const a = document.querySelector('li.next a');
return a ? a.getAttribute('href') : null;
});
url = next ? new URL(next, BASE).href : null;
}
console.log(pages, 'ページ,', items.length, 'アイテム');
// 10ページ、100アイテム
ループは自然に終了します。「li.next a」が存在しなくなるとき - ページ数の推測は不要、オフバイワンの心配もありません。
無料プランのAPIキーを取得してください:app.scrapeless.com
タイプ2 — 番号付きページ
サイトがクリーンな番号付きURLと目に見える最後のページを公開している場合は、最高ページ番号を一度読み取り、その後繰り返します。それでも、推測するのではなく、最後のページリンクを読む方が好ましいです:
javascript
await page.goto(`${BASE}/page/1/`, { waitUntil: 'domcontentloaded' });
// 例:最後のページリンクを読み取り、それが存在しない場合はページが何も返さないまで進めます
for (let n = 1; ; n++) {
await page.goto(`${BASE}/page/${n}/`, { waitUntil: 'domcontentloaded' });
const count = await page.evaluate(() => document.querySelectorAll('.quote').length);
if (count === 0) break; // 空のページ = 終了の先
// ...抽出
}
空のページチェックは安全ネットです:たとえ最後のページ番号を誤って判断しても、アイテムが返されないページがあったときに停止します。
タイプ3 — もっと読み込むボタン
コンテンツは1ページで、ボタンがもっと追加します。ボタンがなくなるまでクリックし、クリックの間に新しいアイテムを待ちます:
javascript
await page.goto(TARGET, { waitUntil: 'domcontentloaded' });
while (true) {
const before = await page.evaluate(() => document.querySelectorAll('.item').length);
const btn = await page.$('button.load-more');
if (!btn) break; // もうボタンがない = 終了
await btn.click();
await page.waitForFunction(
(n) => document.querySelectorAll('.item').length > n,
{},
before,
); // 固定のスリープではなく新しいアイテムを待つ
}
アイテム数が増えるのを待つこと — 固定の遅延ではなく — これにより遅いレスポンスでも信頼性が高まります。
タイプ4 — 無限スクロール
新しいアイテムはスクロールすることで読み込まれます。スクロールして待機し、ページの高さが増えなくなったら停止します:
javascript
await page.goto(TARGET, { waitUntil: 'domcontentloaded' });
let prevHeight = 0;
while (true) {
const height = await page.evaluate(() => document.body.scrollHeight);
if (height === prevHeight) break; // 高さが増加しなくなった = 終了
prevHeight = height;
await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
await new Promise((r) => setTimeout(r, 1500)); // 次のバッチを待ちます
}
const items = await page.evaluate(() =>
[...document.querySelectorAll('.item')].map((el) => el.textContent),
);
受け取るもの
どのタイプでも、ページ間で組み立てられたフラットなリストが得られます — 確認された次のボタンの実行では、10ページにわたって100アイテム。いくつかの正直な観察:
- 防御的に重複除去。 もっと読み込むと無限スクロールはアイテムを再送信する可能性があるので、安定したIDを基にします。
- ループに上限を設ける。 悪さをするサイトが無限に回転しないように最大ページ数のガードを追加します。
- 安定したセレクターを監視。
li.nextまたはもっと読み込むボタンのクラスが変更されると、ループは早く終了します — カウントが少なく見えるときはセレクターを再確認してください。 - クロールのペースを保つ。 ページ間の短い遅延と適度な同時実行がIP評判信号をクリーンに保ちます。
結論:タイプを選び、その後のループは機械的
すべてのページングされたクロールは同じ形状です — 抽出し、進み、停止条件を確認します — どの4つのタイプをサイトが使用しているかを特定した後。サイト自身の次/もっと読み込むコントロールに従い、実際の信号(次のリンクがない、空のページ、欠落ボタン、安定した高さ)で停止します。Scrapeless Scraping Browserを使用すると、長時間のクロールをレンダリングし、ブロックされずに保つことができます。最初からクロールするページURLを収集するには、Etsyスクレーパーガイドを参照してください;Scraping Browser製品ページとドキュメントは完全なSDKの表面をカバーしています。サイトのコントロールを読み、時計ではなくコンテンツを待ち、ループをガードします。
AI駆動のデータパイプラインを構築する準備はできましたか?
無料プランを取得し、マルチページクロウラーを構築している開発者とつながるために、コミュニティに参加してください:Discord · Telegram。
[app.scrapeless.com](https://app.scrapeless.com/passport/login/?utm_source=website&utm_medium=blog&utm_campaign=scrapingbrowser&utm_term=handle-pagination-web-scraping)に登録して、無料のスクレイピングブラウザランタイムを取得し、上記のパターンをワークフローに必要なページネーションサイトに適応してください。スケールについては[料金](https://www.scrapeless.com/ja/pricing?utm_source=website&utm_medium=blog&utm_campaign=scrapingbrowser&utm_term=handle-pagination-web-scraping)を参照してください。
---
## よくある質問
**Q: サイトが使用しているページネーションのタイプをどうやって知るのですか?**
ページを見てください:「次へ」リンクは次のボタン、番号付きリンクは番号付きページ、「もっと読み込む」ボタンはロードモア、スクロールするにつれて新しいコンテンツが制御なしで表示されるのが無限スクロールです。多くのサイトは2つを混合していますが、データを読み込む方を処理してください。
**Q: なぜ`?page=N`ループでデータが欠けるのですか?**
サイトがクリーンな番号付きURLを使用していないか、番号にギャップがあるからです。URLを構築するのではなく、サイト独自の次のリンクをたどってください。
**Q: 無限スクロールループをどのように停止しますか?**
各スクロールの前後で`document.body.scrollHeight`を比較します。増加が止まると、読み込むものが残っていません。
**Q: 複数ページのクロールにプロキシは必要ですか?**
多くの場合、必要です — 1つのIPから多くのページを歩くことは、従来のレート制限のトリガーです。`proxyCountry`で住宅用エグレスを固定し、クロールのペースを保ちます。
**Q: 途中でブロックされるのを避けるにはどうすればいいですか?**
ページ間に短い遅延を追加し、同時実行を控えめにし、後のページがレンダリングされ続けるように、実際のアンチディテクションブラウザで実行します。
**Q: AIエージェントなしでこれを実行できますか?**
はい。Scrapelessセッション上のプレーンPuppeteerで、エージェントは必要ありません。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



