Tutorial Cómo obtener imágenes para una base de datos usando Google Search Engine

Estado
No está abierto para más respuestas.
Mensajes
121
Puntuación de reacción
0
Este tutorial es por si conseguimos una base de datos muy buena, de establecimientos, productos de tienda, etc… y la queremos usar para hacer una web o app, pero no tenemos las imágenes de los mismos, o bien tenemos las imágenes y vienen con marca de agua o no las podemos usar por la razón que sea. La idea es conseguirlas de Google Images.

Lo primero es tener una cuenta de Google, todos la tenemos. Hay que crear una cuenta en Google Custom Search.
Una vez creada, seleccionamos “Nuevo motor de búsqueda”. Le damos el nombre que sea, idioma Español, y donde pone “Sitios en los que buscar” ponemos cualquier esquema, da igual porque luego no se tendrá en cuenta; por ejemplo “*.nuestraweb.com”.
Una vez creado, nos salen unas opciones, pinchamos en “Verlo en la web - Url pública”. En el navegador, nos saldrá una URL del tipo:

Código:
https://www.google.com/cse/publicurl?cx=01770423423494147:xug73455sggj8

Anotar ese parámetro “cx” para luego. Ahora pinchamos en “Modifica tu motor de búsqueda - Panel de control”. En la página de opciones que nos sale, pinchamos en “Búsqueda de imágenes”, o sea le damos a “Si”, de este manera buscará en Google Images. En “Sitios en los que buscar”, elegimos “Buscar en toda la web, pero enfatizar los sitios incluidos”. Una vez hecho esto, vamos al siguiente paso.

Hay que crear una cuenta en Google Developers Console, si es que no la tenemos aun.
Creamos un nuevo proyecto “Create project” y lo llamamos por ejemplo “Buscador de imagenes”. Vamos a “APIs & auth”, a “APIs”, y ponemos en OFF todos los que el pone por defecto (lo de Big Data, etc…), luego ponemos en ON el “Custom Search API”. A continuación, vamos a “Credentials”, y pinchamos en “Create new key”. En el dialogo que nos sale, elegimos “Server key”, le damos a “Create” (sin poner nada en el textarea), y veremos que nos ha creado una api key, la anotamos para más tarde.

Con todo esto, ya tenemos las credenciales para usar el buscador de imágenes. Las imágenes se obtienen vía GET, con una serie de parámetros a modo de filtro. Entramos en la página de Google Custom Search y vemos todos los parámetros posibles. Los más interesantes son:

  • googlehost: Nos permite restringir la búsqueda a un Google local, por ejemplo google.es
  • lr: El idioma, ponemos “lang_es”
  • cr: El país, por ejemplo España es “countryES”
  • imgType: tipo de imagen, ponemos “photo”
  • imgSize: Esta es importante, para que no nos salgan imágenes muy pequeñas o iconos, ponemos “medium”, “large” o lo que sea
  • num: El numero de imágenes a devolver
  • key: La key que sacamos antes en la Google Developers Console
  • cx: El parametro que anotamos anteriormente.
  • q: Este es el parámetro más importante, es lo que vamos a buscar. Tiene que ir en formato URL (+ en vez de espacios, etc..)

En definitiva, la url que nos queda es algo así:

Código:
https://www.googleapis.com/customsearch/v1?googlehost=google.es&lr=lang_es&imgType=photo&imgSize=medium&num=1&cr=countryES&searchType=image&key=AIzaSyzzzzK7eeeeSd-qEGbbbbjcpmmmmAXa1c&cx=017333333333333147:w4rere443recjk&q=Cosa+a+buscar

Esto nos devuelve un JSON con los resultados, que podemos parsear con PHP fácilmente con CURL.

Ahora vamos a hacer un script PHP que haga un query en esa base de datos tan buena que conseguimos, obtenga el nombre o el campo que vayamos a usar para buscar 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 de la base de datos con el campo “imagen” actualizado con una imagen real.
Evidentemente esto se puede mejorar, por ejemplo grabando varias imágenes por registro en una tabla intermedia, o incluso renombrando las imágenes para que no sea tan evidente que las obtuvimos vía Google. Eso ya lo dejo para que el programador que implemente el tutorial le haga esas mejoras. Además de la actualización de la base de datos, el script nos devolverá una lista de URLs de las imagenes, lista que copiaremos en el portapapeles y la pegaremos en cualquier gestor de descargas, como JDownloader, para bajarlas todas a nuestro disco.

PHP:
$link=mysql_connect("HOST", "USER", "PWD");
$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); //para no floodear mucho que haya 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 código, varias cuestiones:

- Pongo un limite de 100 en la consulta, porque este servicio de Google tiene una 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.”

O sea que gratis puedes hacer 100 consultas diarias, pero pagando muchas más, 5$ por cada 1000 hasta 10000 diarias. Si la base de datos es muy grande, igual nos conviene pagar y no estar a 100 cada día hasta completarla.

- Utilizo una función para quitar todos los caracteres raros al keyword que se busca. A pesar de que le pasamos un urlencode, a Google no le gustan las eñes y demás. Da igual, Google encuentra lo mismo para “La cabaña del tío Tom” que para “la cabana del tio Tom”. Al hilo de esto, ojo con el encoding en el script, (utf-8, iso latin, etc…), que puede hacer que esta función funcione mal.

- Le pongo la ciudad o la provincia al keyword: Esto nos dará fotos más exactas, ya que si por ejemplo busco fotos de establecimientos de Madrid, si busco “Casa Pepe”, ese bar lo habrá en mil sitios de España, pero si pongo “Casa Pepe, Madrid” será más exacto.

- Por supuesto, habrá fotos que no tengan que ver con lo que queríamos, ahí poco podemos hacer. Las fotos que bajemos serán todas muy heterogéneas en dimensiones, las habrá que pasar por Photoshop para igualarlas, con una acción lo hacemos del tirón, e incluso creamos thumbnails o lo que haga falta.
 
Mensajes
121
Puntuación de reacción
0
gracias Jose por el like, pero debido al "exitazo" del tutorial, el resto los seguiré poniendo en mi web
 
Estado
No está abierto para más respuestas.
Arriba