Obteniendo imágenes para una base de datos usando Google Search Engine

Sucede a veces que hemos conseguido una base de datos excelente, de productos para una tienda online, de establecimientos, etc... y la queremos usar para hacer un desarrollo web o una app, pero no tenemos las imágenes de cada establecimiento o producto, o bien tenemos las imágenes pero vienen con marca de agua, o no las podemos usar por otras razones. Vamos a conseguirlas de Google Images.

Nos logeamos en nuestra cuenta de Google, y a continuación creamos una cuenta en Google Custom Search.
Una vez creada, clickamos en "Nuevo motor de búsqueda". Le damos un nombre, seleccionamos idioma, y donde pone "Sitios en los que buscar" ponemos cualquier esquema, no importa porque luego no se usará; por ejemplo "*.website.com".
Una vez creado, en las opciones que salen pinchamos en "Verlo en la web - Url pública". En el navegador veremos una URL del tipo:
https://www.google.com/cse/publicurl?cx=0123456789:xug12345sgzj9 
Hay que anotar ese parámetro "cx" para después. Ahora seleccionamos "Modifica tu motor de búsqueda - Panel de control". En la página de opciones, pinchamos en "Búsqueda de imágenes", seleccionamos "Si", asi buscará en Google Images. En "Sitios en los que buscar", seleccionamos "Buscar en toda la web, pero enfatizar los sitios incluidos". Una vez hecho esto, hay que crear una cuenta en Google Developers Console, si no disponemos de ella.

Creamos un nuevo proyecto "Create project" y lo llamamos por ejemplo "Buscando imagenes". Vamos a "APIs & auth", a "APIs", y ponemos en OFF todos los que el pone por defecto (Big Data, etc...), luego ponemos en ON el "Custom Search API". Ahora vamos a "Credentials", y seleccionamos "Create new key". En el dialogo que nos sale, elegimos "Server key", le damos a "Create" (sin poner nada en la zona de edición), y con esto hemos creado una api key, la anotamos para luego.

Ya tenemos las keys e ids para usar el buscador de imágenes. Las imágenes se obtienen vía GET, con una serie de parámetros que actuan como filtro. En la página de Google Custom Search vemos todos los parámetros posibles. Los más interesantes son:
  • q: Este es el parámetro más importante, lo que vamos a buscar. Tiene que ir en formato URL
  • key: La key que sacamos en Google Developers Console
  • cx: El parametro que anotamos anteriormente, en el primer paso
  • lr: El idioma, ponemos "lang_es"
  • cr: El país, por ejemplo España es "countryES"
  • imgType: tipo de imagen, ponemos "photo" para buscar fotos
  • imgSize: Para que no nos salgan imágenes muy pequeñas o iconos, ponemos "medium", "large", etc.
  • googlehost: Nos permite restringir la búsqueda a un Google localizado, por ejemplo google.es
  • num: El numero de imágenes que nos devolverá
La url que nos queda es algo así:

https://www.googleapis.com/customsearch/v1?googlehost=google.es&lr=lang_es&imgType=photo&imgSize=medium&num=1&cr=countryES&searchType=image&key=AIzaabcdefghijklmnopqrstuvwxyz1234&cx=123456789:w5tfght45rt6y7u&q=keyword+a+buscar
Esto nos envía un JSON con el resultado, que podemos parsear con PHP. Vamos a hacer un script que haga una consulta en esa base de datos, obtenga el nombre o el campo que vayamos a usar para buscar imagenes de cada registro y nos grabe el nombre de la imagen que nos devuelve Google en el propio registro, en el campo "imagen". De esta forma ya tendríamos todos los registros con el campo "imagen" actualizado con el nombre de una imagen real.
El script se podría mejorar, por ejemplo grabando varias imágenes de cada registro en otra tabla relacionada, o renombrando las imágenes para que no conserven los nombres de fichero originales obtenidos via Google. Además de actualizar la base de datos, el script nos devolverá una lista de URLs de las imagenes, lista que podemos procesar facilmente con cualquier gestor de descargas, como JDownloader, para bajarlas todas.

