[pukiwiki]
たまにプレーンテキスト中にttp://~みたく書かれてるurlをまとめてダウンロードしたいときがあるので、Pythonでダウンローダを書いてみました。
[/pukiwiki]
[pukiwiki]
以前の記事 [[wxPythonでドラッグ&ドロップ+クリップボード:http://boxheadroom.com/2008/10/06/wxpython_dd_clipboad]]
を殆ど流用。
ちゃんとしたモジュールにまとめて再利用しやすくしないとダメですねぇ
-起動すると小さいウィンドウが開きます。
テキストエリアへ、urlを含んだログをコピペ、もしくはドラッグ&ドロップ
-ダウンロードボタンを押してダウンロード開始。
終了しても、特に何もしないのでわかりにくいです(すんません)
-スクリプトファイルの置かれた直下にdownloadという名前のフォルダを掘って保存。
-ファイル名はurlをurllib2.quoteでエンコードしたものをそのまま使用。
-jpgとzipのみurlを抽出。 必要に応じて、適当に増やしてください
[/pukiwiki]
# -*- coding: utf-8 -*- #DropDownload.py import os import wx import urllib2 import re import time import glob class MyTextDropTarget(wx.TextDropTarget): def __init__(self, WinObj): wx.TextDropTarget.__init__(self) self.WinObj = WinObj def OnDropText(self, x, y, text): self.WinObj.AppendText("\n") self.WinObj.AppendText(text) class MyApp(wx.PySimpleApp): opener = urllib2.build_opener() opener.addheaders = [("User-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)")] def OnInit(self): if not os.path.exists("download"): os.mkdir("download") Frm = wx.Frame(None, -1, "wxPython", size=(450, 150),pos=(850,700)) #うちの環境にあわせて座標を決め打ちしてあります。適当に直してください #デスクトップサイズの取得などは勉強中。。。 self.Btn = wx.Button(Frm, -1, u"ダウンロード") self.Btn.Bind(wx.EVT_BUTTON, self.OnButton) self.TxtCtrTo = wx.TextCtrl(Frm, -1, u"", pos=(10,30),\ size=(430,70),\ style=wx.TE_MULTILINE|wx.HSCROLL|wx.TE_PROCESS_ENTER) Frm.SetDropTarget(MyTextDropTarget(self.TxtCtrTo)) #Frm.SetTransparent(200) Frm.Show() return 1 def OnButton(self,event): t=self.TxtCtrTo.GetValue() # jpgとzipのみ。適当に増やしてください #re.sub(r"(ttp://|\s)(?P[^:]*?\.(jpg|zip))\s",self.httpdownload,t) re.sub(r"ttp://(?P [^:]*?\.(jpg|zip))\s",self.httpdownload,t) #クリップボードへ #生の文字列ではなく、wx.TextDataObjectへ変換する必要がある self.TxtCtrTo.AppendText("\ndone\n\n") def httpdownload(self,a): u=a.groupdict()["url"] uri="http://%s"%u fname="download\\%s"%urllib2.quote(u,safe="") if os.path.exists(fname): #同名のファイルが存在し、且つ24時間以内にダウンロードしたものならスキップ t=os.stat(fname)[-2] dt=time.time()-t if dt<(24*60*60): return l=fname.split(".") ext=l[-1] l.pop() bd="".join(l) #24時間以上経過した同名ファイルが存在したら、時刻文字列を付加 #必要ないときはreturn idx=time.strftime("%Y%m%d%H%M%S",time.localtime()[:9]) fname="%s+%s.%s"%(bd,idx,ext) print "*",fname if os.path.exists(fname): print "fname error" return print uri op=self.opener.open(uri) dat=op.read() fp=open(fname,"wb") fp.write(dat) fp.close() time.sleep(5) app = MyApp() app.MainLoop()