Pythonを使って画像や動画のリンクをスクレイピングしてそれをメディアとして保存したい。
Beautiful Soupの準備
Beautiful Soup は、Web ページから情報を簡単に収集できるライブラリですがこれがインストールされてない場合があるので、pipをつかってインストールします。コマンドラインツールをひらいて以下のコマンドでインストール↓
pip install beautifulsoup4
ページにある画像や動画のリンクをスクレイピングしてメディアとして保存するPythonコード
import requests, os
from bs4 import BeautifulSoup
url = 'https://exsample.ocm'
download_folder = ''
os.makedirs(download_folder, exist_ok=True)
# ページをダウンロードする
res = requests.get(url)
res.raise_for_status()
soup = BeautifulSoup(res.text, 'html.parser')
# 画像や動画のリンクを抽出する
link_tags = soup.find_all('a', href=True)
valid_extensions = ['.jpg', '.png', '.gif', '.mp4']
for link_tag in link_tags:
link = link_tag['href']
link_extension = os.path.splitext(link)[1].lower()
if link_extension in valid_extensions:
# ファイル名を取得
file_name = os.path.basename(link)
file_path = os.path.join(download_folder, file_name)
# ファイルをダウンロード
print(f"ダウンロード中 {link} -> {file_path}")
with open(file_path, 'wb') as file:
file_data = requests.get(link).content
file.write(file_data)
print('完了')
コードの解説
18行目: link = link_tag[‘href’] はhref属性を指定することでリンクのURLを取得しています。
19行目: link_extension = os.path.splitext(link)[1].lower() これはsplitext()を使うことによってURLの拡張子を含む部分と拡張子を除いた部分に分割しています。[1]番を指定しているので拡張子を取得しているということになります。
20行目: if link_extension in valid_extensions: はURLに特定の拡張子があったら処理するというロジックですね。
23行目: file_path = os.path.join(download_folder, file_name) はファイルを保存する場所を指定しています。(正確にはファイルを保存するパスを作成しています)
27行目からが実際にメディアとして保存している部分です。requests.get(link).content で、指定した URL (link) からデータを取得します。.content はレスポンスオブジェクトからバイナリデータを取得します。file.write(file_data) で、取得したバイナリデータ file_data をファイルに書き込みます。
プログラムで作成したdownloaded_filesディレクトリはどこに作成される?
downloaded_filesディレクトリに関しては特に場所を指定してないのでスクリプトファイルがある場所に作成されます。もしディレクトリが作成される場所を指定したい場合は絶対パスで作成場所を指定します。
download_folder = '/path/to/your/downloaded_files' # 保存先ディレクトリの絶対パスを指定
まとめ
PythonのBeautifulSoupを使用してページの画像リンクをメディアとして保存する方法を紹介しました。フリーの画像ダウンローダー等はあると思いますが、リンクから画像を保存するツールやフリーソフトはあまり見かけないきがしたので、Pythonでわりと簡単にコードがかけるということで紹介してみました。
参考
実は似たような記事を昔かいていたんですが: Pythonで画像をスクレイピングするサンプルコード
上記の記事はページ上にあるBeautifulSoupでページ上の画像(imgタグ)を見つけて、src属性の値を取得してローカルに保存しています。やっていることはほとんど同じですが、今回の記事の場合はリンクのhref属性に画像や動画の拡張子があった場合に保存する処理をしています。
コメント