Created
September 25, 2011 17:35
-
-
Save PyYoshi/1240876 to your computer and use it in GitHub Desktop.
Python製ダウンローダー require:wxPython
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # -*- 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # -*- 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