Com omplir una base de dades amb el primer resultat de Google per a les paraules clau de cada registre?

Imaginem que tenim una base de dades prou gran, posem, de mil registres d’empreses amb qui hem de contactar d’una manera o altra. Tenim una columna amb el nom de l’empresa, però no disposem de la pàgina web ni cap altra informació de contacte. Podem anar copiant i enganxant el nom a Google per trobar el web de cada empresa però seria ideal que, per art de màgia, aparegués en una nova columna a la base de dades amb la pàgina web corresponent.

La màgia no existeix però Google s’hi assembla molt, almenys en el terreny de la cerca de la informació. Si podem exportar la base de dades a qualsevol format que accepti el programari de fulls de càlcul Google Spreadsheets, podem estalviar-nos molta feina fent aparèixer automàticament una columna que inclogui per a cada registre el primer resultat a Google quan s’utilitza el nom de l’empresa com a paraula clau. En la majoria dels casos, es pot preveure que Google encertarà i ens retornarà la web correcta. I en el pitjor dels casos, ens haurà estalviat part de la feina: això sí, Google i el seu servei de fulls de càlcul posen limitacions que fan que tot plegat no sigui tan còmode com podria arribar a ser.

Malauradament, Google no disposa d’una API pública per aconseguir el que ens proposem, però gràcies al servei Custom Search Engine, que l’empresa del cercador posa a disposició dels internautes per fer mini-cercadors centrats en temàtiques concretes o cercadors interns per a webs particulars, podem aconseguir un efecte bastant semblant.

La solució l’he trobada (com sol ser habitual) a Stack Overflow, on l’usuari Bangkokian explica un sistema que resumeixo en els punts següents:

  1. Cal anar a la pàgina principal de Google Custom Search Engine (CSE) i fer clic al botó “Create a Custom Search Engine”.
  2. Escriure un nom i una descripció qualsevol per al (CSE) i posar al camp “Define your search engine” una URL qualsevol. Acceptar els termes d’ús i fer clic a següent.
  3. Adreçar-se al tauler de control (hi ha un botó a la part superior i si no es pot tornar a la portada de Google Custom Search Engine (CSE). Després a la secció “Basics”.
  4. Allà cal seleccionar “Search the entire web but emphasize included”.

I amb això ja n’hi ha prou: el nostre cercador utilitzarà tot l’índex de Google. L’explicació de Bangkokian no es queda aquí i permet refinar més els resultats, però per al nostre propòsit això ja és suficient.

El següent pas és adreçar-se a l’API Console de Google. Allà creem un nom projecte, amb el nom que desitgem. Un cop creat, dins el projecte, dins la pestanya “Services”, cal activar “Custom Search API”. Com es pot comprovar des d’aquest espai mateix, aquesta API té limitacions 100 consultes per dia en la seva versió gratuïta i unes estrictes normes d’ús. Cal llegir-les amb atenció per saber si el nostre projecte incompleix algun punt (evidentment no em faig responsable de res per estar explicant això :P). En el moment d’escriure aquestes línies, el cost de 1.000 consultes addicionals era de 5 dòlars.

Un cop fet això ens cal una URL on enviar les consultes. L’estructura és la següent:

1
https://www.googleapis.com/customsearch/v1?key=<clau secreta de l'API>&alt=atom&cx=<identificador del CSE>q=<paraules+clau+a+cercar>

On <clau secreta de l'API>, hi va una cadena alfanumèrica que es pot trobar a la pestanya API Access de l'API Console de Google, concretament on diu “API key” sota “Key for browser apps (with referers)”. On <identificador del CSE> hi va una cadena de caràcerts que es pot trobar al tauler de control de Google Costum Search Engine > My search engines > control panel, i un cop dins a “Search engine unique ID”. I finalment, on <paraules+clau+a+cercar>, cal passar-li les paraules clau que ens interessin, en el nostre cas les dels noms de les empreses, una per registre. cal passar-ho tot a la URL sense els caràcters “<” i “>” inicials i finals.

Fet tot això, podem retornar a Google Spreadsheet i a la nostra base de dades. Crear la columna que ens interessa amb la primera URL retornada pels resultats de Google és tan fàcil com introduir això a l'editor de fórmules de la primera cel·la de la nova columna:

1
=NOEXPAND(importfeed("https://www.googleapis.com/customsearch/v1?key=<clau secreta de l'API>&alt=atom&cx=<identificador del CSE>q=<paraules+clau+a+cercar>"&F2, "items url", FALSE, 1))

NOEXPAND() serveix perquè l'array que retorna aquesta funció no sobreescrigui altres dades nostres que tinguem al full de càlcul.

Importfeed() llegeix la URL que hem comentat abans, que genera un fitxer de tipus atom (XML).

&F2 indica al programa que les paraules clau que ha de cercar són les contingudes a la cel·la que tingui el nom d'empresa del primer registre.

“items url” li explica a importfeed() que el que ens interessa és que ens retorni l'adreça web.

“False” és perquè no retorni la cadena “URL” just abans de l'adreça en sí (ja sabem que retornarà una adreça perquè és exactament el que li hem demanat).

I per acabar, l'1 determina el nombre d'elements que volem que retorni per cada crida: si augmentem aquest valor, rebrem una llista de resultats per a cada empresa en lloc del web posicionat en primer lloc i prou.

Si no hi ha hagut cap error, hauria d'aparèixer una URL, amb una mica de sort rellevant i relacionada amb el nom de l'empresa del primer registre. Fent clic sobre la cel·la i arrossegant cap a sota el cursor, tantes files com registres hi hagi, el resultat s'hauria de repetir per la resta de registres... malauradament, però, no serà així, perquè Google Spreadsheets limita a 50 el nombre de Importfeed() màxims. En tot cas, podem anar treballant la nostra base de dades de 50 en 50, sempre que el límit de l'API ens ho permeti.