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

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

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

## はじめに

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

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

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


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/624ed10f-2ecb-cc07-65e8-9ee516d56799.png)

https://ameblo.jp/pero0921/entrylist.html




## セットアップ

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

```shell
pip install beautifulsoup4 requests
```

## コード

```python
#!/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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/4dcc71ec-583e-a665-8b9f-3a3d52795783.png)

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

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

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

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

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

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

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


## 参考にしたサイト
http://everykey.sakura.ne.jp/wp/note/?p=147

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

こんなふうにコードを渡すと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/c66b26f2-84b0-27f2-e9ae-665a2e16cf33.png)

意図をくみ取ってくれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/2e301d11-1f5c-fdff-59d6-96ea58979092.png)

読みやすいコードにしてくれと書くと、コードを整形してくれるし、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/f5c11a7c-f5b0-c28e-ad43-a0dddb8c3a5a.png)

ブログ用の記事にしてくれと書くと、まとめてくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/0e6d3f3b-cdb9-50af-41c7-c6fd54292288.png)

日本語にしてくれと書くと、翻訳もしてくれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/72848295-a917-4250-639d-f1cd0d7de0ba.png)

すごい時代だ。