Skip to content

Instantly share code, notes, and snippets.

@PyYoshi
Created September 25, 2011 17:35
Show Gist options
  • Select an option

  • Save PyYoshi/1240876 to your computer and use it in GitHub Desktop.

Select an option

Save PyYoshi/1240876 to your computer and use it in GitHub Desktop.
Python製ダウンローダー require:wxPython
# -*- coding:utf-8 -*-
#!/usr/bin/env python
# fork: http://snippets.dzone.com/posts/show/2887
# History:
# 0.1: first commit
# 0.2: add overwrite mode
#
__AUTHOR__ = 'PyYoshi'
__LICENCE__ = 'MIT'
__VERSION__ = '0.3'
import urllib2
import os
import sys
import datetime
class ProgressBar:
def __init__(self,totalNum,url):
self.totalNum = totalNum
self.url = url
self.counter = 0
self.chr = u"*"
self.width = 40
sys.stdout.write('Downloading: '+ self.url+ '\n')
sys.stdout.flush()
def addCounter(self,incrementNum):
self.counter += incrementNum
def retPercentage(self):
percentage = 100 * self.counter / self.totalNum
return percentage
def showBar(self):
percentage = 100 * self.counter / self.totalNum
meter = u"{0}% ({1}/{2} Bytes)\n".format(percentage, self.counter,self.totalNum)
sys.stdout.write(meter)
sys.stdout.flush()
return percentage
class Downloader(object):
def __init__(self, savedir=None, useragent=None, cookie=None):
try:
if not os.path.exists(savedir):
path = os.path.dirname(os.path.abspath(__file__))
d = datetime.datetime.today()
dirname = 'download_%s%s%s_%s%s%s%s' % d.year, d.month, d.day, d.hour, d.minute, d.second, d.microsecond
savedir = os.path.join(path,dirname)
os.makedirs(savedir, 0755)
self.savedir = savedir
except Exception,e:
print e
if not useragent:
self.useragent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.15 Safari/535.2'
else:
self.useragent = useragent
self.cookie = cookie
def _createDownload(self, url,headers):
if self.cookie:
opener = urllib2.build_opener(
urllib2.HTTPCookieProcessor(self.cookie)
)
else:
opener = urllib2.build_opener()
urllib2.install_opener(opener)
opener.addheaders = headers
instream=opener.open(url)
size = instream.info().getheader("Content-Length")
return (instream, size)
def download(self, url, filename=None, referer=None,overwrite=False):
if not referer:
referer = url
headers = [
('User-agent',self.useragent),
('Referer',referer)
]
if not filename:
filename = url.split('/')[-1]
path = os.path.join(self.savedir, filename)
if os.path.exists(path):
if overwrite:
outstream = open(path,'wb+')
else:
name, ext = os.path.splitext(filename)
d = datetime.datetime.today()
outstream = open(os.path.join(self.savedir, name+'_duplicate'+str(d.year)+str(d.microsecond)+ext),'wb')
else:
outstream = open(path,'wb')
try:
instream, size = self._createDownload(url,headers)
#size = float(size)
size = int(size)
pb = ProgressBar(size, url)
for line in instream:
bytesRead = len(line)
pb.addCounter(bytesRead)
outstream.write(line)
pb.showBar()
instream.close()
outstream.close()
return True
except Exception,e:
print "Error downloading %s: %s" % (url, e)
outstream.close()
return False
# -*- coding:utf-8 -*-
#!/usr/bin/env python
# History:
# 0.1: first commit
# 0.2: add wxPython-ProgressBar and few fix
__AUTHOR__ = 'PyYoshi'
__LICENCE__ = 'MIT'
__VERSION__ = '0.1'
from download import Downloader
import optparse
import sys
import wx
class WxDownloader(Downloader):
# 継承
def download(self, url, filename=None, referer=None,overwrite=False):
if not referer:
referer = url
headers = [
('User-agent',self.useragent),
('Referer',referer)
]
if not filename or filename=='None':
filename = url.split('/')[-1]
path = os.path.join(self.savedir, filename)
if os.path.exists(path):
if overwrite:
outstream = open(path,'wb+')
else:
name, ext = os.path.splitext(filename)
d = datetime.datetime.today()
outstream = open(os.path.join(self.savedir, name+'_duplicate'+str(d.year)+str(d.microsecond)+ext),'wb')
else:
outstream = open(path,'wb')
try:
instream, size = self._createDownload(url,headers)
size = int(size)
# wxで作成
app = wx.PySimpleApp()
progress = wx.ProgressDialog(
u'Downloading...',
u' '*80,
maximum = size,
parent = None,
style = wx.PD_APP_MODAL|wx.PD_SMOOTH|wx.PD_AUTO_HIDE
)
progress.SetFocus()
bytesRead = 0
for line in instream:
bytesRead += len(line)
outstream.write(line)
alive, skip = progress.Update(bytesRead, 'Downloading: {}\n{}/{} Byte'.format(url,bytesRead, size))
wx.MilliSleep(5)
instream.close()
outstream.close()
progress.Update(size)
progress.Destroy()
return True
except Exception,e:
wx.MessageDialog(None,"Error downloading %s\n %s" % (url, e),'Error',wx.OK|wx.ICON_ERROR)
print "Error downloading %s: %s" % (url, e)
outstream.close()
return False
def main():
__doc__ = '''GUI Downloader'''
parser = optparse.OptionParser(__doc__)
parser.add_option('-v', '--verbose', dest='verbose')
parser.add_option('-s','--savedir', dest='savedir',default=None)
parser.add_option('-f', '--filename',dest='filename',default=None)
opts, args = parser.parse_args()
if len(args)<1:
parser.print_help()
sys.exit()
else:
url = args[0]
if opts.verbose:
parser.print_help()
sys.exit()
wdl = WxDownloader(savedir=opts.savedir)
wdl.download(url,opts.filename)
if __name__=="__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment