Python リクエストのページネーション

Abid Ullah 2023年6月21日
  1. Pythonのページネーションとは
  2. [次へ] ボタンを使用した Python のページネーション
  3. [次へ] ボタンを使用しない Python のページネーション
  4. 無限スクロールによる Python ページネーション
  5. [もっと読み込む] ボタンを使用したページネーション
Python リクエストのページネーション

この記事では、ページネーションと、Python でのページネーションに関連する問題をどのように克服できるかについて学びます。 この記事の最後に到達すると、Python のページネーションと、それに関する問題の対処方法について学ぶことができます。

Pythonのページネーションとは

どのような Web アプリケーションを使用する場合でも、表示されるコンテンツが制限されたり、1つのページに強制的に収まったりするだけではないことが最も重要です。 それでも、複数のページにわたって表示する必要があります。これにより、ユーザー エクスペリエンスが向上します。

コンテンツを複数のページに分散させるこのプロセスは、ページネーションと呼ばれます。 ページネーションの概念を実装するときは、総ページ数、コンテンツ タイプ、議論中のトピックのカテゴリ表現、ページの番号順などの要因を考慮する必要があることに留意する必要があります。

[次へ] ボタンを使用した Python のページネーション

ページネーションは、ユーザーが見るもの、つまり Web サイトのフロントエンドに常に限定されるわけではありませんが、バックエンドで使用される API をページネーションすることが最も重要な場合もあります。 ページネーションの問題に対処するために、いくつかの Python API とモジュールを使用できます。

requests モジュールを使用することから始めます。 また、Web ページからコンテンツを検索する場合は、BeautifulSoup4 を使用します。

また、上記のモジュールへの便利なアクセスを提供するために lxml ライブラリを使用します。

コード例:

pip install requests beautifulsoup4 lxml

上記の行は、beautifulsoup4 ライブラリを介して requests モジュールをインストールするのに役立ちます。

import requests
from bs4 import BeautifulSoup

findurl = "http://books.toscrape.com/catalogue/category/books/fantasy_19/index.html"
getresponse = requests.get(findurl)
getsoup = BeautifulSoup(getresponse.text, "lxml")
footer_element = getsoup.select_one("li.current")
print(footer_element.text.strip())

出力:

Page 1 of 3

前のコード スニペットは、コードで指定された Web ページ URL からフッターを取得するのに役立ちます。 必要に応じて URL を変更できます。

requests ライブラリは URL で get リクエストを送信します。

soup オブジェクトには、CSS セレクターを使用しています。 たとえば、別の要素に移動したい場合は、soup.select_one(name) に名前を入力できます。

上記のコードは、ナビゲーション用の [次へ] ボタンを含む Web ページ用でした。 このシナリオとは別に、無限スクロールさらに読み込むボタンを使用する Web サイトでは、次へボタンなしでページネーションを行うこともできます。

注: 目的の Web サイトで F12 を押してから、必要な要素のマークアップを調べることで、上記のコードで使用したこれらすべてのオブジェクト名を取得します。 例えば:

ウェブサイトを検査する方法

[次へ] ボタンを使用しない Python のページネーション

一部の Web サイトでは、[次へ] ボタンの代わりに、1、2、3、4 などの数字を使用して、異なるページ間をスクロールします。 これにより、ユーザーは複数のページ間をさらに簡単に移動できます。

この場合、最初のページからデータを取得してから、ループを使用してナビゲートします。

コード例:

# Handling pages with the Next button
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin


def process_pages():
    get_url = "https://www.gosc.pl/doc/791526.Zaloz-zbroje"
    response = requests.get(get_url)
    soup = BeautifulSoup(response.text, "lxml")
    page_link_el = soup.select(".pgr_nrs a")
    # process the first page
    for link_el in page_link_el:
        link = urljoin(get_url, link_el.get("href"))
        response = requests.get(link)
        soup = BeautifulSoup(response.text, "lxml")
        print(response.url)
        # process remaining pages


if __name__ == "__main__":
    process_pages()

出力:

https://www.gosc.pl/doc/791526.Zaloz-zbroje/2
https://www.gosc.pl/doc/791526.Zaloz-zbroje/3
https://www.gosc.pl/doc/791526.Zaloz-zbroje/4

無限スクロールによる Python ページネーション

名前が示すように、このタイプのページネーションでは、次のボタンやページ番号はなく、必要なコンテンツを表示するためにスクロールし続けます。

このようなページネーションの簡単な例は、e コマース Web サイトです。 一度に一定数の製品が表示され、下にスクロールすると次の製品が表示されます。

このようなシナリオでは、複数ページの URL を扱う必要がないことに注意してください。

API への非同期呼び出しは、移動するにつれてより多くのコンテンツを取得するのに役立ちます。

[もっと読み込む] ボタンを使用したページネーション

このページネーション方法は無限スクロール方法に似ていますが、次のページに移動する方法を知りたい場合にのみ異なります。

この場合、さらに読み込むボタンをクリックするたびに減少し続ける、完了する必要のある特定の数のリクエストがあります。 たとえば、Web サイトの画像の総数が 500 で、一度に 30 枚の画像が表示されるとします。

したがって、[さらに読み込む] ボタンをクリックするたびに、次の 30 枚の画像が表示され、カウンターは合計 500 枚の画像からその 30 枚を差し引きます。 理解を深めるために、以下の例を考えてみましょう。

コード例:

import requests
from bs4 import BeautifulSoup

url = "http://smarthistory.org/wp-json/smthstapi/v1/objects?tag=938&page={}"
null = 0
page_counter = 1
while True:
    getresponse = requests.get(url.format(page_counter), headers=null)
    data = getresponse.json()
    # Process data
    # ...
    print(getresponse.url)  # only for debug
    if data.get("remaining") and int(data.get("remaining")) > 0:
        page_counter += 1
    else:
        break

出力:

https://smarthistory.org/wp-json/smthstapi/v1/objects?tag=938&page=1
https://smarthistory.org/wp-json/smthstapi/v1/objects?tag=938&page=2
https://smarthistory.org/wp-json/smthstapi/v1/objects?tag=938&page=3
https://smarthistory.org/wp-json/smthstapi/v1/objects?tag=938&page=4
https://smarthistory.org/wp-json/smthstapi/v1/objects?tag=938&page=5
https://smarthistory.org/wp-json/smthstapi/v1/objects?tag=938&page=6
https://smarthistory.org/wp-json/smthstapi/v1/objects?tag=938&page=7
...

上記のコードは、使用可能なページの最後に到達するまで、同じ URL を出力し、ページ番号をインクリメントし続けます。 上記のコードの場合、合計ページ数は 34 です。

この記事が、Python のページネーションの概念を理解するのに役立つことを願っています。

著者: Abid Ullah
Abid Ullah avatar Abid Ullah avatar

My name is Abid Ullah, and I am a software engineer. I love writing articles on programming, and my favorite topics are Python, PHP, JavaScript, and Linux. I tend to provide solutions to people in programming problems through my articles. I believe that I can bring a lot to you with my skills, experience, and qualification in technical writing.

LinkedIn

関連記事 - Python Requests