Resultados de búsqueda de Google en Google Docs

Hoy, aquí en malnuer, vamos a ver cómo conseguir que los resultados de búsqueda que Google nos muestra habitualmente en su página web, nos aparezcan en una hoja de cálculo de Google Docs (Google Sheets). Esto puede parecer un capricho muy raro, pero es algo que puede venir muy bien para labores de SEO por ejemplo.

No quiero perder mucho tiempo, así que ve a Google Docs y crea una hoja de cálculo nueva.

Muestra resultados de búsqueda en Google Sheets

Para hacer la búsqueda en Google necesitaremos 3 valores que guardaremos en las tres primeras celdas, en la A1, B1 y C1 y que respectivamente serán “lo que queremos buscar“, “el número de resultados que queremos ver” y “el idioma“. Estas 3 cosas se incluirán como variables GET, en la URL a la que haremos la petición. Pero antes de seguir te quiero comentar unos detalles:

  • Celda A1 – Lo que queremos buscar: Cuando escribimos nuestra búsqueda en la barra de Google separamos las palabras con espacios, pero para usar esto en la URL tendremos que separar las palabras con el signo +. Si buscamos “hoteles baratos“, deberíamos poner “hoteles+baratos“.
  • Celda B1 – Número de resultados: El máximo es 100, y lo habitual para una búsqueda en Google normal es 10. Así que pon por ejemplo: 20.
  • Celda C1 – El idioma: Querrás hacer la búsqueda en español, así que en esta celda tendrás que poner “es“, pero si quieres inglés será “en“.

El siguiente paso será construir la URL de la petición usando estos valores. Para hacer una búsqueda en Google, la dirección a la que hay que enviar la “query” es https://www.google.es/search y hay que pasarle las variables necesarias con GET. La búsqueda es “q“, el número de resultados es “num” y el idioma es “hl“.

Así que en la celda D1 vamos a poner la siguiente fórmula:

=CONCATENATE("https://www.google.com/search?q=";A1;"&num=";B1;"&hl=";C1)

Como ves, es muy sencillo, simplemente hemos unido todas las partes para formar una cadena de texto completa que nos sirva para hacer la búsqueda de Google.

Bien, ahora vamos a dejar la siguiente fila en blanco para que no se apelotonen las cosas, y en la línea 3 ponemos los títulos de los datos que vamos a recibir de Google. Escribe en las celdas A3, B3 y C3 (puedes ponerlo en negrita o usar colores si quieres): HREF, PÁGINA y DOMINIO.

Y aquí viene la magia por fin. En la celda A4, es decir, debajo del título HREF, vamos a pedirle a Google Docs que ejecute la búsqueda y con la respuesta, nos muestre la lista de los HREF de todos los enlaces que tengan la clase “r” y que empiecen por “/url“. Escribe esto y ahora te explico mejor cómo funciona el asunto:

=IMPORTXML(D1; "//h3[@class='r']/a/@href[starts-with(.,'/url')]")

Nota: si al escribir esto te aparece un error, ve al final del artículo donde hay una explicacion sobre cuál podría ser el problema.

La función IMPORTXML sirve para cargar un documento XML externo. Esto lo aprovechamos para pedir la página de resultados de la búsqueda a Google. El otro parámetro sirve para decir qué es lo que queremos sacar exactamente de los datos recibidos, y para especificarlo usamos XPath. Después de haber dicho esto, podría pasar de largo disimuladamente como si no hubiese dicho nada o pararme a explicar lo que es XPath… Y la verdad es que es complejo y extenso, pero como mínimo tengo que intentar que se entienda lo que he hecho, así que allá vamos.

¿Qué es XPath? Se trata de un lenguaje que a través de “expresiones” permite recorrer y seleccionar elementos o datos de un archivo XML. La sintaxix nos recuerda bastante a lo que se podría hacer con jQuery, pero tiene sus propias reglas.  Voy a dejar aquí algunos enlaces para quien quiera saber más: Definición de XPath en Wikipedia, Documentación sobre XPath de la W3C y XPath en el MDN de Mozilla. Y yo simplemente me limitaré a explicar cómo funciona el XPath que he usado en la celda A4.

Vamos a “deconstruirlo” para comprenderlo desde lo más básico a lo más complejo:

  • //h3 – Si sólamente pusiésemos esto, estaríamos diciendo que queremos un listado de todos los elementos de tipo H3 que haya en el documento de respuesta.
  • //h3[@class=’r’] – Con esto también estamos diciendo que queremos todos los H3, pero sólo si cumplen la condición (los corchetes implican condición) de que tengan la clase ‘r‘ (la arroba implica atributo). Esto lo hacemos porque resultados de Google que nos interesan tienen esta clase.
  • //h3[@class=’r’]/a – Aquí lo que estamos pidiendo, ya no son los H3, sino la lista de aquellos elementos A que estén dentro de un H3 que tengan la clase ‘r‘. Ya estamos acercándonos.
  • //h3[@class=’r’]/a/@href – Bien, ahora lo que queremos es la lista de los atributos HREF de los enlaces que estén dentro de un H3 que tenga la clase ‘r‘. Ya casi casi.
  • //h3[@class=’r’]/a/@href[starts-with(.,’/url’)] – Finalmente, lo que hacemos es quedarnos solamente con aquellas URL de la lista anterior que comiencen con la cadena “/url“. Esto lo hacemos porque aunque los resultados de Google que nos interesan tienen la clase ‘r‘, también pueden aparecer como resultados: mapas, anuncios, imágenes… que no queremos. Para diferenciar los enlaces normales de este otro tipo de contenido, nos basta con mirar si el HREF comienza con “/url“. Aquí vemos que para la condición, estamos usando la función starts-with, que verifica si la cadena que se pasa como primer argumento, comienza por la cadena que se le pasa como segundo argumento. Hemos usado el punto para indicar que es el propio valor (es decir el @href) el que queremos comparar.

