Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Descarga de archivos .zip con contenido
#1
Hola buenos días. Soy bastante nuevo así que, en primer lugar, muchas gracias por la acogida y perdón por las molestias.

Actualmente, quiero automatizar una tarea partiendo de un Excel en el cual especifico en una columna unos nombres y en una celda concreta una ruta de una url (que es de one drive).

Bien, esa ruta contiene carpetas con archivos dentro y quiero que mi script lea las celdas con los nombres de las carpetas, las busque en la url seleccionada y las descargue en una ruta que yo he especificado.

Bien, he conseguido desarrollar el script que adjunto, pero este no me descarga las carpetas con su contenido, sino un tipo de archivo sin extensión que no puedo abrir con ningún programa. ¿Puede ayudarme?

Gracias y disculpen las molestias.

Código:
import os
import requests
from openpyxl import load_workbook
from tqdm import tqdm

def download_file(url, destination_folder):
    response = requests.get(url, stream=True)
    file_size = int(response.headers.get('content-length', 0))
   
    # Extracting file name from URL
    file_name = url.split("/")[-1]
    file_path = os.path.join(destination_folder, file_name)

    with open(file_path, 'wb') as file, tqdm(
        desc=file_name,
        total=file_size,
        unit='iB',
        unit_scale=True,
        unit_divisor=1024,
    ) as bar:
        for data in response.iter_content(chunk_size=1024):
            bar.update(len(data))
            file.write(data)

def main():
    excel_path = r'C:\Users\ÁlvaroBallesterosLóp\Downloads\Automatización.xlsx'
    sheet_name = 'Hoja1'

    # Load Excel workbook
    workbook = load_workbook(excel_path)
    sheet = workbook[sheet_name]

    # Get URL from D2
    url = sheet['D2'].value

    # Get destination folder from D3
    destination_folder = sheet['D3'].value
    os.makedirs(destination_folder, exist_ok=True)

    # Iterate through names in column A starting from A2
    for cell in sheet['A'][1:]:
        name = cell.value

        # Construct the full URL for the current name
        full_url = f"{url}/{name}"

        # Download the file
        download_file(full_url, destination_folder)

    # Close the Excel workbook
    workbook.close()

    print("Archivos descargados satisfactoriamente.")

if __name__ == "__main__":
    main()
Responder
#2
Hola, bienvenido.

Probablemente lo que estás bajando es simplemente el código HTML/JS/CSS de la página de OneDrive que muestra el contenido de la carpeta. ¿Probaste abriendo el archivo con VS Code o algún editor similar, a ver si tiene texto plano dentro?

Como sea, te convendría usar la librería oficial para interactuar con OneDrive: https://github.com/OneDrive/onedrive-sdk-python.

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#3
Usando la API tienes que subscribirte al Google Cloud y no se la Free version del cloud que limites tiene.

Asi que yo no lo uso (por ahora). Haz lo siquiente:

1-) En el google driver selecciona el file que quieres share con el mouse click select share -> share
2-) Cuando abre la pantalla en el "General Access", cambias el dropdown a "Anyone with the link"
3) Clickeas "Copy Link"

En el codigo de abajo debe darte una idea. Lo puedes correr para chequear.

Suerte

Código:
import requests
import re


def download_file_from_google_drive(id, destination, resourcekey=None):
    URL = "https://docs.google.com/uc?export=download&confirm=1"

    if(resourcekey):
        URL = f"{URL}&resourcekey={resourcekey}"
   
    session = requests.Session()

    response = session.get(URL, params={'id': id}, stream=True)
    token = get_confirm_token(response)

    if token:
        params = {'id': id, 'confirm': token}
        response = session.get(URL, params=params, stream=True)

    save_response_content(response, destination)


def get_confirm_token(response):
    for key, value in response.cookies.items():
        if key.startswith('download_warning'):
            return value

    return None


def save_response_content(response, destination):
    CHUNK_SIZE = 32768

    with open(destination, "wb") as f:
        for chunk in response.iter_content(CHUNK_SIZE):
            if chunk:  # filter out keep-alive new chunks
                f.write(chunk)

def get_value_from_url(regex, url):
    result = re.search(regex, url)
    if result is not None:
        return result.group(1)
    else:
        return None

def main(url, destination):
    id = get_value_from_url(regex=r"/d/(.+)?/", url=url)
    resourcekey = get_value_from_url(regex="/.*resourcekey=(.+)", url=url)

    download_file_from_google_drive(id=id, destination=destination, resourcekey=resourcekey)


if __name__ == "__main__":
    # 1) Go to your google drive
    # 2) Right mouse click the file you want to share
    # 3) When the menu appear select share -> share
    # 4) When the pop up window appears in General access, select dropdown "Anyone with the link"
    # 5) Click copy link

    # Note: you can select simultenous files by share -> share at the folder level

    main(url="https://drive.google.com/file/d/1c9qU0uJB5CPjfHTDKGCWA2evJZISpWeO/view?usp=sharing", destination="test.pdf")
    print()
    main(url="https://drive.google.com/file/d/0B9wl93tUd6c1T0dEVTA0T2VDNG8/view?usp=sharing&resourcekey=0-80D3fImDDkdDKpH7XYiBCg", destination="test2.pdf")
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)