Python バックエンド プログラム言語

Pythonでスクレイピングして画像を一括ダウンロードするサンプル

こんにちは!TodoONadaの土門(@daikidomon)です。

Pythonの基礎学習が終わってやりたいことの一つはWebサイトのスクレイピングだと思います。

この記事ではスクレイピング機能だけにフォーカスしてなるべく簡単にコーディングしております。

手順を元に1ステップずつ試してみていただければ幸いです。

スクレイピングで準備するライブラリとインストール

Pythonでスクレイピングをするために必要なライブラリは以下になります。

  • BeautifulSoup:HTML/XML形式のファイルを解析するためのライブラリ
  • requests:シンプルなHTTPリクエストを生成できるライブラリ
  • lxml:より高速にHTML/XML形式を解析できるライブラリ。Beautifulsoupで呼び出して使用。

それぞれ標準ライブラリではないので、個別にインストールする必要があります。

インストール方法は以下です。

pip install beautifulsoup4
pip install requests
pip install lxml

スクレイピングで画像のダウンロードの解説

スクレイピングを始めてやる方のために今回の大まかな流れを説明したいと思います。

  1. Webページをurlで取得する。(requestを使う)
  2. 取得したWebページをスクレイピングできる形にする。(lxmlでhtmlページを解析してスクレイピングできるようにします。)
  3. タグを指定してスクレイピングする。(BeautifulSoup().find_all())
  4. スクレイピングした画像を指定したフォルダ内に保存する。

 

そして、今回実際に画像をダウンロードするために使用するのは、Neverまとめにします。

【画像集】 天使すぎる!橋本環奈 350枚以上 【グラビア・壁紙】

の画像をまとめてダウンロードしたいと思います。

 

下準備としてダウンロードする先のディレクトリを作成してください。

今回は、picturesフォルダを作成します。

pictures

というディレクトリを作成します。

 

まず使用するモジュールをインポートします。

import requests
from bs4 import BeautifulSoup

注意:lxmlはBeautifulsoupで内部的に利用するためインポートは不要です。しかしインストールしないとエラーが出るのでお気をつけください。

 

次に画像をダウンロードするサイトのURLを指定してwebページを取得します。

# url指定
url ="https://matome.naver.jp/odai/2142601541756442401?&page=1"

# web取得
response = requests.get(url)

 

その後取得したWebページをスクレイピングできる形にします。

# webページ解析
soup = BeautifulSoup(response.content,'lxml')

 

解析後にどのタグで画像を対象とすれば良いのか確認します。

対象の画像のクラス名はデベロッパーツールで確認します。

このページの場合、橋本環奈さんの画像がクラス名にすべてMTMItemThumbで管理されているため、こちらを利用します。

下の番号順に実施してみましょう。

 

解析後タグを指定してスクレイピングします。

# imgタグのクラスMTMItemThumbを指定
images = soup.find_all('img',class_='MTMItemThumb')
# スクレイピングした画像(imgタグ,MTMItemThumbクラス)を一つずつ取り出す。
for target in images:
    #各タグのsrcタグを取得
    re = requests.get(target['src'])

 

最後に指定したフォルダに指定した名前として画像を保存します。

i = 1
for target in images:
    re = requests.get(target['src'])
    # 取得した画像を同じディレクトリのpicturesフォルダを開けてimg_数字として保存します
    with open(str('./pictures/')+"img_"+str(i)+str('.jpeg'), 'wb')as f: 
        # 保存します
        f.write(re.content)
    i += 1

 

ここまでやってきたことを全てまとめると以下のコードになります。

import requests
from bs4 import BeautifulSoup

url ="https://matome.naver.jp/odai/2142601541756442401?&page=1"

response = requests.get(url)
soup = BeautifulSoup(response.content,'lxml')
images = soup.find_all('img',class_='MTMItemThumb')
i = 1
for target in images:
    re = requests.get(target['src'])
    with open(str('./pictures/')+"img_"+str(i)+str('.jpeg'), 'wb') as f: 

        f.write(re.content)
    i += 1
print("finished")

スクレイピングで全画像ダウンロードをするためのサンプルコード

今スクレイピングしたウェブページを見ると1ページ目、2ページ目...とページネーション化されております。

前章でスクレイピングをしたurlを確認と”https://matome.naver.jp/odai/2142601541756442401?&page=1”となっており、

実際2ページ目に遷移するとurlは”https://matome.naver.jp/odai/2142601541756442401?&page=2”です。

urlに渡すパラメータ"%page=XX"を変更することで全部の画像をダウンロードすることができます。

 

なので複数ページ(ページ指定する)をスクレイピングは上のコードをページごとに実行します。

for i in range(開始ページ番号,終わりページ番号+1)
    url ="https://matome.naver.jp/odai/2142601541756442401?&page=%d"
    response = requests.get(url%i)
    ・
    ・
    ・

 

今回のページネーション数は最終ページは12であるため、それを考慮すると以下のコードになります。

import requests
from bs4 import BeautifulSoup

n = 1
for i in range(1,13):
    url ="https://matome.naver.jp/odai/2142601541756442401?&page=%d"

    response = requests.get(url%i)
    soup = BeautifulSoup(response.content,'lxml')
    images = soup.find_all('img',class_='MTMItemThumb')

    for target in images:
        re = requests.get(target['src'])
        with open(str('./pictures/')+'img_'+str(n)+str('.jpeg'), 'wb') as f:
            f.write(re.content)
        n += 1
            
print("finished")
# finished

 

結果、橋本環奈さんの画像が一括でダウンロードすることが出来ました。

 

関連記事

-Python, バックエンド, プログラム言語

Copyright© スタートアップIT企業社長のブログ , 2020 All Rights Reserved.