Webスクレイピングを実施する中で、画像データに関する収集・保存するケースがあります。
本記事では、画像データ収集・保存を実施するWebスクレイピングについて解説します。
- Webスクレイピングとは
- requests&BeautifulSoupによる画像スクレイピング
- SIer/Web系企業での実務経験があるフリーランスエンジニア
- プログラミングスクールでの講師実績あり
- HR領域によるエンジニア特化の採用代行を業務委託で兼務
Webスクレイピングとは
Webスクレイピングとは、主にサイトからデータを収集する技術を指します。
当然、画像データも含まれるため、スクレイピング技術でデータ収集・保存が可能です。
画像データスクレイピング実施の準備
2章では、以下の方法で画像データのスクレイピングを実施します。
- 自身のPCにダウンロードフォルダ作成
- https://images.search.yahoo.com/を利用(検索エンジンはGoogle)
- 検索キーワードから特定の各画像を一括でダウンロード
- フォルダ内にファイル名を付けて保存
上記の手順で画像データのスクレイピングを実施します。
requestsのメソッドの使い方
ここでは、画像スクレイピング時に利用するrequestsライブラリの概要を解説します。
requestsでは、以下の4つが代表的なメソッドになります。
メソッド名 | 説明 |
---|---|
requests.get() | サーバーから情報を取得 |
requests.post() | サーバーへ情報を送信 |
requests.put() | サーバーの情報を更新 |
requests.delete() | サーバーの情報を削除 |
本記事では、画像URLに対してWebスクレイピングを利用するため、.get()メソッドを重点的に解説します。
requests.get()の引数の使い方
Webスクレイピングといったデータ収集などで頻繁に利用されるのがrequests.get()になります。
res = requests.get(URL, 任意の引数)
.get()メソッドを利用することで直感的に操作することができます。
また、以下が主な引数になります。
メソッド名 | 必須/任意 | 説明 |
---|---|---|
URL | 必須 | 対象URL |
headers | 任意 | リクエスト時にヘッダーデータを辞書で指定 |
params | 任意 | リクエスト時にURLのクエリパラメータを辞書で指定 |
cookies | 任意 | リクエスト時にクッキーを辞書で指定 |
timeout | 任意 | リクエスト時のタイムアウトを指定 |
スクレイピング業務では、引数にURLのみを利用することが多いです。
requests.get()によるresponseオブジェクトの確認
リクエスト後の戻り値(応答)として、responseオブジェクトが返ってきます。
以下がresponseオブジェクトの属性値になります。
属性 | 説明 |
---|---|
status_code | ステータスコード |
headers | レスポンスヘッダーのデータ |
content | レスポンスのバイナリデータ |
text | レスポンスのテキストデータ |
encoding | エンコーディング(変換方式:utf-8など) |
cookies | クッキーデータ |
ここでは、responseオブジェクトのtext属性データのみを利用する画像スクレイピングプログラムになります。
requestsライブラリをさらに理解したい人は、「【Python】requestsとは?インストールから使い方まで徹底解説!」を一読ください。
BeautifulSoupの代表的なメソッドの使い方
HTMLデータを解析した後、指定した箇所のデータを抽出する必要があります。
本記事では、スクレイピングの際に利用するBeautifulSoupの代表的なメソッドを記載します。
タイプ | 1要素だけ返す | 全要素をリストで返す | 引数(検索条件指定) |
---|---|---|---|
find系 | find() | find_all() | 要素名, 属性指定(キーワード引数) |
select系 | select_one() | select() | CSSセレクタ |
機能はどちらも同じですが、引数の違いによって探し出すアプローチ方法が異なります。
ただし、HTMLデータによってはクラス/idに対して属性値を持たないデータがあるため、その場合はselect系を利用しましょう。
BeautifulSoupをさらに理解したい人は、「【Python】 BeautifulSoup4とは?インストールから使い方まで徹底解説!」を一読ください。
requests&BeautifulSoupによる画像スクレイピング
それでは、実際にプログラムを作成する上で手順を解説します。
- ダウンロードフォルダ作成
- 画像スクレイピングに必要なライブラリのインポート
- requestsにてサイトの検索結果URLにアクセスし情報取得
- BeautifulSoupにてサイト情報の解析
- imgタグから画像URLのみ抽出
- 各画像URLから画像ダウンロード
- ダウンロードした画像をフォルダに保存
上記内容を手順ごとに作成していきます。
ダウンロードフォルダ作成
こちらは、PC内で任意のディレクトリにてダウンロードフォルダを作成してください。
また、スクリプトファイルも利用するため、以下の階層フォルダで作成しています。
scraping-imageフォルダ
├ scraping-image.py
└ downloadフォルダ
上記のフォルダ構成で進めていきます。
画像スクレイピングに必要なライブラリのインポート
2章では、上述通りrequestsとBeautifulSoupをライブラリとしてインポートします。
pip install requests
pip install bs4
まだライブラリのインストールが済んでいない人は、上記のコードでインストールを実行してください。
Macであればターミナル、Windowsであればコマンドプロンプトでインストールコマンドを実行できます。
import os
import requests
from bs4 import BeautifulSoup
上記のコードをscraping-image.pyに記載します。
osモジュールは、フォルダに画像ダウンロードする際、パス指定等を利用するためインポートしています。
requestsにてサイトの検索結果URLにアクセスし情報取得
ここでは、「python logo」を検索キーワードにしています。
気になる画像検索ワードがあれば、任意で検索結果を表示させましょう。
page_url = "検索結果のURLを貼り付け"
res = requests.get(page_url)
上記のコードでは、page_url変数にURLを代入しています。
また、res変数に.getメソッドを利用し任意のURLへアクセス&情報取得を実施しています。
BeautifulSoupにてサイト情報の解析
取得したサイト情報をBeautifulSoupにて解析します。
soup = BeautifulSoup(res.text)
上記コードでは、soup変数にBeautifulSoupモジュールを利用し、res変数内のサイト情報をテキストデータに変換しています。
print(soup.find_all("img"))
上記のprint関数を利用することで、取得データを確認できます。
また、.find_allメソッドを利用し、imgタグが付与されているサイト情報のみを抽出しています。
imgタグから画像URLのみ抽出
ここから、解析したサイト情報からimgタグが付与された要素のみを抽出していきます。
img_tags = soup.find_all("img")
先ほどのprint関数と同様、.find_allメソッドを活用しています。
img_tagsリスト変数は、この後for文を活用しリスト内を繰り返し処理させます。
img_urls = []
ここでimg_urlsリスト変数を宣言しておきます。
for文で繰り返し処理を実行した際に、抽出した各URLをリスト型データとして格納するためです。
for img_tag in img_tags:
img_url = img_tag.get("src")
if img_url != None:
img_urls.append(img_url)
for文を用いてimg_tagsリスト変数を繰り返し処理させます。
この際、pythonはmリストデータをindex順に処理するため、index順に格納されているデータを取得し、img_tag変数として処理します。
処理の中では、img_tag変数に.getメソッドを活用し、srcタグが付与されている要素(つまりURLデータ)を抽出します。
if文では、img_urlのデータ有無を確認し、データが存在すればimg_urlsリスト変数に格納する処理になります。
各画像URLから画像ダウンロード
download_folder = "download"
予め作成しておいたフォルダ名を変数に格納しています。
このフォルダ内に各画像がダウンロードされます。
for i, img_url in enumerate(img_urls):
img = requests.get(img_url, stream=True)
# ファイル名を番号順にするために、インデックスを利用
img_name = f"image_{i}.jpg"
# ダウンロードフォルダに保存するパスを作成
save_path = os.path.join(download_folder, img_name)
for文を利用し、リストデータであるimg_urlsを処理しています。
また、enumerate関数をfor文で利用することで、リストデータをカウントします。(カウント数はiに格納)
img変数にて画像データを取得しています。
また、ファイル名を統一させ、カウント数を付与しています。
osモジュールを利用し、ダウンロードフォルダ内に保存するパスを作成しています。
ダウンロードした画像をフォルダに保存
最後に、ダウンロードした画像をフォルダに保存する処理を記述します。
with open(save_path, "wb") as f:
f.write(img.content)
print(f"画像をダウンロードしました: {save_path}")
with open関数を利用することで、指定したフォルダへ任意のファイルを格納します。
スクレイピングコード(全体)
import os
import requests
from bs4 import BeautifulSoup
page_url = "検索結果のURLを貼り付け"
res = requests.get(page_url)
soup = BeautifulSoup(res.text)
print(soup.find_all("img"))
img_tags = soup.find_all("img")
img_urls = []
for img_tag in img_tags:
img_url = img_tag.get("src")
if img_url != None:
img_urls.append(img_url)
download_folder = "download"
for i, img_url in enumerate(img_urls):
img = requests.get(img_url, stream=True)
# ファイル名を番号順にするために、インデックスを利用
img_name = f"image_{i}.jpg"
# ダウンロードフォルダに保存するパスを作成
save_path = os.path.join(download_folder, img_name)
with open(save_path, "wb") as f:
f.write(img.content)
print(f"画像をダウンロードしました: {save_path}")
実行結果
Google画像検索で収集・保存・取得するには?
基本的に、2章で記載したプログラムを利用してGoogle検索でも画像収集できます。(実施済み)
ただ、以下のGoogle画像検索時の課題と解決策が挙げられます。
Google画像検索時の課題 | Google画像検索時の解決策 |
---|---|
・動的ページであるため、画面操作が必須 ・src内のURLでエラーが発生するため、try-except文が必要 | ・Seleniumライブラリによる画面操作の処理を追加 ・エラー処理の追加 |
ブラウザ操作による読み込みが処理に追加できれば、全画像取得プログラムが作成できます。
Seleniumにおける各メソッドの使い方を詳細に知りたい人は、「【Python】 Seleniumとは?インストールから使い方まで徹底解説!」を一読ください。
本格的にエンジニアへのキャリアチェンジを考えてる人へ
プログラミングスキルを社内やプライベートで活用している人が増えています。
- 一部業務プロセスの効率化/自動化
- 分析システム構築による担当業務改善
- 社内公開によるチーム/プロジェクトの業務時間短縮
Pythonは特にデータ収集や分析に特化したライブラリが豊富なため、業務プロセスの一元管理やDX化に貢献しています。
また、プログラミングに触れてエンジニアへのキャリアチェンジを実現したい人の人材規模も年々高まっています。
一度、あなたのキャリアプランを振り返ってみてください。
- 収入アップが見込めている
- キャリアアップが見込めている
- 働き方を明確に決めれている
上記の項目をYESと答えられる人は、特に言うことはありません。
現在、エンジニアへのキャリアチェンジでお悩みの方は、「【Python特化】厳選したおすすめプログラミングスクール」を一読ください。
コメント