CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

Pythonを使って、ページ遷移をしながらWebページの内容を取得する

前回は、Pythonを使って自分のブログのページタイトルを取得する方法を書きました。

www.crossroad-tech.com

今回は、複数ページにアクセスしながらタイトル、および他要素になっている日付も取得してcsvファイルに書き出す方法を解説します。

自分のブログにあるBabylon.jsカテゴリ132件について、このように書き出すことができました。

Output of python scraping

使用した環境
- Mac OS Tahoe 26.1
- Python 3.14.2

1. 書いたコードの全体

作ったコードはこちらです。

gist.github.com

ベースとしたコードは、勉強のために購入したこちらの書籍の第3章です。
www.shuwasystem.co.jp

github.com

ただ、Pythonのバージョン違いのためかChrome Driverやwriteが動かなかったので変更、その他自分の理解の問題でよくわからない書き方は、わかる書き方に変えました。

Chrome Driverからの変更については、こちらの記事のおかげで解決できました。
nabenavi.net

一部を解説します。

page_option = f"?page={page_num}" ここにある"f"はf文字列という手法です。(最初は誤植かと思いました)

色々使い方がありそうですが、今回の使い方では、文字列で囲った範囲に、page_numという変数を反映させることができています。

これにより、base_url+page_optionという書き方で、page_numが3,4のように変わっても、page_optionは"?page=3", "?page=4"のように動的に変更することが可能です。

    base_url = "https://www.crossroad-tech.com/archive/category/babylonjs"
    page_option = f"?page={page_num}"
    next_url = base_url + page_option

こちらが参考になりました。
【Python入門】f文字列とは?基本的な使い方やformatとの違いについて解説 | Python::HACK

また、その後の driver.get(next_url) によって、指定したURLにアクセスしてページを表示します。

次の get_item_urls(driver): 関数では、前回紹介したXPATHで定義する特定要素があるかを判断、もしあればlen () > 0 なので続行、なければ結果が0になるのでif文終了になります。

for i in range(1,32): は31回ループします。

2. ページ送りとなる繰り返し実行はWhileで実現

ページ切り替え (update_page_num) 、日付+タイトル+URL取得(get_item_urls)、ページが最後なのかを確認 (is_last_page) という繰り返しです。

        while True:
            update_page_num(driver, page_num)
            time.sleep(SLEEP_TIME) 
            get_item_urls(driver)

            if is_last_page(driver): 
                break
            page_num += 1

3. csvファイル書き出し

元々参考にしたコードでは、writeの処理でエラーが出て実行できなかったので、前回調べたwith openという処理で動くように書き換えました。

また、for i in range(0, len(results), 3): はresultsの要素を3つずつ取得しながらループという意味です。Pythonはこういう処理があるので便利ですね。

        with open("blog_title.csv", "w", newline="") as f:
            writer = csv.writer(f)
            writer.writerow(["Date","Blog Title", "URL"])
            rows = []
            for i in range(0, len(results), 3): 
                rows.append((results[i], results[i+1], results[i+2]))
            writer.writerows(rows)

今のresults変数は、このようにdate, title, urlの3つが1組で繰り返されています。そのため、3つ単位で区切って繰り返すことにしました。

2025-12-25,2025年のBabylon.jsコミュニティーを振り返る,https://www.crossroad-tech.com/entry/babylonjs-community-2025,2025-12-21,Babylon.js EditorでPost Processを調整して、きれいな風景をつくってみる,https://www.crossroad-tech.com/entry/babylonjs-editor-postprocess,2025-12-20, (以降続く)

また、rows.append((results[i], results[i+1], results[i+2])) によって、3つ書いては改行という処理になっています。

これらの処理によって、csvファイルがみやすくなります。

2025-12-25,2025年のBabylon.jsコミュニティーを振り返る,https://www.crossroad-tech.com/entry/babylonjs-community-2025  
2025-12-21,Babylon.js EditorでPost Processを調整して、きれいな風景をつくってみる,https://www.crossroad-tech.com/entry/babylonjs-editor-postprocess
2025-12-20 (以降続く)

4. おわりに

これで複数ページにまたがっても情報取得ができるようになりました。
次は個別の記事に移動して画像を取得するとか、文字以外の情報取得も試してみたいと思います。