$link=mysql_connect("HOST", "USER", "PASSWORD"); 
$db_selected = mysql_select_db('DATABASE', $link); 
$res = mysql_query("select id,nombre from mitabla limit 100"); 
while ($row = mysql_fetch_array($res)) { 
if ($row['nombre']) { 
$termino=urlencode(charnochars($row['nombre']).", Madrid"); 
$ch = curl_init(); 
$timeout = 0;  
curl_setopt ($ch, CURLOPT_URL, "https://www.googleapis.com/customsearch/v1?googlehost=google.es&lr=lang_es&imgType=photo&imgSize=large&num=1&cr=countryES&searchType=image&key=MI_API_KEY&cx=MI_IDENTIFICADOR&q=".$termino); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
$content = curl_exec($ch); 
curl_close($ch); 
$ch=null; 
$json=json_decode($content); 
if ($json->items[0]->link) { 
    $bits = explode('/', $json->items[0]->link);  
    $sql = "UPDATE mitabla SET imagen ='".$bits[count($bits)-1]."' WHERE id =".$row['id']; 
    mysql_query($sql); 
    echo $json->items[0]->link."<br />"; 


 sleep(1); // una pausa de 1 segundo por consulta, esto lo podemos quitar si ralentiza mucho 

mysql_free_result($res);  
  
function charnochars($search) { 
$chars = array("À" => "A","Â" => "A","Ä" => "A","Æ" => "AE","È" => "E","Ê" => "E","Ì" => "I","Î" => "I","Ð" => "D","Ò" => "O","Ô" => "O","Ö" => "O","Ø" => "O", 
"Ú" => "U","Ü" => "U","à" => "a","â" => "a","ä" => "a","æ" => "ae","è" => "e","ê" => "e","ì" => "i","î" => "i","ð" => "o","ò" => "o","ô" => "o","ö" => "o", 
"ø" => "o","ú" => "u","ü" => "u","Á" => "A","Ã" => "A","Å" => "A","Ç" => "C","É" => "E","Ë" => "E","Í" => "I","Ï" => "I","Ñ" => "N","Ó" => "O","Õ" => "O", 
"Ù" => "U","Û" => "U","Ý" => "Y","ß" => "B","á" => "a","ã" => "a","å" => "a","ç" => "c","é" => "e","ë" => "e","í" => "i","ï" => "i","ñ" => "n","ó" => "o", 
"õ" => "o","ù" => "u","û" => "u","ý" => "y","ÿ" => "y"); 
return str_replace(array_keys($chars),$chars,$search); 
}
Sobre este script hay que matizar lo siguiente:

- He puesto un limite de 100 en la consulta, porque este servicio de Google tiene esa limitación:
"For CSE users, the API provides 100 search queries per day for free. If you need more, you may sign up for billing in the Cloud Console. Additional requests cost $5 per 1000 queries, up to 10k queries per day."
Gratis se pueden hacer 100 consultas diarias, pero con la opción de pago muchas más, 5$ por cada 1000 hasta 10000 diarias. Si la base de datos es muy grande, igual es mejor pagar y no estar bajando 100 cada día hasta completarla.

- Uso la función "charnochars" para quitar todos los caracteres especiales al keyword de la búsqueda. A pesar de que utilizamos urlencode, a Google no le gustan las eñes y otros caracteres. No importa, Google encuentra lo mismo para "España" que para "espana". Cuidado también con el encoding del script, (utf-8, iso latin, etc...), que puede hacer que esta función funcione incorrectamente.

- Añado la ciudad o la provincia al keyword: Si buscamos algo muy localizado, esto nos dará fotos más exactas, ya que si por ejemplo busco fotos de establecimientos de Bilbao, si busco "Bar Reynolds", ese bar lo habrá en mil sitios de España, pero si pongo "Bar ReynoldsBilbao" será más exacto.

- En la lista resultante habrá fotos que no tengan nada que ver con lo que queríamos, es un riesgo que corremos. Las fotos que bajemos serán todas muy distintas en dimensiones, las habrá que pasar por Photoshop para igualarlas, con una acción de Photoshop lo hacemos facilmente.
Deja un comentario
He leido y acepto la Política de Privacidad

Los comentarios enviados por cada usuario serán siempre visibles en el post correspondiente, y no serán utilizados para ningún otro fin. El usuario tiene derecho a acceder, rectificar y suprimir dichos comentarios, tal como se refleja en nuestra Política de Privacidad