Pregunta

Estoy construyendo un pequeño motor de búsqueda especializado para obtener información sobre premios. El motor solo recopilará segmentos específicos de datos en cada sitio. Mi plan es dividir el proceso en dos pasos.

  1. Raspado de pantalla simple basado en una URL que apunta a la página donde existe el segmento que necesito. ¿Es la forma más fácil de hacer esto simplemente usar un objeto WebClient y obtener el HTML completo?

  2. Una vez que se extrae y guarda el HTML, analícelo a través de algún script y extraiga solo el segmento y los valores que necesito (por ejemplo, el valor del precio de un producto). Mi problema es que este script de alguna manera tiene que ser único para cada sitio que extraigo, debe ser capaz de manejar HTML realmente feo (por lo que no creo que XSLT lo haga ...) y necesito poder cambiarlo sobre la marcha a medida que el sitio objetivo se actualiza y cambia. Finalmente tomaré los valores específicos y los escribiré en una base de datos para que puedan buscarse

¿Podría darme algunas pistas sobre cómo diseñar la mejor manera? ¿Harías algo diferente a lo descrito anteriormente?

¿Fue útil?

Solución

  1. Sí, un WebClient puede funcionar bien para esto. El control de WebBrowser también funcionará según sus requisitos. Si va a cargar el documento en un HtmlDocument (el IE HTML DOM), entonces podría ser más fácil usar el control del navegador web.

  2. El objeto HtmlDocument que ahora está integrado en .NET se puede usar para analizar el HTML. Está diseñado para usarse con el control WebBrowser, pero también puede usar la implementación desde el dll mshtml. He usado mucho el HtmlAgilityPack, pero escuché que puede hacer un trabajo similar.

Los objetos DOM de HTML generalmente manejarán y corregirán el HTML más feo que les arrojes. Además de permitir una mejor manera de analizar el html, document.GetElementsByTag para obtener una colección de objetos de etiqueta, por ejemplo.

En cuanto al manejo de los requisitos cambiantes del sitio, parece un buen candidato para el patrón de estrategia . Puede cargar las estrategias para cada sitio utilizando la reflexión o algo por el estilo.

He trabajado en un sistema que utiliza XML para definir un conjunto genérico de parámetros para extraer texto de páginas HTML. Básicamente definiría los elementos de inicio y fin para comenzar y finalizar la extracción. He descubierto que esta técnica funciona lo suficientemente bien para una muestra pequeña, pero se vuelve bastante engorrosa y difícil de personalizar a medida que la colección de sitios se hace cada vez más grande. Mantener el XML actualizado e intentar mantener un conjunto genérico de XML y codificar el manejo de cualquier tipo de sitio es difícil. Pero si el tipo y número de sitios es pequeño, entonces esto podría funcionar.

Una última cosa para mencionar es que es posible que desee agregar un paso de limpieza a su enfoque. Una forma flexible de limpiar HTML a medida que entra en el proceso fue invaluable en el código en el que he trabajado en el pasado. Quizás implementar un tipo de pipeline sería un buen enfoque si cree que el dominio es lo suficientemente complejo como para justificarlo. Pero incluso un método que ejecute algunas expresiones regulares sobre el HTML antes de analizarlo sería valioso. Deshacerse de las imágenes, reemplazar etiquetas particulares mal utilizadas con HTML más agradable, etc. La cantidad de HTML realmente dudoso que hay por ahí continúa sorprendiéndome ...

Otros consejos

Bueno, seguiría la forma en que lo describes.

1. ¿Cuántos datos va a manejar? Obtener el HTML completo a través de WebClient / HttpWebRequest no debería ser un problema.

2. Iría por HtmlAgilityPack para el análisis HTML. Es muy indulgente, y puede manejar marcas bastante feas. Como HtmlAgilityPack es compatible con XPath, es bastante fácil tener selecciones específicas de xpath para sitios individuales.

Estoy huyendo y voy a ampliar esta respuesta lo antes posible.

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