PythonでWebページから画像をスクレイピングする

どうも。binaryです。
もうすぐTwitter APIが有料化されてしまい、画像収集等ができなくなってしまいますね。
困ります。
そこで今回はPythonを使ってWebページから画像をスクレイピングしていきたいと思います。
車の写真がまとまっているサイトから拝借したいなと思ったりしています。
しかし、しっかりと規約等を確認しながら行わないと違法行為になりかねないので気を付けてください。
それではやってみましょう。

環境構築

今回は特定のサイトに埋め込まれている画像へのリンクを取得し、そのリンクから画像を取得するような仕組みにしたいと思います。
私は以下の環境で動かしています。

  • Windows 10 or 11
  • Python 3.9

コード実装

コードを書いていきます。まずは、インポートから。

import requests
import os
from bs4 import BeautifulSoup

次に変数の初期化です。

page_url = 'URL'
url_sp = page_url.split("/")
url_np = url_sp[len(url_sp)-1].split(".")


img_urls = []

# ダウンロード先ファイルの参照
save_dir = "./image/"

URLの一部をファイル名に持ってくるために”/”で分割しています。

url_sp = page_url.split("/")
url_np = url_sp[len(url_sp)-1].split(".")

この辺りは取得するサイトのURL規則に合わせてカスタマイズした方がいいと思います。

次に画像ダウンロード用の関数を作成しておきます。

def download_image(url, file_path):
    r = requests.get(url, stream=True)

    if r.status_code == 200:
        with open(file_path, "wb") as f:
            f.write(r.content)

次にrequestsでURL先をダウンロードして、BeautifulSoupでimgタグをとってきます。

r = requests.get(page_url)
soup = BeautifulSoup(r.text)

img_tags = soup.find_all("img")

次にimg_tags内に入っている画像のURLを抽出し、URLのリストに格納していきます。

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

最後に先程抽出したURLのリスト内の画像を取得していきます。

for index, url in enumerate(img_urls):
    file_name = url_np[0] + "_{}.jpg".format(index)
    print(file_name)
    image_path = os.path.join(save_dir, file_name)
    print(image_path)

    download_image(url=url, file_path=image_path)

といった感じで私は実装しています。

いかがだったでしょうか。
思っていたよりも簡単に出来るもんだなぁと思いました。
これで当分は画像取得に困らないですね。
一番最後にコード全体を置いておきます。
それでは、また。

参考サイト

pythonで画像のスクレイピング
Pythonスクレイピングによる画像ダウンロード

コード全体

import requests
import os
from bs4 import BeautifulSoup

page_url = 'URL'
url_sp = page_url.split("/")

url_np = url_sp[len(url_sp)-1].split(".")
img_urls = []


# ダウンロード先ファイルの参照
save_dir = "./image/"

def download_image(url, file_path):
    r = requests.get(url, stream=True)

    if r.status_code == 200:
        with open(file_path, "wb") as f:
            f.write(r.content)

r = requests.get(page_url)
soup = BeautifulSoup(r.text)

img_tags = soup.find_all("img")

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

for index, url in enumerate(img_urls):
    file_name = url_np[0] + "_{}.jpg".format(index)
    print(file_name)
    image_path = os.path.join(save_dir, file_name)
    print(image_path)

    download_image(url=url, file_path=image_path)

コメント

タイトルとURLをコピーしました