Pregunta

Quiero saber si hay una mejor manera de extraer información de una página web que analizar el HTML para lo que estoy buscando. es decir: extraer calificación de películas de 'imdb.com'

Actualmente estoy usando los componentes IndyHTTP para obtener la página y estoy usando strutils para analizar el texto, pero el contenido es limitado.

¿Fue útil?

Solución

Encontré que Regex-ES simple es muy intuitivo y simple cuando se trata de buenos sitios web, y IMDB es un buen sitio web.

Por ejemplo, la calificación de la película en la página HTML de la película de IMDB está en un <DIV> con class="star-box-giga-star". Eso es muy fácil de extraer usando una expresión regular. La siguiente expresión regular extraerá la calificación de la película del HTML RAW al Grupo de Captura 1:

star-box-giga-star[^>]*>([^<]*)<

No es bonito, pero hace el trabajo. El Regex busca la ID de clase "Star-Box-Box-Giga-Star", luego busca el > que termina el DIV, y luego captura todo hasta lo siguiente <. Para crear una nueva regex como esta, debe usar un navegador web que permita inspeccionar elementos (por ejemplo, Crome u Opera). Con Chrome, simplemente puede mirar la página web, haga clic derecho en el elemento que desea capturar y hacer Inspect element, luego busque elementos fácilmente identificables que se puedan usar para crear una buena regex. En este caso el "star-box-giga-star" ¡Obviamente la clase es fácilmente identificable! Por lo general, no tendrá problemas para encontrar tales elementos identificables en buenos sitios web porque los buenos sitios web usan CSS y CSS requiere ID's o classEs para poder peinar los elementos correctamente.

Otros consejos

Procesando RSS Feed es más cómodo.

A partir del momento de la publicación, los únicos alimentos RSS disponibles en el sitio son:

  • Nacido en esta fecha
  • Murió en esta fecha
  • Encuesta diaria

Sin embargo, puede hacer una llamada para agregar una nueva poniéndose en contacto con el mesa de ayuda.

Recursos en el procesamiento de alimentos RSS:

Al raspar sitios web, no puede confiar en la disponibilidad de la información. IMDB puede detectar su raspado e intentar bloquearlo, o con frecuencia pueden cambiar el formato para que sea más difícil.

Por lo tanto, siempre debe tratar de usar una API compatible o una alimentación RSS, o al menos obtener permiso del sitio web para agregar sus datos y asegurarse de que está respetando sus términos. A menudo, tendrá que pagar por este tipo de acceso. Rastrear un sitio web sin permiso puede abrirlo a responsabilidad en un par de frentes legales (denegación de servicio y propiedad intelectual).

Aquí está IMDB's declaración:

No puede usar minería de datos, robots, raspado de pantalla o herramientas similares de recopilación y extracción de datos en línea en nuestro sitio web.

Para responder a su pregunta, la mejor manera es usar el método proporcionado por el sitio web. Para uso no comercial, y si cumple con su términos, puedes Descargue la base de datos IMDB directamente y use los datos de allí en lugar de raspar su sitio. Simplemente actualice su base de datos con frecuencia, y es una mejor solución que raspar el sitio. Incluso podría envolver su propia API web a su alrededor. Las calificaciones están disponibles como una mesa independiente.

Use HTML Tidy para convertir cualquier HTML en XML válido y luego use un analizador XML, tal vez usando XPATH o desarrollando su propio código (que es lo que hago).

Todas las respuestas publicadas cubren bien su pregunta genérica. Por lo general, sigo una estrategia similar a la detallada por Cosmin. Utilizo Wininet y Regex para la mayoría de mis necesidades de extracción web.

Pero permítanme agregar mis dos centavos en la subcuestra específica al extraer la calificación IMDB. IMDBAPI.com proporciona una interfaz de consulta que devuelve el código JSON, que es muy útil para este tipo de búsquedas.

Por lo tanto, un programa de línea de comandos muy simple para obtener una calificación IMDB sería ...

program imdbrating;
{$apptype console}
uses htmlutils;

function ExtractJsonParm(parm:string;h:string):string;
 var r:integer;
 begin
  r:=pos('"'+Parm+'":',h);
  if r<>0 then 
    result:=copy(h,r+length(Parm)+4,pos(',',copy(h,r+length(Parm)+4,length(h)))-2)
  else
    result:='N/A';
 end;

var h:string;
begin
  h:=HttpGet('http://www.imdbapi.com/?t=' + UrlEncode(ParamStr(1)));
  writeln(ExtractJsonParm('Rating',h));
end.

Si la página que está gateando es XML válido, uso SimpleXML extraer infos. Funciona bastante bien.

Recurso:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top