Screen Scraping, Web Scraping, Web Harvesting, Web Data Extraction, etc. utilizando C # y .NET Framework

.net c# html-agility-pack visual-studio web-scraping

Pregunta

Estoy trabajando en una aplicación Microsoft .NET en C # para Recolección de Web, Rastreo de Web, Extracción de Datos de Web, Rastreo de Pantalla, etc. como quiera que lo llame. Para analizar HTML, estoy intentando incorporar HTML Agility Pack, pero no es tan fácil como pensé. He incluido algunas especificaciones e imágenes de lo que tengo hasta ahora y esperaba obtener sus opiniones sobre cómo podría proceder. Básicamente, quiero hacer algo similar al diseño usado en Visual Web Ripper pero no tengo idea de cómo lo hacen ... ¿Alguna idea?

Imágenes:

http://img69.imageshack.us/img69/8880/webharvester1.png

http://img198.imageshack.us/img198/9563/webharvester2.png

Presupuesto:

Mi objetivo es hacer una aplicación de apuntar y hacer clic muy fácil de usar para descargar datos e imágenes de la web. Me gustaría cargar páginas HTML utilizando el navegador web y generar los datos analizados y los enlaces de imagen en el cuadro de texto. El usuario puede especificar qué etiquetas HTML desea y luego descargar los datos en la cuadrícula. Finalmente, exporte los datos a cualquier formato que necesiten.

Estoy tratando de usar HTML Agility Pack para cargar el HTML en la página web y mostrarlo en el cuadro de texto.

    // Load Web Browser
    private void Form6_Load(object sender, EventArgs e)
    {
        // Navigate to webpage
        webBrowser.Navigate("http://www.webopedia.com/TERM/H/HTML.html");

        // Save URL to memory
        SiteMemoryArray[count] = urlTextBox.Text; 

        // Load HTML from webBrowser
        HtmlWindow window = webBrowser.Document.Window; 
        string str = window.Document.Body.OuterHtml;

        // Extract tags using HtmlAgilityPack and display in textbox
        HtmlAgilityPack.HtmlDocument HtmlDoc = new HtmlAgilityPack.HtmlDocument();
        HtmlDoc.LoadHtml(str);

        HtmlAgilityPack.HtmlNodeCollection Nodes = HtmlDoc.DocumentNode.SelectNodes("//a");

        foreach (HtmlAgilityPack.HtmlNode Node in Nodes)
        {
            textBox2.Text += Node.OuterHtml + "\r\n";
        }

    }

Para: HtmlWindow window = webBrowser.Document.Window;

Me sale el error: la referencia de objeto no está establecida en una instancia de un objeto.

Respuesta aceptada

Es posible que no haya completado la carga de la página cuando hace referencia a la ventana del navegador. Puede hacer que el control del navegador active el evento de navegación completa cuando haya terminado. Vea esta respuesta SO para ver un ejemplo: C # cómo esperar a que una página web termine de cargarse antes de continuar


Respuesta popular

Para el raspado de la pantalla, si está buscando imágenes / formas particulares, puede usar http://www.emgu.com/wiki/index.php/Main_Page . Podría ser útil.

También puede "leer" la pantalla usando WinAPI como tal

    private Bitmap Capture(IntPtr hwnd)
    {
        return Capture(hwnd, GetClientRectangle());
    }

    private Bitmap Capture(IntPtr hwnd, Rectangle zone)
    {
        IntPtr hdcSrc = GetWindowDC(hwnd);

        IntPtr hdcDest = CreateCompatibleDC(hdcSrc);

        IntPtr hBitmap = CreateCompatibleBitmap(hdcSrc, zone.Width, zone.Height);

        IntPtr hOld = SelectObject(hdcDest, hBitmap);

        BitBlt(hdcDest, 0, 0, zone.Width, zone.Height, hdcSrc, zone.X, zone.Y, SRCCOPY);


        SelectObject(hdcDest, hOld);

        DeleteDC(hdcDest);
        ReleaseDC(hwnd, hdcSrc);

        Bitmap retBitmap = Bitmap.FromHbitmap(hBitmap);

        DeleteObject(hBitmap);
        return retBitmap;
    }


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow