Έχω αυτόν τον κώδικα, για κατέβασμα αρχείων (Python 3):
#!/usr/bin/env python3
#-*-coding: utf-8-*-
# filename: downloadme01.py
import urllib.request
import urllib.parse
import sys
def download_me(the_urls, block_size=8192):
"""Downloads a file from a site.
USAGE: python3 downloadme01.py http://1 http://2 ...
Author:
License: GNU/GPL v 3.0
"""
for the_url in the_urls: ## Αν έχουμε πάνω από μία διευθύνσεις δικτύου
the_url = urllib.parse.unquote(the_url) ## Σβήνουμε αν υπάρχουν χαρακτήρες '%20f' κλπ.
print(the_url)
file_name = the_url.split('/')[-1] # Διαχωρίζουμε το αρχείο από τη διεύθυνση.
site = urllib.request.urlopen(the_url) # Ανοίγουμε το αρχείο.
file_size = int(site.getheader("Content-Length")) # Παίρνουμε το μήκος του αρχείου
print("Κατεβάζω: {0} Bytes: {1} KBytes: {2:.2f}".format(file_name,\
file_size, int(file_size/1024)))
try:
fh = open(file_name, 'wb') # Ανοίγουμε τοπικά θέση για να γράψουμε.
megethos_arxeiou_kt = 0 # Αρχικό μέγεθος αρχείου 0 bytes.
while True:
buffer = site.read(block_size) # Διαβάζουμε 8192 bytes.
if not buffer: # Αν δεν έχουμε να διαβάσουμε σταματάμε.
break
megethos_arxeiou_kt += len(buffer) # Τι έχουμε κατεβάσει.
fh.write(buffer) # Γράφουμε το αρχείο.
prcnt = (megethos_arxeiou_kt / file_size)
katastasi = "{0:>6,d}kb {1:.2%}".format(round(megethos_arxeiou_kt/1024),\
prcnt)
sys.stdout.write("\rΚατέβηκαν: " + katastasi)
sys.stdout.flush()
sys.stdout.write("\n")
finally:
fh.close()
if __name__ == '__main__':
if len(sys.argv) > 1:
del sys.argv[0]
download_me(sys.argv)
else:
print("""Usage:
------
downloadme01.py http://url/to/the/file/file http://url/to/the/file/file2 ... or
python3 downloadme01.py http://url/to/the/file/file http://url/to/the/file/file2 ...
""")
ο οποίος λειτουργεί χωρίς πρόβλημα αν έχουμε url χωρίς ελληνικούς χαρακτήρες. Αν όμως υπάρχουν ελληνικοί χαρακτήρες (φαντάζομαι κυριλλικοί κλπ) βγάζει το παρακάτω μήνυμα:
km@asus:~$ python3 bin/downloadme01.py http://www.dw.de/popups/pdf/27169135-το-κείμενο-του-επεισοδίου-05-pdf.pdf
http://www.dw.de/popups/pdf/27169135-το-κείμενο-του-επεισοδίου-05-pdf.pdf
Traceback (most recent call last):
File "bin/downloadme01.py", line 56, in <module>
download_me(sys.argv)
File "bin/downloadme01.py", line 22, in download_me
site = urllib.request.urlopen(the_url) # Ανοίγουμε το αρχείο.
File "/usr/lib/python3.3/urllib/request.py", line 160, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.3/urllib/request.py", line 473, in open
response = self._open(req, data)
File "/usr/lib/python3.3/urllib/request.py", line 491, in _open
'_open', req)
File "/usr/lib/python3.3/urllib/request.py", line 451, in _call_chain
result = func(*args)
File "/usr/lib/python3.3/urllib/request.py", line 1272, in http_open
return self.do_open(http.client.HTTPConnection, req)
File "/usr/lib/python3.3/urllib/request.py", line 1252, in do_open
h.request(req.get_method(), req.selector, req.data, headers)
File "/usr/lib/python3.3/http/client.py", line 1061, in request
self._send_request(method, url, body, headers)
File "/usr/lib/python3.3/http/client.py", line 1089, in _send_request
self.putrequest(method, url, **skips)
File "/usr/lib/python3.3/http/client.py", line 953, in putrequest
self._output(request.encode('ascii'))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 25-26: ordinal not in range(128)
Δοκίμασα μερικά τρικ όπως quote και unquote αλλά δεν έχει αποτέλεσμα.
Κάθε βοήθεια δεκτή.