Nettoyage d'écran, Web Scraping, Web Harvesting, Extraction de données Web, etc. en utilisant C # et le .NET Framework

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

Question

Je travaille sur une application Microsoft .NET en C # pour la récupération Web, le nettoyage Web, l'extraction de données Web, le nettoyage d'écran, etc. Pour l'analyse HTML, j'essaie d'incorporer HTML Agility Pack, mais ce n'est pas aussi facile que je le pensais. J'ai inclus quelques spécifications et images de ce que j'ai jusqu'à présent et espérais avoir votre avis sur la manière de procéder. En gros, je veux faire quelque chose de similaire à la mise en page utilisée dans Visual Web Ripper mais je ne sais pas comment ils le font ... Des idées?

Images:

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

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

Caractéristiques:

Mon objectif est de créer une application très conviviale de type pointer-cliquer pour télécharger des données et des images à partir du Web. Je souhaite charger des pages HTML à l'aide du navigateur Web et générer les liens de données et d'images analysés dans la zone de texte. L'utilisateur peut spécifier les balises HTML qu'il souhaite, puis télécharger les données dans la grille. Enfin, exportez les données dans le format de votre choix.

J'essaie d'utiliser HTML Agility Pack pour charger le code HTML sur la page Web et l'afficher dans la zone de texte.

    // 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";
        }

    }

Pour: HtmlWindow window = webBrowser.Document.Window;

J'obtiens l'erreur: Référence d'objet non définie sur une instance d'objet.

Réponse acceptée

Le chargement de la page n’est peut-être pas terminé lorsque vous faites référence à la fenêtre du navigateur. Vous pouvez faire en sorte que le contrôle du navigateur déclenche l'événement navigationcomplete lorsqu'il est terminé. Voir cette réponse SO pour un exemple: C # comment attendre le chargement d’une page Web avant de continuer


Réponse populaire

Pour rayer l'écran, si vous recherchez des images / formes particulières, vous pouvez utiliser http://www.emgu.com/wiki/index.php/Main_Page . Pourrait être utile.

Vous pouvez également "lire" l'écran en utilisant WinAPI en tant que tel

    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;
    }



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi