Cómo extraer información de Google Books 📚
De qué se trata
Google Books (o Google Libros) es un motor de búsqueda de libros lanzado originalmente en 2005 bajo los nombres Google Book Search y Google Print. Es una base de datos enorme que el gigante tecnológico de Mountain View armó con el apoyo de otras instituciones como la Universidad de Harvard y la Biblioteca Pública de Nueva York. El tamaño de esta base crece día a día gracias a la incorporación de nuevos títulos publicados en formato electrónico y libros en formato papel que son digitalizados utilizando tecnologías de reconocimiento óptico de caracteres. Según el New York Times, a la fecha Google ya ha digitalizado más de 25 millones de libros impresos utilizando estas técnicas de reconocimiento óptico.
Cómo automatizar búsquedas y extracción de metadata
En este ejemplo lo que queremos hacer es completar información faltante en nuestro catálogo de libros, y para esto vamos a utilizar la API de Google Books. Nuestro catálogo puede ser la base de datos de una editorial, una biblioteca, una librería o simplemente el registro que lleva un lector meticuloso sobre las obras que guarda en el librero. Tal vez necesitemos completar esta información porque no la tenemos o, lo que es más común: tenemos la información, pero no en formato digital, está en un papel, seguramente en los propios libros, y no queremos perder largas horas atados a una silla tecleando como condenados.
Utilizaremos Python para extraer la información. En este ejemplo haremos la carga a una hoja de cálculo, pero para el caso podríamos conectar a cualquier motor de base de datos en el que tengamos almacenado nuestro catálogo.
Como punto de partida vamos a armar un archivo de texto plano con los números de ISBN de los libros que queremos consultar. El ISBN (International Standard Book Number en inglés, o «Número Internacional Normalizado del Libro») consiste en un número que identifica de forma única a cada libro existente en el mundo, así que, es perfecto para que lo utilicemos como clave primaria de nuestro conjunto de datos. En el archivo de texto vamos a escribir un ISBN por línea, sin espacios ni guiones.
Para este ejemplo solo voy a consultar dos libros, pero el proceso sería exactamente el mismo si tuviera una lista de quinientos ejemplares. De esta forma nos desentendemos del volumen del catálogo, mayor volumen no nos va a generar mayor carga de trabajo. Eso sí, siempre respetando los límites de la API: https://developers.google.com/books
La url base de la API de Google Books para hacer una consulta por ISBN es «https://www.googleapis.com/books/v1/volumes?q=isbn:», esta dirección irá seguida del número ISBN que queramos consultar.
Vemos que el parámetro que le estamos pasando a la url se llama isbn, pero no es esta la única opción de búsqueda que permite la interfaz. Además del ISBN, tenemos todas las siguientes alternativas para poder hacer búsquedas de las formas que nos resulten más convenientes:
• intitle: Búsqueda por título.
• inauthor: Búsqueda por autor.
• inpublisher: Búsqueda por editorial.
• subject: Búsqueda por género.
• isbn: Búsqueda por número de ISBN.
• lccn: Búsqueda por número de control de la Biblioteca del Congreso de los Estados Unidos.
• oclc: Búsqueda por número del Online Computer Library Center.
Para más información, pueden consultar la documentación oficial de la API en https://developers.google.com/books/docs/v1/using
Los datos que me interesa buscar en este caso son: título, autor(es), editorial, fecha de publicación, sinopsis, nro. de páginas, género(s), dominio público e idioma. Esto les da una idea de la cantidad de metadatos que guarda Google Books alrededor de cada libro, pero hay más información disponible, les dejo este ejemplo para que puedan ver en detalle la estructura: https://www.googleapis.com/books/v1/volumes?q=isbn:9789872777319
Trabajando con el código
Ahora si, vamos a arremangarnos para escribir Python. Lo primero que tenemos que hacer es cargar las librerías que vamos a utilizar. Las que no tengamos habrá que instalarlas previamente:
• inpublisher: Búsqueda por editorial.
• subject: Búsqueda por género.
• isbn: Búsqueda por número de ISBN.
• lccn: Búsqueda por número de control de la Biblioteca del Congreso de los Estados Unidos.
• oclc: Búsqueda por número del Online Computer Library Center.
Para más información, pueden consultar la documentación oficial de la API en https://developers.google.com/books/docs/v1/using
Los datos que me interesa buscar en este caso son: título, autor(es), editorial, fecha de publicación, sinopsis, nro. de páginas, género(s), dominio público e idioma. Esto les da una idea de la cantidad de metadatos que guarda Google Books alrededor de cada libro, pero hay más información disponible, les dejo este ejemplo para que puedan ver en detalle la estructura: https://www.googleapis.com/books/v1/volumes?q=isbn:9789872777319
Trabajando con el código
Ahora si, vamos a arremangarnos para escribir Python. Lo primero que tenemos que hacer es cargar las librerías que vamos a utilizar. Las que no tengamos habrá que instalarlas previamente:
import os
import urllib.request
import json
import xlsxwriter
Una vez hecho esto, podemos pasar a leer el archivo de entrada, nuestro ISBN.txt que creamos anteriormente. También crearemos el archivo de salida, Libros.xlsx, le agregaremos una hoja de cálculo llamada Catálogo y le daremos nombre a todas las columnas.
El próximo paso será iterar por los ISBN, consultando la API y dándole el formato necesario a los datos recibidos como respuesta. Usaremos la librería json para deserializar esa respuesta y guardarla en un objeto de Python. Luego de eso, lo que resta es ir escribiendo fila por fila en el excel de salida utilizando la librería xlsxwriter.
print('Inicio')
path = os.path.dirname(os.path.abspath(__file__))
api_url = "https://www.googleapis.com/books/v1/volumes?q=isbn:"
print('Leyendo archivo de entrada ISBN.txt')
archISBN = open(path + r"\ISBN.txt", "r")
print('Creando archivo de salida Libros.xlsx')
workbook = xlsxwriter.Workbook('Libros.xlsx')
worksheet = workbook.add_worksheet('Catálogo')
worksheet.write(0, 0, 'ISBN')
worksheet.write(0, 1, 'Título')
worksheet.write(0, 2, 'Autor(es)')
worksheet.write(0, 3, 'Editorial')
worksheet.write(0, 4, 'Fecha publicación')
worksheet.write(0, 5, 'Sinopsis')
worksheet.write(0, 6, 'Páginas')
worksheet.write(0, 7, 'Género(s)')
worksheet.write(0, 8, 'Dominio público')
worksheet.write(0, 9, 'Idioma')
El próximo paso será iterar por los ISBN, consultando la API y dándole el formato necesario a los datos recibidos como respuesta. Usaremos la librería json para deserializar esa respuesta y guardarla en un objeto de Python. Luego de eso, lo que resta es ir escribiendo fila por fila en el excel de salida utilizando la librería xlsxwriter.
fila = 0
for ISBN in archISBN:
fila = fila + 1
ISBN = ISBN.rstrip('\n')
print('+Procesando ISBN #'+str(fila)+' : '+ISBN)
with urllib.request.urlopen(api_url + ISBN) as respuesta:
texto = respuesta.read()
texto_utf8 = texto.decode("utf-8")
py_obj = json.loads(texto_utf8)
volume_info = py_obj["items"][0]
worksheet.write(fila, 0, ISBN)
worksheet.write(fila, 1, volume_info["volumeInfo"]["title"])
autores = py_obj["items"][0]["volumeInfo"]["authors"]
worksheet.write(fila, 2, ",".join(autores))
worksheet.write(fila, 3, volume_info["volumeInfo"]["publisher"])
worksheet.write(fila, 4, volume_info["volumeInfo"]["publishedDate"])
worksheet.write(fila, 5, volume_info["volumeInfo"]["description"])
worksheet.write(fila, 6, volume_info["volumeInfo"]["pageCount"])
try:
generos = py_obj["items"][0]["volumeInfo"]["categories"]
worksheet.write(fila, 7, ",".join(generos))
except Exception:
worksheet.write(fila, 7, "NA")
pass
worksheet.write(fila, 8, volume_info["accessInfo"]["publicDomain"])
worksheet.write(fila, 9, volume_info["volumeInfo"]["language"])
print('Cerrando archivos')
archISBN.close()
workbook.close()
print('Fin')
Así se verá el proceso.
El resultado final es la información guardada en una planilla similar a esta, lista para ser consultada o exportada a cualquier otro sistema de destino.
Boa descrição e muito importante . Felicitações . Maria
ResponderBorrarGracias Maria!
BorrarMuy buena información, muchas gracias!!!
ResponderBorrarAbrazos viertuales!!
Cecy :)
Abrazos Cecy!!
BorrarBuen dato! Una consulta se puede extraer todo el texto de un libro digitalizado en Google Books?
ResponderBorrarHola, Alexandra. Me imagino que te referís a hacerlo de forma programática a través de la API, que es el tema que toqué en el artículo. Sí, hay una forma. En la respuesta de la API, sección accessInfo, va a aparecer un link de descarga si el ebook está disponible, y si existe una muestra disponible para leer o si el usuario puede leer el libro ya sea porque lo compró o porque el libro pertenece al dominio público en el país en que te encuentres. Saludos.
BorrarHola una pregunta es necesario saber programar en python? No sé porgramar. Es una buena oportunidad para aprender pero me tomara más tiempo del que necesito hacer la lista. Otra pregunta hay forma de que agregue imágenes de referencia de la portada que estén en internet a modo de referencia? Si no se programar que puedo hacer?
ResponderBorrarHola, para generar la lista de libros en Python no es necesario saber programar. Puedes simplemente copiar y pegar el código que se encuentra en esta entrada. Sin embargo, es importante saber cómo ejecutar un script de Python en tu entorno de desarrollo.
BorrarRespecto a tu segunda pregunta, si no sabes utilizar Python, una alternativa es utilizar la API utilizando otro lenguaje o buscar cada libro en la web de Google Books manualmente y agregar las imágenes de referencia de la portada de manera individual. Esto podría llevar más tiempo, pero es una opción viable si no deseas aprender a programar en este momento.
Recuerda que aprender a programar en Python puede ser una habilidad muy valiosa y te abrirá muchas puertas en el futuro. Si tienes el tiempo y la motivación para hacerlo, puede ser una buena oportunidad para aprender. ¡Buena suerte con tu lista de libros!