Pregunta

Cuando no hay API de servicio web disponible, su única opción podría ser la de Capturar datos de pantalla, pero ¿cómo hacerlo en C #?

¿Cómo cree que de hacerlo?

¿Fue útil?

Solución

Matt y respuestas de Pablo son correctos. "Pantalla raspado" mediante el análisis del código HTML de una página web suele ser una mala idea, ya que:

  1. el análisis de HTML puede ser difícil , en especial si se trata de un formato incorrecto. Si usted está raspando una página muy, muy simple entonces las expresiones regulares podrían funcionar. De lo contrario, utilice un marco de análisis como el paquete de agilidad HTML.

  2. Los sitios web son un objetivo en movimiento . Tendrá que actualizar el código cada vez que el sitio web de la fuente cambia su estructura de marcas.

  3. raspado Pantalla no juega bien con Javascript . Si el sitio web de destino está utilizando cualquier tipo de script dinámico para manipular la página web que va a tener un tiempo muy difícil raspado. Es fácil de agarrar la respuesta HTTP, que es mucho más difícil de raspar lo que muestra el explorador en respuesta a comandos de cliente que figura en esa respuesta.

Si captura de imágenes es la única opción, he aquí algunas claves para el éxito:

  1. Que sea lo más fácil posible para cambiar los patrones que se buscan . Si es posible, guarde los patrones como archivos de texto o en un archivo de recursos en alguna parte. Hacen que sea muy fácil para otros desarrolladores (o usted mismo en 3 meses) para comprender lo que de marcado se puede esperar encontrar.

  2. valide la entrada y lanzar excepciones significativas . En su código de análisis, tener cuidado de hacer sus excepciones muy útil. El sitio de destino el cambio en ti, y cuando eso sucede desea que los mensajes de error que indican que no sólo lo que parte del código falló, pero ¿Por qué ha fallado. Mención tanto el patrón que está buscando y el texto que está comparando contra.

  3. Escribir un montón de pruebas automáticas . Usted quiere que sea muy fácil de ejecutar su raspador de una manera no destructiva, ya que a hacer un montón de desarrollo iterativo para obtener los patrones de la derecha. Automatizar tanto las pruebas como se puede, valdrá la pena en el largo plazo.

  4. Considere una herramienta de automatización del navegador Watin . Si requiere complejas interacciones con el sitio web de destino podría ser más fácil para escribir su rascador desde el punto de vista del propio navegador, en lugar de ensuciar con las peticiones y respuestas HTTP a mano.

¿Cómo para raspar la pantalla en C #, puede utilizar Watin (véase más arriba) y raspar el documento resultante mediante su DOM, o puede utilizar la clase WebClient [ver MSDN o Google] para llegar a la respuesta HTTP en bruto, incluyendo el contenido HTML, y luego usar algún tipo de análisis basado en texto para extraer los datos que desea.

Otros consejos

HTML agilidad Paquete . Se trata HTML mal y mal formado. Se le permite consultar con XPath, por lo que es muy fácil encontrar los datos que está buscando. NO escriba un programa de análisis con la mano y no utilice expresiones regulares, es demasiado torpe.

El término que estás buscando es en realidad llamado captura de imágenes.

Una cosa que hay que considerar acerca de raspar los sitios web es que están fuera de su control y pueden cambiar con frecuencia y de manera significativa. Si tienes que ir con raspando el hecho del cambio debe parte de su estrategia global. P.ej. tendrá que actualizar el código antes o después de tratar con un "blanco móvil".

Aquí hay un par de enlaces de C # para empezar:

http://www.cambiaresearch.com/c4/3ee4f5fc-0545-4360-9bc7-5824f840a28c/How-to-scrape-or-download-a-webpage-using-csharp.aspx

A continuación se muestra el código C # que le ayudará

Uri url = new Uri("http://msdn.microsoft.com/en-US/");
if (url.Scheme == Uri.UriSchemeHttp)
{
    //Create Request Object
    HttpWebRequest objRequest = (HttpWebRequest)HttpWebRequest.Create(url);
    //Set Request Method
    objRequest.Method = WebRequestMethods.Http.Get;
    //Get response from requested url
    HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
    //Read response in stream reader
    StreamReader reader = new StreamReader(objResponse.GetResponseStream());
    string tmp = reader.ReadToEnd();
    objResponse.Close();
    //Set response data to container
    this.pnlScreen.GroupingText = tmp;
}

Sólo una cosa a tener en cuenta, algunas personas han mencionado tirando hacia abajo la página web como XML y luego usando XPath para iterar a través de los nodos. Es probable que sea importante para asegurarse de que está trabajando con un sitio que ha sido desarrollada en XHTML para asegurarse de que el código HTML representa un documento XML bien formado.

Desde una perspectiva práctica (he escrito decenas de aplicaciones "en la web interactiva" en los últimos años), finalmente me decidí por Watin combinado con CSQuery .

Watin proporcionar los fundamentos de la automatización del navegador (interactuando con botones, etc), mientras que CSQuery le permite utilizar la sintaxis de estilo jQuery para analizar el contenido de la página.

I utiliza selenio por un tiempo (también diseñada para la prueba automática de sitios web) con IE y Firefox, pero encontraron que sea propenso a estrellarse cuando se utiliza para raspar a largo plazo. Todos mis sistemas de producción actuales son Watin + CSQuery y proporcionan raspado fiable de múltiples sitios web en una base diaria.

Nota: Me di cuenta Watin no se ha actualizado durante un tiempo, pero "si no está roto, lo uso!":)

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