ページネーションとは何か?ページ、オフセット、カーソル、スクロール
Scrapeless Agent Browser は、ページネーションされた公開インターフェースからデータを収集するために、ページ遷移とブラウザ操作を自動化します。
要約
- ページネーションはコレクションを有限の部分に分割して返す。 ナビゲーションの契約は、クライアントが次の部分をどのように見つけるかを定める。
- 目に見えるコントロールからはバックエンドのアルゴリズムは特定できない。 「さらに読み込む」インターフェースは、オフセットやカーソル、その他の継続スキームを利用できる。
- 並び替えとフィルタは、走査されているコレクションを定義する。 途中でそれらを変更すると、保存された位置の意味が無効になり得る。
- 完全な取得には、検証された終了条件が必要である。 受け付けたレコード数を数え、実際に観測したソースの境界を報告する。
ページネーションはコレクションを取得可能な部分に分割する
ページネーションとは、コレクションを小さな部分に分割し、クライアントが個別に取得または表示するプロセスである。検索インターフェースは番号付きの結果ページを表示でき、フィードはスクロール中にさらに項目を追加でき、API は継続トークンを返すことができる。どの設計も、一度に扱う情報量を制限しつつ、利用者がさらに取得する方法を提供する。
ページネーションの理由は、視覚的なページデザインより広い。大きなコレクションは、クエリ、シリアライズ、転送、パース、レンダリングに相当な時間を要し得る。有界な部分を返すことは、こうしたコストを管理するのに役立つ。また、それはクライアントが理解しなければならない契約も生む。つまり、どの項目がコレクションに属するのか、それらがどのように並べられているのか、次の部分をどう要求するのか、走査が終了したことを何が示すのか、という点である。
ページネーションだからといって、すべてのページが同じ長さであるとか、総件数が利用可能であるとか、走査中にコレクションが変化しない、という意味にはならない。そうした性質はサービスに依存する。レコードを収集する前に、エンドポイントやインターフェースの振る舞いを読んで、データセットの境界を定義すること。そうしないと、プログラムは正しくナビゲートしながらも、完全性や履歴的一貫性についてサポートされていない主張をしてしまい得る。
番号付きページとオフセットは位置によるナビゲーションを表現する
ページ番号によるページネーションは、特定のページサイズ規約の下で、名前付きページを要求する。オフセットによるページネーションは、有界な部分を返す前に、サーバーに一定数の項目をスキップするよう求める。インデックスとページサイズのルールが分かっていれば、この2つは算術的に関連付けられるが、クライアントはそのルールを推測すべきではない。インターフェースによってはページ番号付けが0から始まるものもあれば、1から始まるものもある。
位置ベースのインターフェースは、人々が安定したコレクション内のなじみのある場所や、特定ページへの直接ジャンプを求めるときに有用である。一方で、リクエスト間に項目が追加・削除されると解釈が難しくなる。先頭付近に新しいレコードが入ると、それ以降のオフセットがずれるため、利用者は連続した位置を正しく要求していても、同じ項目に2回出会ったり、項目を取りこぼしたりし得る。
The PostgreSQL LIMIT and OFFSET behavior は、なぜ予測可能な順序が必要なのか、そして大きなオフセットであってもサーバーがスキップされた行を計算する必要があり得るのかを説明している。これはデータベース固有の実装上の事実であり、すべてのオフセットAPIが遅いという証拠ではない。インターフェースの様式名だけで優劣を付けるのではなく、実際のバックエンドとワークロードを評価すること。
カーソルは継続境界を表現する
カーソルによるページネーションは、クライアントが並び替えられたクエリ内のどこから継続すべきかを示す値を返す。利用者は通常、その値を解釈せずに送り返す。不透明なカーソルにより、API 契約はストレージの詳細から独立したままでいられる一方、next リンクは正しいエンドポイントとクエリ引数も保持できる。サービスが明示的に提供している継続メカニズムを使用すること。
AIP-158 pagination guidance は、リクエスト引数が継続中も一貫したままであるページトークン契約を例示している。また、要求した件数より少ない項目しか含まないページでも、別のページトークンを含み得ることを明確にしている。これが、ページ長だけを普遍的な終了ルールとするのが安全でない理由である。文書化された継続フィールドは、ページがどれだけ埋まって見えるかという前提よりも権威がある。カーソルは、逐次フィードや大規模な順序付き走査に適していることが多いが、それだけで固定スナップショットが得られるわけではない。トークンは期限切れになり得るし、権限は変わり得るし、可変な並び替えフィールドによってレコードが移動し得る。履歴エクスポートには、単にカーソルという名前のフィールドを公開するエンドポイントではなく、必要な一貫性と保持をサポートするソース契約が必要である。
| アプローチ | 継続メカニズム | 検証すべき問い |
|---|---|---|
| 番号付きページ | ページサイズ規約の下でのページインデックス | 番号付けはどこから始まり、変動し得るか? |
| オフセット | スキップするレコード数 | 並び順は安定しているか、深いアクセスはサポートされているか? |
| カーソル | サーバーが提供する位置トークンまたは next リンク | トークンはどのくらい有効で、いつ走査は完了するのか? |
| さらに読み込む | 表示中のレコードを追加する操作 | そのコントロールはどんなデータ要求と終了状態を表しているか? |
| 無限スクロール | ビューポートをトリガーとしてデータを読み込む操作 | どの観測結果が新しいレコード到着を証明するか? |
ブラウザのページネーションはユーザーインターフェースの契約である
ブラウザのページネーションは、人や自動化が、別の可視レコード群をどのように取得するかを表す。次へボタンは、新しいドキュメントへ遷移したり、現在のリストを置き換えたり、さらにエントリを追加したりし得る。「さらに読み込む」コントロールは、末尾で消えることもあれば、無効のまま残ることもある。無限スクロールは、ビューポートがしきい値に達した後にのみリクエストをトリガーし得る。自動化アクションを選ぶ前に、これらの状態を観察すること。
インターフェースは基盤となるストレージ方式を確実には開示しない。番号付きのページはAPIを呼び出しているかもしれず、無限リストはカーソルではなくオフセットを使っているかもしれない。目に見えるアクションとネットワーク継続は、別個の観測結果として扱うこと。開発者ツールで表示できるという理由だけで、文書化されていない内部リクエストを安定した公開APIとみなしてはならない。
DOM 要素の数だけに頼るのではなく、レコードの識別子を数えてください。仮想化されたインターフェイスは、少数の要素セットを再利用して、より大きなコレクションを表示できます。重複を後から追加すると、新しいレコードを増やさずに要素数だけを増やすことができます。コレクションのロジックは、タスクに必要な識別フィールドを認識し、観測されたカードと新たに受け入れたレコードとの区別を保持する必要があります。
並び順、フィルター、スナップショット境界がカバレッジを定義する
ページネーションの走査は、クエリが識別可能なままのときにのみ明確な意味を持ちます。コレクション名、フィルター、ソート順、およびサポートされる任意の時間境界を結果と共に保存してください。ジョブの途中でユーザーがあるカテゴリから別のカテゴリに変更した場合、保存されたページ位置はもはや同じコレクションを表しません。別個の走査を開始するか、その変更に対するサービスの文書化された挙動に従ってください。
この OpenStack pagination and sorting guidance では、フィルタリングとソートをコレクションインターフェイスの一部として扱っています。利用者は、ページネーションを独立したループとして扱うのではなく、そのルールを保持するべきです。安定した走査のためには、複数のレコードが同じ見かけ上のソート値を持ちうる場合に、順序キーに決定的なタイブレーカーが必要です。
ライブインターフェイスの完全な走査であっても、依然として異なるソース状態にまたがる可能性があります。新しいレコードは取得中に現れ、削除されたレコードは消えることがあります。レポートが、固定エクスポート内のすべてのレコードを記述するのか、それとも収集ウィンドウ中に観測されたレコードを記述するのかを定義してください。ソースがスナップショット保証を提供しない場合、成功したナビゲーションをより強い完全性の主張に変換するのではなく、その制約をレポート内に保持してください。
文書化されたシグナルから終了を見つける
終了条件は、収集者に対して、走査に属する部分がこれ以上存在しないことを伝えます。API は next トークンを省略したり、偽の継続フラグを返したり、next リンクを一切提供しなかったりできます。ブラウザはナビゲーションコントロールを無効化したり、最終メッセージを表示したりできます。適切なシグナルはインターフェイスに依存し、利用者はどのシグナルを使用したかを記録しておくべきです。
HTTP web linking は、API がナビゲーションを含む関連リソースを表現するために利用できるリンク関係を定義しています。サービスが next リンクを返す場合、推測したパラメータから URL を組み立て直すのではなく、その文書化されたセマンティクスに従ってください。関連する認可境界を保持し、レスポンスにリンクが現れたというだけの理由で、予期しないホストに認証情報を転送してしまうことを避けてください。時間制限、ページ上限、変化しない画面は、自動的にソース側の終了条件になるわけではありません。これらは妥当なジョブの境界になり得ますが、ソースにさらに多くのレコードが含まれている可能性がある場合には、境界付きの部分的な取得を生み出します。その違いを明示的にラベル付けしてください。有用な結果とは、ソースが終了したのか、予算が尽きたのか、観測ウィンドウが終わったのか、あるいは継続するのに十分な証拠をインターフェイスが提供しなかったのかを説明するものです。
チェックポイントを進める前にレコードを保存する
チェックポイントは、永続ストレージに到達したページコンテンツを表すべきです。クエリ定義と継続状態を一緒に取得し、受け入れたレコードをコミットしてから、保存済みの位置を進めてください。その順序を逆にすると、位置の更新とレコード書き込みの間にプログラムが停止した場合にデータを取りこぼす可能性があります。保存境界を後付けではなく、走査設計の一部にしてください。
ソースが安定したレコード識別子を提供している場合には、それを用いて重複排除を行ってください。URL、商品 ID、その他の文書化されたキーなどが、タスクに応じて利用できるでしょう。可視のタイトルテキストだけでは、タイトルが重複したり変更されたりし得るため、しばしば弱い識別子です。ソースの識別子と観測時刻を保持しておき、後続の処理が、繰り返しの観測と、たまたま似て見える別個のレコードとを区別できるようにしてください。
将来のトークンを推測することで、単一の依存カーソルチェーンを並列化することは避けてください。次の位置は直前のレスポンスに依存している可能性があります。ソースがサポートしており、結合されたスコープが明確に定義されたままである場合には、独立したパーティションを個別に処理できます。それらのパーティション間で共有されるリクエスト予算を考慮し、結果がどのように結合されるかを説明できるだけのパーティションメタデータを記録してください。
ページネーションの概念をマネージドブラウザに適用する
Scrapeless Agent Browser は、ページナビゲーションとインタラクションのためのブラウザ環境を提供します。 Agent Browser overview はその能力を示しており、そのうえで自動化側がセレクタ、受け入れるレコード、停止条件を定義します。マネージドブラウザは、どのページがあなたのデータセットを構成するかや、あなたに代わってソーススナップショットを確立するかを決定しません。この browser pagination patterns は、次へボタン、番号付きページ、さらに読み込むボタン、無限スクロールを区別しています。具体的な挙動を実装する前に、それらのパターンを用いてインターフェイスを認識してください。各遷移後にもレコード検証を維持し、アクセス通知や空のアプリケーションシェルが、見かけ上有効な最終ページとして黙って扱われてしまわないようにします。
「 Scrapeless pricing 」を確認し、収集のリソースコストを見積もってください。仮想的なカテゴリ監査は、許可されたページの境界付きセットから開始し、受け入れた各商品の識別子を記録し、インターフェイスの明示的な終端状態で停止できます。結果のレポートには、観測したカテゴリ、ソート順、取得ウィンドウ、および終了の根拠を記載し、別の人がそのカバレッジを評価できるようにするべきです。
ユーザー要件とデータ要件からナビゲーションを選択する
ページネーション設計は、タスクのナビゲーション要件、一貫性要件、コスト要件から選択してください。人間のユーザーは直接ページジャンプを必要とするかもしれませんが、自動エクスポートでは安定した逐次走査と耐久性のある継続性が必要になるかもしれません。モバイルインターフェイスは load more(さらに読み込む)を好む場合がありますが、その利便性はバックエンドの一貫性保証を確立するものではありません。表示上の選択と、レコードに関する契約は切り離しておいてください。
コレクターを拡張する前に、代表的な認可済みコレクションを用いて、最初の遷移、中間の遷移、最終状態を検証してください。フィルターが有効なままか、レコード ID が安定しているかを確認します。最後を説明できない大きなファイルよりも、明確な証拠を伴う小さなトラバーサルのほうが有用です。受け入れ基準は、その証拠がデータセットの利用者から見える形になっていなければなりません。
結論
ページネーションは、ナビゲーション手段と順序付きコレクションの契約を組み合わせたものです。次のアクションを特定し、クエリ状態を保持し、各遷移後にレコードを検証し、真の終了点を記録します。このアプローチにより、ソースがページ番号、不透明なトークン、動的なブラウザーインターフェースのいずれを使っていても、カバレッジを評価できるデータセットが得られます。
Web データワークフローを構築する
Agent Browser を使用して、明確なレコード ID、クエリ境界、完了の証拠を伴うページネーションインターフェースをナビゲートします。
今すぐ登録して手に入れよう $5 分の無料クレジット — クレジットカード不要.
$5 クレジットを受け取る →FAQ
インフィニットスクロールはページネーションの一種ですか?
インフィニットスクロールは、コレクションの追加部分を取得・表示するためのユーザーインターフェースパターンです。そのバックエンドはカーソル、オフセット、その他の継続手段を用いることがあります。スクロールだけからバックエンドアルゴリズムを推測するのではなく、実際のデータと終端状態の契約を観察してください。
空のページに、その次のページが存在することはありますか?
API の契約で許可されている場合、空のページでも継続が存在することがあります。フィルタリングやサービス固有の挙動によってページ長が変化することがあります。短い、あるいは空のページだからといって常にコレクションの終端だと仮定せず、ドキュメント化されたトークン、リンク、継続フラグを使用してください。
ページネーションは結果の安定性を保証しますか?
ページネーション自体は結果の安定性を保証しません。ページ間の一貫性は、並び順、同時変更、スナップショットのルールによって決まります。フィルターとソート順を保持し、安定したレコード ID を使用し、ソースが固定されたデータセット境界を提供しているのか、ライブトラバーサルなのかを報告してください。
すべてのページを並列に取得すべきですか?
ページ位置がそれぞれ独立に取得可能であり、かつソースがそのトラフィックを許容する場合にのみ、ページは並列に取得すべきです。カーソルチェーンは通常、直前のレスポンスに依存します。並列処理には、共有の予算と、パーティションカバレッジをどのように統合するかの明確なルールも必要です。
ページネーションされた取得が完了したと判断できるのはいつですか?
ソースで定義された終了条件に到達し、受け入れたすべてのページが保存されたとき、ページネーションされた取得は完了したとみなせます。ページ数の上限や時間制限はジョブの境界であり、ソース側にさらにページが残っている可能性がある場合は、結果が部分的であることを報告してください。