【Python】ページ内の画像をスクレイピングで一括取得する方法【コード例・コピペ可】
以前、BeautifulSoupを使って、ページ内の特定の情報(文字列)を取得する方法を解説いたしました。
今回は、ページ内の画像をスクレイピングして取得する方法を解説いたします。
Pythonで画像の取得をしたいと考えている方は参考にしていただければと思います。
この記事を使えば、特定ページ特定箇所の画像を一括ダウンロードすることができるようになります。
すでに自身の環境で動作は確認済みですので、ぜひコピペするなどして試してみていただけたらなと思います。
目次(クリックで読みたい部分にジャンプできます)
必要な前準備
まず実装に入る前に、今回のインストールしておくモジュールを整理します。
- BeautifulSoupをインストール
- requestsをインストール
今回の実装に必要なことはこれだけです。
requestsは特定のURLにアクセスしたときに、HTTP通信でレスポンスをもらうためにあります。
BeautifulSoupは、requestsで取得したレスポンス(HTMLファイル)をタグごとに分ける処理を行います。
BeautifulSoupの詳しい使い方については、この記事では割愛しますが、知りたい方は以下の記事を参考にしてみてください。
では、コードの説明をしていきます。
全体の流れ
コードの説明をする前に、どのような流れで画像を取得するのかをあらかじめ把握しておくと、コードを理解しやすくなります。
全体の流れ
①URLにアクセス
②BeautifulSoupでimgタグ要素を指定
③画像ファイルを保存
では、それぞれのコードを交えてみていきましょう。
①URLにアクセス
url= "https://ja.wikipedia.org/wiki/織田信長"
response = requests.get(url)
requestsメソッドを使って、URLにアクセスし、HTTPレスポンス(HTMLファイル)を受け取ります。
ここは、BeautifulSoupを使う処理の時は、必ず行うものなのでテンプレだと思って覚えておくとよいです。
②BeautifulSoupでimgタグ要素を指定
soup = BeautifulSoup(response.content, "html.parser")
content = soup.find("div",attrs={"id":"bodyContent"})
images = content.find_all("img")
ここで、BeautifulSoupモジュールを使っていきます。
requestsメソッドで取得したHTMLファイルをタグごとに分割して行きます。
変数「content」にはdivタグのid=bodyContentを使います。
id=BodyContentはページのbody部分となります。
今回は、そのdivタグのimgタグを全て取得してきます。
find関数は、指定の箇所に当てはまる「1つ目」を取得します。
一方find_all関数は、当てはまる箇所「全て」を取得します。
今回は画像を一括取得する方法なので、find_all関数を使っていますが、特定の画像を取得してきたい場合は、、.find関数で指定する中身を変えてみるなどして、取得することが可能になります!
③画像ファイルを保存
for image in images:
long_image_url = urllib.parse.urljoin(url, image["src"])
image_data = requests.get(long_image_url)
with open(str("./nobunaga/")+str(uuid.uuid4())+str(".jpeg"),"wb")as file:
file.write(image_data.content)
取得した複数の画像をfor文で処理し、それぞれの画像を保存していきます。
urlllib.parse.urljoinでページのURL(URL)と画像パス(img[src])つなげ、直接画像をダウンロードできるURLパスを作成します。(long_image_urlに格納)
作成したURLにrequestsを使ってアクセスします。
with open メソッドで、特定のファイル(今回は同じディレクトリ上にnobunagaを作成)に、ランダムなファイル名(uuid.uuid4で生成)で保存していきます。
全体コード
import requests
from bs4 import BeautifulSoup
import urllib
from pathlib import Path
import uuid
#↓ファイルを作成するメソッド(作成してあれば、なくてもよい)
output_folder = Path("nobunaga")
output_folder.mkdir(exist_ok=True)
url= "https://ja.wikipedia.org/wiki/織田信長"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
content = soup.find("div",attrs={"id":"bodyContent"})
images = content.find_all("img")
for image in images:
long_image_url = urllib.parse.urljoin(url, image["src"])
image_data = requests.get(long_image_url)
with open(str("./nobunaga/")+str(uuid.uuid4())+str(".jpeg"),"wb")as file:
file.write(image_data.content)
まとめ
今回は、スクレイピングしながら画像を取得する方法、コード例を紹介しました。
BeautifulSoupは簡単にスクレイピングができるモジュールになります。
以下の記事ではBeatutifulSoupの内容に触れていますので併せて読んでみてください。