Cómo extraer información de Google Books 📚

Javier E.G. Andújar agosto 19, 2020 3 comentarios

Libros


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.

Block de notas de ISBN

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:

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.

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.

Ejecución ISBN lookup

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.

planilla de libros extraída 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 ...

3 comentarios: