pythonのbeautifulsoupモジュールを利用して、特定のウェブサイトに
表示されている画像のダウンロードを自動化していきたいと思います。
プログラム使用上の注意点
スクレイピングは、以下の点に注意して利用する必要があります。
- 特定のウェブサイトに短時間で大量にリクエストを送らない。
- 各種Webサービスの規約を順守する。
- 著作権を守る。
それぞれについては後述します。
pythonのソースコード
早速ですが、作成したソースコードは以下です。
参考にした書籍は退屈なことはPythonにやらせよう ノンプログラマーにもできる自動化処理プログラミング [ Al Sweigart ]です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# coding :UTF-8 import requests, os, bs4 # 宣言部 OUT_FOLDER = 'ImageOut' # 保存フォルダ SUB_FOLDER = 'PAGE' # サブフォルダ名 BASE_URL ='' # ベースURL(画像リンクが相対パスだった場合の紐づけ用) URL = 'https://iceagegeneration.com/page/1/' # 開始URL IMG_SEARCH_ATTR = 'dl[class="clearfix"] img' # 画像検索要素文字列 IMG_LINK_ATTR = 'src' # 画像リンク文字列 NEXT_PAGE_ATTR = 'a[class="next page-numbers"]' # 次ページ要素文字列 NEXT_LINK_ATTR = 'href' # 次ページリンク文字列 # 事前準備処理 os.makedirs(OUT_FOLDER, exist_ok=True) # 保存フォルダの作成 page_cnt = 0 # URLページ件数 work_url = URL # 検索開始URLを設定 while not work_url == None or work_url == '' : # 1.URLページのダウンロード print('URLページをダウンロード中{}...'.format(work_url)) res = requests.get(work_url) res.raise_for_status() soup = bs4.BeautifulSoup(res.text ,'html.parser') # 1-1.専用のフォルダの作成 page_cnt+=1 s_folder = os.path.join(OUT_FOLDER, SUB_FOLDER + str(page_cnt)) os.makedirs(s_folder , exist_ok=True) # 保存フォルダの作成 # 1-2.画像リンク群取得 img_links = soup.select(IMG_SEARCH_ATTR) if img_links == []: print('画像を見つけられませんでした。') else: # 1-2-1.取得したリンク数分だけ画像をダウンロード for img_link in img_links: img_url = img_link.get(IMG_LINK_ATTR) print(' 画像をダウンロード中 {}...'.format(img_url.split(r'/')[-1])) res = requests.get(img_url) res.raise_for_status() # 画像の保存 img_file = open(os.path.join(s_folder, os.path.basename(img_url)), 'wb') for chunk in res.iter_content(100000): img_file.write(chunk) img_file.close() # 1-3.次のページがあれば1.へ next_link = soup.select(NEXT_PAGE_ATTR) # 2.最後のページならメッセージを表示して終了。 if next_link == []: print('完了!') break else: work_url = BASE_URL + next_link[0].get(NEXT_LINK_ATTR) |
ソースは、本サイト「氷河期世代の挑戦」からサムネイル画像を
取得するようになっています。
他のサイトで利用する場合の修正箇所は後述します。
(サムネイル画像は、タダピクから頂いたものです。
本記事は画像の再配布を目的としたものではありません。)
事前準備
動作には以下の事前準備が必要です。
項目名 | 内容 |
pythonのインストール | python3x系を利用しています。 動作確認環境は3.8.0です。 |
beautifulsoup4モジュールの導入 | 次のコマンドを実行します。 pip install beautifulsoup4 |
プログラムの簡単な解説
基本的に同様の作りのウェブサイトであれば、以下の宣言部の値を
調整すれば動作するようになっています。
修正内容 | 修正箇所 |
画像取得元 ウェブサイト | 修正前: URL = ‘https://iceagegeneration.com/page/1/‘ 修正後: URL = ‘[画像取得元ウェブサイトのURL]‘ |
画像検索要素 文字列 | ウェブページ上で画像が設定されている CSSセレクタ(※1)を指定します。 修正前: IMG_SEARCH_ATTR = ‘dl[class=”clearfix”] img‘ 修正後: IMG_SEARCH_ATTR = ‘[画像検索要素文字列]‘ |
画像リンク 文字列 | 修正前: IMG_LINK_ATTR = ‘src‘ 修正後: IMG_LINK_ATTR = ‘[画像リンク文字列]‘ |
ベースURL (※2) | 修正前: BASE_URL =” 修正後: BASE_URL =’[ベースURL]‘ |
次ページ要素 文字列 | ウェブページ上で「次へ>>」リンクが設定されている CSSセレクタ(※1)を指定します。 修正前: NEXT_PAGE_ATTR = ‘a[class=”next page-numbers”]‘ 修正後: NEXT_PAGE_ATTR = ‘[次ページ要素文字列]‘ |
次ページリンク 文字列 | 修正前: NEXT_LINK_ATTR = ‘href‘ 修正後: NEXT_LINK_ATTR = ‘[次ページリンク文字列]‘ |
(※1)
ウェブページのHTMLを解析して確認します。
HTMLの解析には、開発者ツールを利用するのが一般的です。
開発者ツールはWindowsのGoogle ChromeやInternet Explorer Edge上で、
F12キーを押すと開きます。
(※2)
画像リンクが相対パスで指定されている場合に指定します。
参考にした書籍について
退屈なことはPythonにやらせよう ノンプログラマーにもできる自動化処理プログラミング [ Al Sweigart ]
pythonの入門書として購入しました。
やりたい事やちょっとした調べものをしたいときに利用しています。
実は全文が英語のサイトで公開されているのですが、
私には英語の素養が無く、都度都度Google翻訳に頼るのも時間が掛かる為、
購入しました。
書籍内にも記載されている通り、プログラマ向けと言うよりかは、
初心者向けに記載されている内容なので躓くことなく利用が出来ています。
使用上の注意点
特定のウェブサイトに短時間で大量にリクエストを送らない
スクレイピングそのものは違法ではありませんが、
短い時間に大量にアクセスを試みた場合、サーバーに負荷をかけることになり、
場合によっては、ウェブサイトを表示しているシステムに問題が生じることがあります。
それが悪質だと判断された場合、岡崎市立中央図書館事件の様に
逮捕されることがあるかもしれません。
あくまで常識の範囲で利用するようにご注意ください。
各種Webサービスの規約を順守する
また、スクレイピングをする先のウェブサイトに、
スクレイピングによる情報収集などを禁止する規約がある場合、
その事業者から規約違反によるサービス利用の停止や損害賠償請求などを
求められる可能性があります。
著作権を守る
著作権については、あえて説明の必要はないでしょう。
スクレイピングにより得た情報に著作権がある場合、
無断の配布や加工は犯罪になる可能性があります。
コメント