Pythonで特定のWebページ内に含まれる画像をダウンロードするスクリプトを書いてみました。
前まではPythonはあまり好きじゃなかったんですが、最近卒業研究で必要に迫られて使う内にPythonの便利さや良さが分かって来ました。
これで2次画像やエロ画像を右クリックで延々と保存し続けることなく済みそうです(むしろなぜ今までそんな無駄なことをやっていたのか疑問)。このスクリプトを元にもっと簡単に使えるようにwxPythonを使ったGUIアプリケーションを作ろうと思います。
ソースコードは以下です。URL部分は各自で書き換える必要があります。
#!/usr/bin/python #-*- coding:utf-8 -*- # パッケージのimport import os import sys import re import urllib2 # 変数 url = "WebページのURL" # WebページのURL title = "" # Webページのタイトル img_tag = [] # imgタグのリスト img_url = [] # 画像URLのリスト img_path = os.getcwd() + "/downloads" # ダウンロードした画像の保存パス # 正規表現 pat_title = re.compile('<title>(.*?)</title>') # ページタイトルを抜き出す pat_a1 = re.compile('<a[\s]*href[\s]*=.*?>') # aタグを抜き出す pat_a2 = re.compile('href[\s]*="(.*?)"') # URL先を抜き出す pat_img1 = re.compile('<img[\s]*src[\s]*=.*?>') # imgタグを抜き出す pat_img2 = re.compile('src[\s]*="(.*?)"') # 画像元URLを抜き出す pat_img3 = re.compile('.+/(.*)') # 画像ファイル名をURLから決定 img_format = [".jpg", ".png", ".gif", ".bmp"] # 画像ファイル形式 # 関数定義 # 画像をダウンロードする関数 def image_download(url, output): opener = urllib2.build_opener() req = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"}) img_file = open(output, 'wb') img_file.write(opener.open(req).read()) img_file.close() """ これ以降はHTMLページの取得画像のダウンロード処理 """ # HTMLページを取得しリストに格納 req = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"}) con = urllib2.urlopen(req) html = con.read() # ページタイトルを取得 m = pat_title.search(html) title = m.group(1) # 画像をダウンロードするディレクトリ名 dl_path = img_path + "/" + title # ページタイトルと同名のディレクトリを作成する if not os.path.exists(dl_path): os.makedirs(dl_path) # ディレクトリ権限の変更 os.chmod(img_path, 0777) os.chmod(dl_path, 0777) # 正規表現を利用してaタグ, imgタグを抜き出してリストに格納 a_tag = pat_a1.findall(html) img_tag = pat_img1.findall(html) # aタグのリストから画像のURLを抜き出す for i in a_tag: # URLを抜き出す m = pat_a2.search(i) # 取得オブジェクトがNoneでない場合に処理を行う if not m is None: # URLの取得 tmp = m.group(1) # 画像フォーマットが一致すればリストに追加 for j in img_format: if tmp.find(j) > -1: img_url.append(tmp) break # imgタグのリストから画像のURLを抜き出す for i in img_tag: # URLを抜き出す m = pat_img2.search(i) # 取得オブジェクトがNoneでない場合に処理を行う if not m is None: tmp = m.group(1) # 画像フォーマットが一致すればリストに追加 for j in img_format: if tmp.find(j) > -1: img_url.append(tmp) break # 画像URLのリストから実際の画像をダウンロードする for i in img_url: # 画像ファイル名を決定 m = pat_img3.search(i) name = m.group(1) output = dl_path + "/" + name # 画像のダウンロード image_download(i, output)
参考にしたページを以下に列挙します。
pythonで画像保存(ログインもする) - わーくあうと!
ファイルシステム操作 - python入門から応用までの学習サイト
Pythonでの正規表現の簡単なまとめ - minus9dの日記
[python]os.chmod - メモ@inudaisho
Python: Attribute Error - 'NoneType' object has no attribute 'something' - Stack Overflow
他にも参考にしたページは結構あったのですが、ブックマークし忘れがあり、全てを列挙できないためここまでとします。