es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Descargando un archivo desde una página web utilizando python, obteniendo un archivo html en lugar del archivo zip real.

Estoy tratando de descargar un archivo desde una página web que requiere inicio de sesión. Soy capaz de iniciar sesión a través de Python y Beautiful Soup. Pero cuando trato de descargar un archivo a través de Python desde esa página, obtengo un archivo HTML en lugar de obtener un archivo ZIP previsto. En la página web, cuando se hace clic en el enlace del archivo, se abre una nueva ventana y se pide que se descargue el archivo. El archivo de descarga está en formato ZIP. Así que por favor ayúdame a descargar el archivo a través de Python.

response = requests.post('https://consumerpyramidsdx.cmie.com/kommon/bin/sr.php', headers=headers, params=params, cookies=cookies, data=data) 
soup = BeautifulSoup(response.content, "lxml")
baseurl= 'https://consumerpyramidsdx.cmie.com'
print(soup)

file_url = 'https://consumerpyramidsdx.cmie.com/kommon/bin/sr.php?kall=wsubsdl&fn=consumption_pyramids_20210630_MS&fmt=csv&rrurl=consumptionpyramidsdx'

with open('consumption_pyramids_20210630_MS_csv.zip', 'wb') as file:
     rs = requests.get(file_url)
     file.write(rs.content)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código anterior es que no mantiene la sesión de inicio de sesión mientras descarga el archivo. Para descargar el archivo, es necesario agregar el objeto de sesión (creado después de iniciar sesión) a la solicitud GET del archivo.

    Este es el código actualizado que debería funcionar:

    import requests
    from bs4 import BeautifulSoup
    import gzip
    
    # Código de inicio de sesión
    datos_login = {
        'nombre_de_usuario': 'tu_nombre_de_usuario',
        'contraseña': 'tu_contraseña'
    }
    
    with requests.Session() as s:
        url_login = 'https://ejemplo.com/iniciar_sesion'
        s.post(url_login, data=datos_login)
    
        # Código de descarga de archivo
        url_archivo = 'https://ejemplo.com/descargar_archivo.zip'
        headers = {
            'Referer': 'https://ejemplo.com/archivos',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
        }
        response = s.get(url_archivo, headers=headers)
    
        # Guardar archivo
        with open('archivo_descargado.zip', 'wb') as f:
            f.write(response.content)
    

    Este código inicia sesión en el sitio web usando un objeto de sesión, y luego utiliza el mismo objeto de sesión para descargar el archivo. También envía una cadena de usuario-agente en los encabezados para simular una solicitud del navegador.

    Una vez descargado el archivo, puede usar la biblioteca gzip de Python para extraer su contenido si está comprimido.

Comments are closed.