2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ぺろりん先生のブログをPythonによるWeb Scrapingで画像収集してみた。

Last updated at Posted at 2023-05-31

Pythonを使用したブログからの画像スクレイピングとダウンロード

このブログ記事では、Pythonスクリプトを使用してブログから画像のURLをスクレイピングし、画像をローカルディレクトリにダウンロードする方法を探ります。スクリプトは、HTMLの解析にBeautifulSoupライブラリを使用し、HTTPリクエストの送信にはrequestsライブラリを使用します。それでは、コードに入ってみましょう!

はじめに

ぺろりん先生こと鹿目凛さんは僕の推しメンですが、
2022年の1月から毎日ブログを更新していて、2023年5月31日現在でも継続されています。

その結果、データ収集やデータ解析ができるくらいのビックデータになったので、
こうして解析の記事を作成させていただいています。

また、プログラミングのコードや記事については、chatGPTを使っています。

image.png

セットアップ

始める前に、必要なライブラリがインストールされていることを確認してください。pipを使用してインストールできます:

pip install beautifulsoup4 requests

コード

#!/usr/bin/python
# -*- coding: utf-8 -*-

from bs4 import BeautifulSoup
import requests
import time
import os

# ダウンロードした画像を保存するディレクトリを作成します
output_directory = 'path/to/save/images'
os.makedirs(output_directory, exist_ok=True)

# ダウンロードした画像のカウンター
cnt = 1

# ページが続くかどうかを示すフラグ
next_flg = True

# ブログの各ページを処理するまで繰り返します
page = 1
while next_flg:
    # 現在のページのURLを構築します
    list_url = 'https://ameblo.jp/pero0921/entrylist-' + str(page) + '.html'
    
    # ページのコンテンツを取得するためのリクエストを送信します
    response = requests.get(list_url)
    html = response.text
    soup = BeautifulSoup(html, "html.parser")

    # ページ内のすべてのエントリータイトルを検索します
    h2s = soup.find_all('h2', attrs={'data-uranus-component': 'entryItemTitle'})
    
    # 各エントリーのURLを抽出します
    urls = []
    for h2 in h2s:
        url = h2.find('a').get('href')
        urls.append("https://ameblo.jp" + url)
    
    # デバッグのために抽出されたURLを表示します
    print(urls)

    # ページ内の各エントリーのURLを処理します
    for url in urls:
        time.sleep(1)
        cnt += 1

        # エントリーコンテンツを取得するためのリクエストを送信します
        response_i = requests.get(url)
        html_content = response_i.text

        # エントリーのHTMLコンテンツを解析します
        soup_content = BeautifulSoup(html_content, 'html.parser')

        # エントリーの本文を検索します
        div = soup_content.find("div", class_='skin-entryBody')

        # 画像が見つからない場合、次のエントリーにスキップします
        if div.find_all('a') is None:
            print("エントリーに画像が見つかりませんでした")
        else:
            # エントリーから画像のURLを収集します
            links = div.find_all('a')
            img_urls = []
            for a in links:
                u = a.get('href')
                if u.split('.')[-1] == 'jpg':
                    img_urls.append(u)

            # 各画像をダウンロードして保存します
            for i, img_url in enumerate(img_urls):
                try:
                    res = requests.get(img_url, allow_redirects=False)
                    image = res.content
                    name = str(cnt) + "blog" + str(i + 1)
                    ext = img_url.split(".")[-1]
                    f = open(output_directory + name + "." + ext, "wb")
                    f.write(image)
                except:
                    print("画像のダウンロード中にエラーが発生しました")

    # 次のページがあるかどうかをチェックします
    page_class = len(soup.find('a', attrs={'data-uranus-component': 'paginationNext'}).get('class'))
    if page_class != 3:
        next_flg = False
        break

    page += 1

出力結果

指定したファイルに画像が保存されています。
4717枚のダウンロードでおよそ30分かかりました。

image.png

動作原理

  • スクリプトは、ダウンロードした画像を保存するディレクトリを設定することから始めます。カウンターとフラグを初期化し、画像のダウンロードと処理するページがあるかどうかを追跡します。

  • スクリプトは、whileループを使用して、ページがなくなるまでブログの各ページを反復処理します。各ページでは、URLを構築し、リクエストを送信してページのコンテンツを取得します。BeautifulSoupを使用してHTMLの応答を解析します。

  • スクリプトは、各エントリーのURLを抽出し、リストに保存します。その後、各エントリーのURLを反復処理し、リクエストを送信してエントリーコンテンツを取得し、BeautifulSoupで解析します。

  • 各エントリー内で、スクリプトはエントリー本文を検索し、画像があるかどうかを確認します。画像が見つかれば、画像ファイルのURLを収集します。スクリプトは、画像のURLにリクエストを送信し、レスポンスのコンテンツをファイルに書き込むことで、各画像をダウンロードして保存します。

  • 各エントリーの処理が終わった後、スクリプトはHTML内のページネーション要素を調査して次のページがあるかどうかを確認します。次のページがあれば、ページ番号を更新してwhileループの次の繰り返しに進みます。

結論

このブログ記事では、Pythonスクリプトを使用してブログから画像のURLをスクレイピングし、画像をローカルディレクトリにダウンロードする方法を紹介しました。
HTMLの解析にはBeautifulSoupを、HTTPリクエストの送信にはrequestsを使用しました。
このスクリプトは、ブログからの画像スクレイピングタスクを自動化するための良い出発点となるでしょう。
必要に応じてコードを変更やカスタマイズして、特定の要件に合わせて使用してください。

このブログ記事がお役に立てれば幸いです。楽しいプログラミングを!

参考にしたサイト

おまけ

chat GPTを使ったコード/ブログの作成について

こんなふうにコードを渡すと
image.png

意図をくみ取ってくれる
image.png

読みやすいコードにしてくれと書くと、コードを整形してくれるし、
image.png

ブログ用の記事にしてくれと書くと、まとめてくれる。
image.png

日本語にしてくれと書くと、翻訳もしてくれる
image.png

すごい時代だ。

2
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?