CrossRoad

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

Pythonを使ってWebページの内容を取得する

前回、Pythonの勉強過程の1つとして環境構築方法を書きました。

www.crossroad-tech.com

今回はPythonの使い方の例として、Webページの内容を取得する「スクレイピング」についてまとめてみました。

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

1. スクレイピングとは

スクレイピングとは、Webページに書かれているテキストや画像などを取得する方法です。私の技術バッググラウンドがアプリ開発に寄っているので知らなかったのですが、データ分析関係ではよく使われる手法のようです。

ざっと調べるとPythonを使う例が多く出てきますが、ExcelやChrome拡張を使う方法も紹介されていました。

exceljoshi.cocoo.co.jp

chromewebstore.google.com

あと、注意点としてスクレイピング自体は違法ではないですが、いくつか注意点があります。例えば下記です。

  • 接続先に大量のアクセスをしない
  • 相手が禁止しているページはスクレイピングしない
  • 取得した情報を使うことで、サーバ管理者の不利益になることはしない(例:ログインした後の限定情報を公開する)

少し前の情報ですが、こちらも参考になります。
qiita.com

あと、トップページ+robots.txtというURLを入力することで、対象サイト内のスクレイピングに関する宣言を確認できます。

2. Pythonでスクレイピングを試してみる

多量アクセスはしないので、このブログで試すことにしました。

色々な情報を読みながら、ブログの記事タイトル一覧をまとめて取得するコードを書いてみました。

まずは/User/username/Documents/Python/scraping-test というフォルダを作って、仮想環境を作って有効化しました。

私はPythonをインストールするとき brew install python3 としたので、コマンドがpython3になっています。 (ver3のpythonをインストール)

$ pwd
/User/username/Documents/Python/scraping-test
$ python3 -m venv .venv
$ . .venv/bin/activate
(.venv) $ 

次に、ブラウザを操作するseleniumというライブラリをインストールします。

(.venv) $ python3 -m pip install selenium

その上で、新しく.pyファイルを作って、以下のように書きます。

(.venv) $ touch scrape-selenium-write.py
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.crossroad-tech.com/archive/category/babylonjs")

titles=[]
for i in range(1,31):
    title = driver.find_elements(By.XPATH, "//*[@id='main-inner']/div/section["+str(i)+"]/div[1]/h1")
    titles.append(title[0].text)

import csv
with open("blog_title.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(["Blog Title"])
    writer.writerow(titles)

driver.quit()

その後で、このファイルを実行する (以下のコマンド) と、blog_title.csvというファイルができあがります。

(.venv) $ python3 scrape-selenium-write.py

少し解説します。

まず、Seleniumとはブラウザの操作を自動化するライブラリです。ここにわかりやすい記事があったので紹介します。

qiita.com

Seleniumを使ってChromeブラウザを開いて指定ページを表示、その上でhtmlページ内で指定したタグの範囲を取得、csvファイルに書き出す、という流れです。

対象としたページは、このブログでBabylon.jsカテゴリをまとめたページです。

A blog category on 'CrossRoad'

このスクリーンショットでは一部しか表示していませんが、この画面ではスクロールすると30個の記事のタイトルを確認できます。31個目からは「次へ」を押すと表示されますが、今回はその操作は入れず、30個のタイトルを取得してみました。

途中にあるBy.XPATHという部分で、html要素を指定します。

XPATHについてはこちらがわかりやすかったです。

XPath(XML Path Language)とは、ツリー構造を持つXMLやHTMLドキュメントから、特定の要素や属性値を抽出するための簡潔な構文(言語)です。
Webページは通常HTMLで記述されているため、XPathはWebページの情報を取得する際によく利用されます。ブラウザ(ChromeやFirefoxなど)でWebページのHTMLを表示するには、F12キーを押すと、対応するHTMLドキュメントに簡単にアクセスできます。

qiita.com

今回は、"https://www.crossroad-tech.com/archive/category/babylonjs"というページを開いたらF12を押して開発者ツールを開きます。

Developer Tool on Chrome/Edge browser

その上で「2025年のBabylon.jsコミュニティを振り返る」というテキストを選択すると、対象となるhtmlコードが右側に表示されます。この状態でhtmlコード部分で右クリック>Copy > Copy XPath を選択すると、XPathのパスを取得できます。

今回は "//*[@id="main-inner"]/div/section[1]/div[1]/h1/a" という文字列が取得できました。

隣の「Babylon.js EditorでPost Processを調整して、きれいな風景をつくってみる」も同様にXPathを調べると、 "//*[@id="main-inner"]/div/section[2]/div[1]/h1/a" という文字列でした。

ということで、section[i]を変化させて、繰り返し実行で1-31までのタイトルを取得しました。

次のopenやwriteはファイル書き込みです。他の言語とほぼ同じ書き方なので説明は省略します。取得したタイトルをcsvに書き込むとこのように表示されます。

Scraped Results from 'Cross Road' blog

最後の driver.quit() で開いていたChromeブラウザを閉じます。

3. おわりに

ひとまず、要素を指定して内容を保存することはできました。Seleniumはボタンを押すとか、動的ページを操作するなど、細かい操作もできるようです。

今回は操作、取得、保存、の基本的なところまででした。機会あればもう少し細かい処理も試してみたいと思います。