Espero que se haya entendido bien, pero si no, ahí están los comentarios para preguntar.

Pasamos ahora a la celda B4 que está justo debajo del título PÁGINA. Aquí ponemos la siguiente fórmula:

=ARRAYFORMULA(REGEXEXTRACT(A4:A; "\/url\?q=(.+)&sa"))

Aquí, lo que le estamos pidiendo a Google Sheets, es que coja todos los valores que hemos recibido y que extraiga de cada uno lo que haya entre “/url?q=” y “&sa” que será la URL de la página. Esta vez sí que me voy a saltar la explicación sobre lo que son las expresiones regulares, porque supongo que sí son más conocidas, ¿no?

Lo que habrás notado es que debajo de los resultados, tendrás un montón de celdas en las que pone “N/A“. Esto se debe al error de que en las celdas vacías no se puede extraer la parte que nos interesa. Si te da igual eso, lo puedes dejar así, pero si prefieres que no salga, basta con cambiar la última fórmula por esta otra: (en azul lo que he añadido nuevo)

=ARRAYFORMULA(if(A4:A<>"";REGEXEXTRACT(A4:A; "\/url\?q=(.+)&sa");""))

Simplemente verificamos primero si la celda está vacía o no. Si tiene algo, extraemos el valor con REGEXEXTRACT y si no tiene nada, ponemos una cadena vacía.

Para acabar, vamos con la celda C4, que está debajo del título DOMINIO:

=ARRAYFORMULA(REGEXEXTRACT(B4:B; "https?:\/\/(.[^\/]+)"))

Tenemos otra expresión regular, esta vez para coger lo que haya entre la parte que ponga “http://” (o “https://“) y la primera barra ‘/’ que aparezca. Esto es lo típico que se hace para extraer el dominio de una URL. Al igual que antes, si quieres eliminar los resultados debajo que ponga “N/A“, puedes usar esta otra fórmula: (en azul la parte añadida)

=ARRAYFORMULA(if(B4:B<>"";REGEXEXTRACT(B4:B; "https?:\/\/(.[^\/]+)");""))

Ya hemos terminado, pero tengo que avisarte de un posible nconveniente que tiene este método de obtener los resultados de búsqueda de Google. Resulta que a Google no le gusta que hagas esto, se me ocurren varios motivos, pero uno de los más evidentes es que Google quiere que los usuarios vean su publicidad. A fin de cuentas, esa es la manera que tiene para monetizar su negocio. Si haces esto unas cuantas veces no pasa nada, pero si lo haces mil veces por minuto con mil búsquedas distintas usando algún tipo de automatización, Google empezará a mirarte con mala cara, y su forma de desconfiar de ti es plantarte un captcha para asegurarse de que eres un ser vivo y no un robot. Si Google nos devuelve un captcha, no vamos a poder resolverlo, así que lo que obtendremos es un montón de celdas “N/A“.

Pero yo no he hecho mil peticiones y me aparece ese error, ¿por qué?“, bueno, esto puede ocurrir porque cuando haces usas la función IMPORTXML, no haces las peticiones desde tu ordenador (con tu IP), sino desde el servidor de Google que esté alojando tu hoja de cálculo en ese momento. Pero claro, ese servidor y su IP, no lo estás usando solamente tú, así que si otros usuarios están haciendo cosas “sospechosas“, Google podría estar controlando esa IP y por lo tanto a todos los usuarios relacionados con ella incluido tú.

¿Qué puedo hacer entonces?“, pues no mucho, esperar un rato y volver a probar, o quizás recargar la página para ver si te asignan otro servidor nuevo desde donde poder hacer la consulta.


BONUS! Vamos a poner una columna más. No es importante, pero quedará bonito.

Vete a la celda D3 y escribe FAVICON, después en la celda D4 escribe esto:

=ARRAYFORMULA(IMAGE(CONCAT("https://www.google.com/s2/favicons?domain=";C4:C);4;16;16))

No me voy a parar mucho, porque ya se está haciendo largo el post, pero por lo menos te comento que Google tiene un servicio (s2/favicons) que si le pasas un dominio, te devuelve su favicon. Y con eso y la función IMAGE que sirve para dibujar una imagen en una celda, ya tenemos nuestra columna de iconos.

 

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn