CrossRoad

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

Pythonを使って、ページの中にある画像を取得する

ここ最近、Pythonを使ってスクレイピングをする方法を試しています。

www.crossroad-tech.com

www.crossroad-tech.com

今度は、スクレイピングによってテキストではなく画像を取得してみました。

結果、自分の記事にある複数の画像をまとめてダウンロードできたので、方法を紹介します。

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

1. BeautifulSoupを使ってみる

今回の目的である画像取得方法を調べたところ、そもそもHTMLのparseをするには、これまで使っていたseleniumやwebdriverを使うより、BeautifulSoupというモジュールを使う方が簡単そうとわかりました。

BeautifulSoupの公式ドキュメントではこのように定義されています。HTMLまたはXMLからデータを抽出できるPythonのライブラリです。

Beautiful Soup is a Python library for pulling data out of HTML and XML files. It works with your favorite parser to provide idiomatic ways of navigating, searching, and modifying the parse tree. It commonly saves programmers hours or days of work.

www.crummy.com

2019年の記事ですが、こちらの解説がわかりやすかったです。 qiita.com

色々な記事を読んでみると、指定したhtmlページの内容全体を取得するには、下記の数行で済むことがわかりました。

import requests
from bs4 import BeautifulSoup

import urllib.request

url = 'https://www.crossroad-tech.com/entry/babylonjs-editor-postprocess'
res = requests.get(url) 
soup = BeautifulSoup(res.text,'html.parser') 

このsoupという変数にhtmlの内容が一通り入っているので、あとはそこからimgとか要素を指定して抽出していくという流れです。直感的でわかりやすいと思いました。

2. 書いたコードの全体

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

gist.github.com

soup変数にhtml全体を格納した後、find_allを使うことで"img"という属性を丸ごと取得できます。

そこからgetを使って"src"という属性を取得し、"img_urls"という配列にURLを格納します。

img_tags = soup.find_all("img")
img_urls = []

for img_tag in img_tags:
  url = img_tag.get("src")
  if url != None:
    img_urls.append(url)

こちらを参考にさせていただきました。

qiita.com

今回、記事の中に貼り付けた画像は"https://cdn-ak.f.st-hatena.com/images/fotolife/T/Takyu/20251221/20251221073656.jpg"のような形式です。

あとは"Takyu"以降の文字列だけ抽出してダウンロードした時のファイル名にする処理を作りました。

この辺りが大変参考になりました。 note.nkmk.me

ダウンロードする方法は、こちらの記事がわかりやすかったです。

note.nkmk.me

3. 動作確認結果

このようになりました。

◾️今回対象とした記事 Target Site Screenshot for Scraping

Babylon.js EditorでPost Processを調整して、きれいな風景をつくってみる - CrossRoad

◾️スクレイピングの結果 Scraped Images from CrossRoad blog

4. おわりに

今対対象としたブログ記事では、記事以外の画像 (ブログアイコンや、最近読まれている記事のサムネイルアイコン)はURL記述が異なっています。そのため今回は取得されていませんが、URLの形式を理解して対応すれば取得可能です。

ひとまず画像まで取得できたので、後は応用すれば色々な形でWeb記事が取得できそうです。こういう取得結果を使うとデータ分析などにも応用できそうなので、どこか機会があれば分析方法も調べてみたいと思います。