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?

205
demandé sur Bo Milanovich 2011-08-30 17:16:18

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`.
419
répondu Oleh Prypin 2013-07-26 09:32:58

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)
71
répondu Ali Faki 2017-04-05 14:13:27

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()
13
répondu Ranvijay Kumar 2016-01-18 20:32:35

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') 
3
répondu Lasith Niroshan 2018-01-13 19:39:14

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")
2
répondu Yang Yu 2018-07-17 14:08:47
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))
-3
répondu user7726287 2017-03-17 09:35:56