python

Descargar libros de CONALITEG

Ayer alguien me preguntó si se podía descargar un libro de texto gratuito de la página de CONALITEG (Comisión Nacional de Libros de Texto Gratuitos), así que le pedí que me enviara el enlace y al entrar vi que no es un PDF.

Al analizarlo vi que es una imagen que se muestra con magazine.js y que cada que pasas de página se carga una nueva imagen en el fondo (eso lo vi solo en un vistazo rápido, así que puede que esté equivocado en las librerías o esas cosas, aunque al final no importa):

Analizando libro de CONALITEG para descargar

Si te fijas, las páginas van en orden, es decir, va la 001, 002, etcétera hasta el final del libro.

Entonces pensé en una idea: hacer un script de Python que reciba el número de páginas del libro, la dirección del mismo y visite todas las páginas de las imágenes, las descargue una por una y después las convierta a PDF.

Para mi sorpresa el script funcionó como un encanto, y por eso te vengo a compartir cómo descargar esos libros y tal vez otros más que usen la misma tecnología.

Aviso sobre el copyright y esas cosas

Yo creo que el conocimiento debería ser gratuito para todos, y que debería ser fácil acceder al mismo y sin internet (piensen en la gente que tiene que soportar la poca calidad del internet de telmex)

Si la página de CONALITEG no quiere que descarguemos sus libros con un script, nada les cuesta poner un botón grande y color verde que diga DESCARGAR, ¿cierto?

Yo proporciono esto por si a alguien más le sirve y para mostrar de lo que es capaz este lenguaje de programación, pero no me hago cargo si se usa para otros fines.

Me descargo de toda responsabilidad. Todo lo que hagas a partir de ahora es por tu decisión.

Analizando el comportamiento de la página

Pongamos un ejemplo: el libro de español lecturas de primer grado. Si lo quieres leer entonces puedes ir a https://libros.conaliteg.gob.mx/2021/P1LEA.htm.

Al entrar se cargará la primera página, y si le das clic derecho a la imagen y la abres en una nueva pestaña te dirige a: https://libros.conaliteg.gob.mx/2021/c/P1LEA/000.jpg

Si luego vas a https://libros.conaliteg.gob.mx/2021/c/P1LEA/001.jpg te mostrará la página 1, si vas a https://libros.conaliteg.gob.mx/2021/c/P1LEA/002.jpg te mostrará la segunda y así sucesivamente.

Este libro en cuestión tiene 128 páginas si analizamos el índice, y entonces solo tenemos que visitar 128 enlaces en donde se respeta el siguiente formato (para este libro en cuestión):

https://libros.conaliteg.gob.mx/2021/c/P1LEA/[El número de página va aquí].jpg

Pensando en el script

Ahora solo nos falta hacer un programa que descargue un libro. El mismo va a necesitar de la URL en donde solo cambia el número de página, la cantidad de páginas y el nombre del PDF para convertir todas las imágenes en un documento.

En mi blog ya te he mostrado cómo descargar una imagen con Python y cómo convertir imágenes a PDF con Python. También vamos a necesitar rellenar un número con ceros a su izquierda.

Nota: yo usé Python por su facilidad, pero técnicamente se podría hacer con cualquier lenguaje.

Descargar cualquier libro de CONALITEG

Descargar libro de CONALITEG con Script de Python – Descargar imágenes y convertir a PDF

Entonces solo es cuestión de juntar todo, definir algunas funciones y listo. El código queda bastante limpio:

import requests
import img2pdf

"""
    https://parzibyte.me/blog
"""


def descargar_imagen(url_base, nombre):
    url_imagen = f"{url_base}{nombre}.jpg"
    print(f"Descargando {url_imagen}...")
    nombre_local_imagen = f"{nombre}.jpg"
    imagen = requests.get(url_imagen).content
    print("Guardando...", end="")
    with open(nombre_local_imagen, 'wb') as handler:
        handler.write(imagen)
    print("OK")
    return nombre_local_imagen


def descargar_libro(url_base, paginas, nombre_pdf):
    inicio = 0
    imagenes = []
    for i in range(inicio, paginas+1):
        numero_con_ceros_a_la_izquierda = f"{i:03d}"
        nombre_imagen_descargada = descargar_imagen(
            url_base, numero_con_ceros_a_la_izquierda)
        imagenes.append(nombre_imagen_descargada)
    with open(nombre_pdf, "wb") as documento:
        print(f"Guardando imágenes descargadas como {nombre_pdf}")
        documento.write(img2pdf.convert(imagenes))


descargar_libro(
    "https://libros.conaliteg.gob.mx/2021/c/P1LEA/", 128, "Español lecturas primer grado.pdf")

Por cierto, para esto necesitas contar con Python y PIP. Luego instalar las dependencias de img2pdf y requests con:

pip install requests

pip install img2pdf

Cambia lo necesario al invocar a descargar_libro en la línea 34 (es decir, la URL, el número de páginas y el nombre del PDF), abre una terminal en el mismo lugar donde está el script y ejecútalo con: python descargar_libro_conaliteg.py.

Versión mejorada

Resultados

La salida al ejecutar el script ya la has visto anteriormente. Y después de que se termine de descargar, tendrás el PDF y las imágenes (ya puedes borrar las imágenes si quieres).

Al abrir el PDF se ve como un documento normal. Ya te puedes llevar ese libro a cualquier lugar y leerlo sin internet:

Libro de CONALITEG descargado como PDF

Conclusión y bonus

Después de hacer este script pensé en una manera de hacerlo fácil para una persona que no tiene conocimientos de programación, en donde la misma solo coloque el enlace de las imágenes del libro y un programa haga el resto.

Probé un poco y me decidí por Flask, que es un framework web de Python muy simple pero poderoso (con él pudimos acceder a una cámara, por ejemplo).

Así que en el siguiente post veremos cómo encapsular todo esto en una webapp de Flask amigable para el usuario. Mientras tanto te dejo más sobre Python.

Actualización: ya publiqué la herramienta.

Actualización 2024: hice otra herramienta que puedes ejecutar en tu computadora de manera más fácil y que funciona sin servidores. Mírala en: https://parzibyte.me/blog/2024/05/22/mejorando-descargador-libros-conaliteg/

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.