2011-04-09 15 views
5

En primer lugar, no se trata de cómo raspar sitios web. Estoy completamente al tanto de las herramientas disponibles para raspar (css_parser, nokogiri, etc. Estoy usando Ruby para raspar).¿Cómo raspar logotipos de sitios web?

Esta es una pregunta general sobre la mejor solución posible para raspar el logotipo de un sitio web que comienza con nada más que la dirección de un sitio web.

Las dos soluciones que he comenzado a crear son los siguientes:

API
  1. Uso Google AJAX que hacer una búsqueda de imágenes que tiene como alcance el sitio en cuestión, con la pregunta "logotipo", y agarrar las primer resultado. Esto obtiene el logotipo, diría, aproximadamente el 30% del tiempo.
  2. El problema con lo anterior es que Google no parece realmente preocuparse por los logotipos reemplazados por la imagen CSS (es decir, texto H1 que es una imagen reemplazada por el logotipo). La solución que se me ocurre tentativamente es desplegar todos los archivos CSS, buscar las declaraciones url() y luego buscar las palabras encabezado o logotipo en los nombres de los archivos.

La solución dos es problemática debido a la gran cantidad de idiosincrasias de todas las personas que escriben CSS para sitios web. Utilizan el encabezado en lugar del logotipo en el nombre del archivo. A veces, el nombre del archivo es aleatorio, sin decir nada sobre un logotipo. Otras veces, es solo la imagen equivocada.

Me doy cuenta de que podría ser capaz de hacer algo con algún tipo de aprendizaje automático, pero estoy en una fecha límite para un cliente y necesito algo bastante capaz pronto.

Así que con todo lo dicho, si alguien tiene algún pensamiento "fuera de la caja" en este caso, me encantaría escucharlo. Si puedo crear una solución que funcione lo suficientemente bien, planeo abrir la fuente de la biblioteca para cualquier otra parte interesada :)

¡Gracias!

+0

Además, me gustaría añadir que estoy haciendo esto para reducir en el proceso manual de carga de imágenes para mi cliente. Haremos miles de registros, y me gustaría que puedan hacer la menor carga manual posible. ¡Gracias! –

+0

¿qué tal hacer algo así como combinar una de sus búsquedas propuestas con: una búsqueda en google limitada a la url raíz para identificar más de una página en el sitio. Escanee dos o tres páginas para encontrar imágenes y encuentre las que sean comunes a todas las páginas buscadas. Si hubiera resultados múltiples para todas las páginas, necesitaría desarrollar algún tipo de criterio de selección, tal vez sobre el tamaño, tal vez sobre el orden dentro de la página ... pero creo que eso sería un poco de prueba y error para ver qué funcionó mejor. Entonces podría comparar los resultados de los dos enfoques, y si están de acuerdo, tal vez sea el logotipo ... –

+0

¡Parece una gran solución! Soy bastante nuevo en SO (por mucho tiempo lurker), pero ¿por qué no publicar eso como respuesta? –

Respuesta

2

La creación de una aplicación definitivamente le ayudará, pero creo que al final habrá algún trabajo manual involucrado. Esto es lo que haría.

  • Haga que su aplicación almacene en una base de datos un enlace a todas las imágenes de un sitio web que son más grandes que una dimensión específica para que pueda eliminar los iconos pequeños.
  • Luego puede configurar un formulario para acceder a estos resultados. Es posible que desee configurar la tabla de la base de datos para almacenar la url del sitio web y la relación entre la url y los enlaces de imagen.

Incluso si es posible escribir una aplicación para averiguar realmente si era un logotipo o no, parece que sería una gran cantidad de código. Al final, es probable que elimine más que el anterior, pero debe tener en cuenta que podría ser más rápido para el ser humano analizar los resultados visualmente, luego el tiempo que tomó escribir y probar el código complejo.

+1

Ooh.Eso es genial, pero sugiero que, en lugar de descargar y almacenar cada imagen (estamos hablando de al menos 10.000 sitios, y cada uno de ellos tenga toneladas de imágenes), en su lugar guardo una url para todas esas imágenes y ajax. en el formulario de administración ... Mismo concepto, solo menos para almacenar en nuestros servidores. –

+0

Esto también mendiga a Mechanical Turk: D ¡Gracias! –

+0

@Keith Hanson, ya que está hablando de un gran alcance de sitios web, ¿por qué no crear una base de datos que almacena un enlace a las imágenes encontradas. Cada enlace podría pertenecer a la url del sitio web en la base de datos. Luego, podría abrir los detalles de bestbuy.com, que mostrarían enlaces o imágenes para ese sitio web específico en esa página. –

4

Tuve que encontrar logotipos para ~ 10K sitios web para un proyecto anterior e intenté con la misma técnica que mencionaste de extraer la imagen con el "logotipo" en la URL. Mi variación fue que cargué cada página web en webkit para que todas las imágenes se cargaran desde CSS o JavaScript. Esta técnica me dio logotipos para ~ 40% de sitios web.

Luego consideré crear una aplicación como Nick sugirió seleccionar manualmente el logo para los sitios web restantes, sin embargo me di cuenta de que era más rentable simplemente darles esto a alguien barato (que encontré por Elance) para hacer el trabajo manualmente .

Así que sugiero que no se moleste en resolver esto correctamente con una solución totalmente técnica: subcontratar el trabajo manual.

0

Utilicé la aplicación C# console con el paquete nut de HtmlAgilityPack para eliminar logotipos de más de 600 sitios. Algoritmo es que obtienes todas las imágenes que tienen "logo" en url. Los retos que se enfrentará con durante dicha extracción son:

  • imágenes relativas
  • URL base es CDN HTTP/HTTPS (si usted no sabe protocolo antes de hacer una petición)
  • Las imágenes tienen ? o & con consulta cadena al final

Con que las cosas en la mente Saqué aproximadamente el 70% de éxito, pero algunas imágenes no eran reales logotipos.

1

Otra manera simple de resolver este problema es conseguir que todos los nodos hoja y obtener la primera

<a><img src="http://example.com/a/file.png" /></a> 

usted puede buscar para los proyectos para obtener nodos hoja html en la red o utilizar expresiones regulares para obtener toda html etiquetas.

+0

Creo que esta es una gran respuesta y funcionará para la mayoría de los sitios web. – bert