Télécharger le fichier Web en Python 3
je crée un programme qui va télécharger un .jar (java) d'un serveur web, en lisant L'URL spécifiée dans le .fichier jad du même jeu / application. J'utilise Python 3.2.1
j'ai réussi à extraire L'URL du fichier JAR à partir du fichier JAD (chaque fichier JAD contient l'URL du fichier JAR), mais comme vous pouvez l'imaginer, la valeur extraite est de type() string.
Voici la fonction correspondante:
def downloadFile(URL=None):
import httplib2
h = httplib2.Http(".cache")
resp, content = h.request(URL, "GET")
return content
downloadFile(URL_from_file)
cependant je reçois toujours une erreur disant que le type dans la fonction ci-dessus doit être bytes, et non string. J'ai essayé D'utiliser L'URL.encode ('utf-8'), et aussi bytes(URL, encoding='utf-8'), mais j'aurais toujours la même erreur ou une erreur similaire.
donc fondamentalement, ma question Est de savoir comment télécharger un fichier à partir d'un serveur lorsque l'URL est stockée dans un type de chaîne de caractères?
6 réponses
si vous voulez obtenir le contenu d'une page web dans une variable, juste read
la réponse de urllib.request.urlopen
:
import urllib.request
...
url = 'http://example.com/'
response = urllib.request.urlopen(url)
data = response.read() # a `bytes` object
text = data.decode('utf-8') # a `str`; this step can't be used if data is binary
la meilleure façon de télécharger et de sauvegarder un fichier est d'utiliser le urllib.request.urlretrieve
fonction:
import urllib.request
...
# Download the file from `url` and save it locally under `file_name`:
urllib.request.urlretrieve(url, file_name)
import urllib.request
...
# Download the file from `url`, save it in a temporary directory and get the
# path to it (e.g. '/tmp/tmpb48zma.txt') in the `file_name` variable:
file_name, headers = urllib.request.urlretrieve(url)
Mais gardez à l'esprit que urlretrieve
est considéré comme héritage et pourrait devenir déprécié (pas sûr pourquoi, cependant).
donc le plus correct façon de le faire serait d'utiliser le urllib.request.urlopen
fonction pour retourner un objet similaire à un fichier qui représente une réponse HTTP et le copier dans un fichier réel en utilisant shutil.copyfileobj
.
import urllib.request
import shutil
...
# Download the file from `url` and save it locally under `file_name`:
with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
shutil.copyfileobj(response, out_file)
si cela semble trop compliqué, vous pouvez aller plus simple et stocker l'ensemble du téléchargement dans un objet bytes
, puis l'écrire dans un fichier. Mais cela ne fonctionne bien que pour les petits fichiers.
import urllib.request
...
# Download the file from `url` and save it locally under `file_name`:
with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
data = response.read() # a `bytes` object
out_file.write(data)
il est possible d'extraire .gz
(et peut-être d'autres formats) des données compressées à la volée, mais une telle opération nécessite probablement que le serveur HTTP supporte l'accès aléatoire au fichier.
import urllib.request
import gzip
...
# Read the first 64 bytes of the file inside the .gz archive located at `url`
url = 'http://example.com/something.gz'
with urllib.request.urlopen(url) as response:
with gzip.GzipFile(fileobj=response) as uncompressed:
file_header = uncompressed.read(64) # a `bytes` object
# Or do anything shown above using `uncompressed` instead of `response`.
j'utilise le paquet requests
chaque fois que je veux quelque chose concernant les requêtes HTTP parce que son API est très facile à démarrer:
d'abord, installer requests
$ pip install requests
puis le code:
from requests import get # to make GET request
def download(url, file_name):
# open in binary mode
with open(file_name, "wb") as file:
# get request
response = get(url)
# write to file
file.write(response.content)
j'espère que j'ai bien compris la question, qui est: comment télécharger un fichier à partir d'un serveur lorsque l'URL est stockée dans un type de chaîne de caractères?
je télécharge des fichiers et les enregistre localement en utilisant le code ci-dessous:
import requests
url = 'https://www.python.org/static/img/python-logo.png'
fileName = 'D:\Python\dwnldPythonLogo.png'
req = requests.get(url)
file = open(fileName, 'wb')
for chunk in req.iter_content(100000):
file.write(chunk)
file.close()
vous pouvez utiliser wget qui est populaire téléchargement outil shell pour cela. https://pypi.python.org/pypi/wget Ce sera la méthode la plus simple, car il n'a pas besoin d'ouvrir le fichier de destination. Ici est un exemple.
import wget
url = 'https://i1.wp.com/python3.codes/wp-content/uploads/2015/06/Python3-powered.png?fit=650%2C350'
wget.download(url, '/Users/scott/Downloads/cat4.jpg')
ici, nous pouvons utiliser l'interface Legacy d'urllib en Python3:
les fonctions et classes suivantes sont portées depuis le module Python 2 urllib (par opposition à urllib2). Ils pourraient devenir dépréciés à un moment donné dans le futur.
exemple (code à 2 lignes) :
import urllib.request
url = 'https://www.python.org/static/img/python-logo.png'
urllib.request.urlretrieve(url, "logo.png")
from urllib import request
def get(url):
with request.urlopen(url) as r:
return r.read()
def download(url, file=None):
if not file:
file = url.split('/')[-1]
with open(file, 'wb') as f:
f.write(get(url))