【コード公開】【Python】スクレイピングで特定URL内の画像を丸ごと収集





今回、作成するプログラムはPythonによるWebスクレイピング〜画像丸ごと編〜です。
下記に特定の画像情報がわかるURLから取得する方法をリンクとして貼っておきます。

【コード公開】【初心者のためのPython入門】Webスクレイピング〜画像データのダウンロード〜

2017.07.22

 

上記のものはかなり局所的なプログラムですが、今回のプログラムは特定のURL内の画像を丸ごと収集するよう作成しています。

より、使いやすいプログラムでかつ大量のデータを瞬時に取得できることを目的として記述しました。
参考にするもよし、コピってすぐに利用するのもよしです。お役に立てれれば幸いです。

 

 
 
また、pythonをこれから本格的に学習する人は、目的を持って学習する必要があります。
 
 
こちらでは、3ヶ月間を利用して基礎学習から稼ぐまでの学習ロードマップをまとめてみましたので、本記事と合わせて一読して頂けたら幸いです。
 
 

プログラミング学習の始め方〜3ヶ月で稼ぐには〜

2019.11.15
 
 
更に実践的な稼ぎ方についてはこちらの記事をご参照ください。
 
 

プログラミング言語Pythonを活用して稼いでみた〜ココナラ編〜

2019.11.04
 
 

独学に限界を感じたなら...
とりあえず独学でプログラミング学習を始めたけど、右も左も分からずあなたの時間が無駄に終わるどころか挫折するかもしれません。

あなたが時間を無駄にした分を回収したいなら【Python】2022年最新!おすすめのオンラインプログラミングスクールをご確認ください!

※期間限定で学習ロードマップを記載しています!

プログラムの流れについて

 

今回、作成したプログラムの各処理の流れを記載します。

■ 各処理の流れ
1. 各モジュールをインポート
2. 解析したURLとリスト用変数を準備
3. BeautifulSoupにてURLを解析
4. for文にてfind_all()メソッドで取得したデータをリスト用変数に格納
5. リスト用変数からimgフォルダへ格納

 

各処理の説明

 

各処理の説明の前に、必要なモジュールをインストールしておきましょう。
今回利用するものは、requests, BeautifulSoup, lxmlです。

pip install xxxxでインストールしちゃってください。

 

import requests # urlを読み込むためrequestsをインポート
from bs4 import BeautifulSoup # htmlを読み込むためBeautifulSoupをインポート

ここでは、利用するモジュールをインポートします。

 

URL = 'https://su-gi-rx.com' # URL入力
images = [] # 画像リストの配列

ここでは、任意のURLを入力してください。(例として私のブログサイトを記載しています。)
次に、画像データを格納するためのリスト用変数を準備しておきます。

 

soup = BeautifulSoup(requests.get(URL).content,'lxml') # bsでURL内を解析

次に、読み込んだ特定のURLをBeautifulSoupにてlxmlパースし、soup変数に格納します。

 

for link in soup.find_all("img"): # imgタグを取得しlinkに格納
    if link.get("src").endswith(".jpg"): # imgタグ内の.jpgであるsrcタグを取得
        images.append(link.get("src")) # imagesリストに格納
    elif link.get("src").endswith(".png"): # imgタグ内の.pngであるsrcタグを取得
    	images.append(link.get("src")) # imagesリストに格納

ここでは、for文にてsoup変数内のデータからfind_all()メソッドを利用して、imgタグを取り出し、link変数に格納します。
ifでは、link変数内のjpgデータとpngデータにあるsrcタグを取得し、リスト用変数imagesに格納します。

 

for target in images: # imagesからtargetに入れる
    re = requests.get(target)
    with open('img/' + target.split('/')[-1], 'wb') as f: # imgフォルダに格納
        f.write(re.content) # .contentにて画像データとして書き込む

ここでは、for文にてリスト用変数内の画像データを読み込むために、一度変数targetに格納し、requests.get()メソッドにて画像データを読み込み、変数reに格納します。注意ですが、あらかじめローカルフォルダであるimgフォルダは作成しておく必要がありますので、準備しておいてください。

そして、変数reに格納した画像データをimgフォルダ内に格納します。このとき、パス名を取得するため、保存名が長くなるのが億劫なので、パス名の一番最後(画像名に当たる部分)を保存名にするためsplit()メソッドで処理を入れています。

 

write()メソッドにて格納する画像データを書き込むわけですが、変数reに.contentを使用しないとデフォルトで拡張子が.txtになってしまうため、避けるために.contentを利用します。

最後に、print(“ok”)などでプログラムが終わった確認を付け加えてあげるのも個人的にはいいかもです。

 

★ scraping-img-1.py

# scraping-img-1.py

import requests # urlを読み込むためrequestsをインポート
from bs4 import BeautifulSoup # htmlを読み込むためBeautifulSoupをインポート

URL = 'https://su-gi-rx.com' # URL入力
images = [] # 画像リストの配列

soup = BeautifulSoup(requests.get(URL).content,'lxml') # bsでURL内を解析

for link in soup.find_all("img"): # imgタグを取得しlinkに格納
    if link.get("src").endswith(".jpg"): # imgタグ内の.jpgであるsrcタグを取得
        images.append(link.get("src")) # imagesリストに格納
    elif link.get("src").endswith(".png"): # imgタグ内の.pngであるsrcタグを取得
    	images.append(link.get("src")) # imagesリストに格納

for target in images: # imagesからtargetに入れる
    re = requests.get(target)
    with open('img/' + target.split('/')[-1], 'wb') as f: # imgフォルダに格納
        f.write(re.content) # .contentにて画像データとして書き込む

print("ok") # 確認

 

処理結果

また、今後もプログラミングに取り組み続けていく中で、実務に利用できる学びを身につけていかなければなりません。

実務に活かす際に学習として利用していたPython本が以下のものになります。

・PythonによるWebスクレイピング(オライリー出版)

・増補改訂Pythonによるスクレイピング&機械学習 開発テクニック(クジラ飛行机)

・Pythonクローリング&スクレイピング – データ収集・解析のための実践開発ガイド

プログラミング学習で作りたいものがない場合

独学・未経験から始める人も少なくないので、プログラミング学習の継続や学習を続けたスキルアップにはそれなりのハードルが設けられています。

また、プログラミング学習においても、学習者によってはすでに学習対象とするプログラミング言語や狙っている分野が存在するかもしれません。

そのため、費用を抑えて効率的にピンポイント学習で取り組みたいと考える人も少なくありません。

また、プログラミング学習において目的を持って取り組むことは大切ですが、『何を作ればいいかわからない。。』といったスタートの切り方で悩む人もいると思います。

そういったプログラミング学習の指標となる取り組み方について詳細に記載したまとめ記事がありますので、そちらも参照して頂けると幸いです。

プログラミングを学ぶ上で作りたいものがない人へ提案させてください

2019.11.21



ABOUTこの記事をかいた人

sugi

大学卒業後、IT企業に就職を果たす。システム開発・人工知能に触れながら大手企業と業務をこなす。2年半後脱サラし、フリーランス活動経験を経て 2019年2月から起業し、今に至る。 自社サービス及び製品を開発、ブログ収入、クラウドソーシングなど、多方面で売り上げを立てている。