Como fazer download de arquivos pela urllib limitando a banda usada. Usa a biblioteca progressbar (http://cheeseshop.python.org/pypi/progressbar).
1 #!/usr/bin/python
2 #
3 # limitget.py
4 # Copyright (c) 2006 by Nilton Volpato <first-name dot last-name @ gmail.com>
5 #
6 # Permission to use, copy, modify, and distribute this software and its
7 # documentation for any purpose and without fee is hereby granted,
8 # provided that the above copyright notice appear in all copies and that
9 # both that copyright notice and this permission notice appear in
10 # supporting documentation.
11 #
12 # This file is provided AS IS with no warranties of any kind. The author
13 # shall have no liability with respect to the infringement of copyrights,
14 # trade secrets or any patents by this file or any part thereof. In no
15 # event will the author be liable for any lost revenue or profits or
16 # other special, indirect and consequential damages.
17
18 import urllib
19 import time
20 from progressbar import ProgressBar, Bar, ETA, Percentage, FileTransferSpeed
21
22 def limitget(url, outfname, limit):
23 """Downloads an url to a local file using a bandwidth limit.
24 url: resource to download
25 outfname: filename to which url will be copied
26 limit: bandwidth limit in bytes/second
27 """
28 fp = urllib.urlopen(url)
29 op = open(outfname, 'wb')
30 n = 0
31 widgets = [Percentage(), ' ', Bar(),' ', ETA(), ' ', FileTransferSpeed()]
32 size = int(fp.headers['content-length'])
33 pbar = ProgressBar(widgets=widgets, maxval=size).start()
34 while 1:
35 start = time.time()
36 s = fp.read(limit)
37 if not s:
38 break
39 op.write(s)
40 n += len(s)
41 timetosleep = 1.0 - (time.time() - start)
42 if timetosleep > 0.0:
43 time.sleep(timetosleep)
44 pbar.update(n)
45 pbar.finish()
46 fp.close()
47 op.close()
48
49 if __name__ == '__main__':
50 import sys
51 limitget(sys.argv[1], sys.argv[2], int(sys.argv[3]))
Outro jeito de fazer é como abaixo. Mas cuidado pois esse exemplo abaixo pode não funcionar como esperado em situações particulares.
1 #!/usr/bin/python
2 # -*- encoding: iso-8859-1 -*-
3 import urllib2
4 from time import sleep
5
6 import timing # To debug
7 from sys import stdout
8
9 def limit(www,bps):
10 '''Load www address in bps B/s'''
11 con = urllib2.urlopen(www)
12 bytes = bps/10
13 total_bytes = 0
14 timing.start()
15 while True:
16 data = con.read(bytes)
17 total_bytes += len(data)
18 if not data:
19 break
20 stdout.write('Loaded %d bytes\r'%(total_bytes))
21 stdout.flush()
22 sleep(0.1)
23
24 timing.finish()
25 time_ = timing.milli()/1000.0
26 print 'Loaded %dBytes in %0.2f seconds (%dBps)'%(total_bytes, time_, total_bytes/time_)