Estoy creando un programa que descargará un archivo .jar (java) desde un servidor web, leyendo la URL que se especifica en el archivo .jad del mismo juego / aplicación. Estoy usando Python 3.2.1
Me las arreglé para extraer la URL del archivo JAR del archivo JAD (cada archivo JAD contiene la URL del archivo JAR), pero como puede imaginar, el valor extraído es la cadena type ().
Aquí está la función relevante:
def downloadFile(URL=None):
import httplib2
h = httplib2.Http(".cache")
resp, content = h.request(URL, "GET")
return content
downloadFile(URL_from_file)
Sin embargo, siempre recibo un error que dice que el tipo en la función anterior tiene que ser bytes y no una cadena. Intenté usar URL.encode ('utf-8') y también bytes (URL, encoding = 'utf-8'), pero siempre obtengo el mismo error o un error similar.
Entonces, básicamente, mi pregunta es cómo descargar un archivo de un servidor cuando la URL se almacena en un tipo de cadena.
fuente
Respuestas:
Si desea obtener el contenido de una página web en una variable, solo
read
la respuesta deurllib.request.urlopen
:La forma más fácil de descargar y guardar un archivo es usar la
urllib.request.urlretrieve
función:Pero tenga en cuenta que
urlretrieve
se considera heredado y podría quedar en desuso (aunque no estoy seguro de por qué).Entonces, la forma más correcta de hacer esto sería usar la
urllib.request.urlopen
función para devolver un objeto similar a un archivo que represente una respuesta HTTP y copiarlo a un archivo real usandoshutil.copyfileobj
.Si esto parece demasiado complicado, es posible que desee simplificar y almacenar toda la descarga en un
bytes
objeto y luego escribirla en un archivo. Pero esto funciona bien solo para archivos pequeños.Es posible extraer
.gz
(y tal vez otros formatos) datos comprimidos sobre la marcha, pero tal operación probablemente requiere que el servidor HTTP admita acceso aleatorio al archivo.fuente
response.info().get_param('charset', 'utf-8')
lugar de codificación rígidautf-8
, para obtener la codificación de caracteres delContent-Type
encabezadooutfile.write(data)
solo funciona bien para archivos pequeños?Uso el
requests
paquete cuando quiero algo relacionado con las solicitudes HTTP porque su API es muy fácil de comenzar:primero, instalar
requests
entonces el código:
fuente
Espero haber entendido bien la pregunta, que es: ¿cómo descargar un archivo de un servidor cuando la URL se almacena en un tipo de cadena?
Descargo archivos y los guardo localmente usando el siguiente código:
fuente
Aquí podemos usar la interfaz Legacy de urllib en Python3:
Las siguientes funciones y clases se transfieren desde el módulo Python 2 urllib (a diferencia de urllib2). Pueden quedar obsoletos en algún momento en el futuro.
Ejemplo (código de 2 líneas) :
fuente
Puede usar wget, que es una herramienta de descarga popular para eso. https://pypi.python.org/pypi/wget Este será el método más simple ya que no necesita abrir el archivo de destino. Aquí hay un ejemplo.
fuente
Sí, definitivamente las solicitudes son un excelente paquete para usar en algo relacionado con las solicitudes HTTP. pero tenemos que tener cuidado con el tipo de codificación de los datos entrantes. A continuación, un ejemplo que explica la diferencia.
fuente
Motivación
A veces, queremos obtener la imagen pero no es necesario descargarla en archivos reales,
es decir, descargue los datos y guárdelos en la memoria.
Por ejemplo, si uso el método de aprendizaje automático, entrene un modelo que pueda reconocer una imagen con el número (código de barras).
Cuando araño algunos sitios web y que tienen esas imágenes para poder usar el modelo para reconocerlo,
y no quiero guardar esas fotos en mi unidad de disco,
entonces puede probar el siguiente método para ayudarlo a mantener los datos descargados en la memoria.
Puntos
básicamente, es como @Ranvijay Kumar
Un ejemplo
fuente
fuente