C # 및 .NET Framework를 사용하여 화면 스크래핑, 웹 스크래핑, 웹 수확, 웹 데이터 추출 등

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

문제

저는 C #에서 Web Harvesting, Web Scraping, Web Data Extraction, Screen Scraping 등 Microsoft .NET 응용 프로그램을 사용하려고합니다. HTML 구문 분석을 위해 HTML Agility Pack을 통합하려고 시도하고 있지만 생각만큼 쉽지는 않습니다. 나는 지금까지 가지고있는 것에 대한 몇 가지 사양과 이미지를 포함 시켰고 내가 어떻게 진행할 수 있는지에 대한 의견을 얻기를 희망했다. 기본적으로 비주얼 웹 리퍼 (Visual Web Ripper)에서 사용 된 레이아웃과 비슷한 것을하고 싶지만, 어떻게하면 그렇게 할 수 있을지 모르겠다.

이미지 :

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

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

명세서:

제 목표는 웹에서 데이터와 이미지를 다운로드하기위한 매우 사용자 친화적 인 포인트 앤 클릭 방식의 응용 프로그램을 만드는 것입니다. 웹 브라우저를 사용하여 HTML 페이지를로드하고 파싱 된 데이터 및 이미지 링크를 텍스트 상자에 출력하고 싶습니다. 사용자는 원하는 HTML 태그를 지정한 다음 그리드에 데이터를 다운로드 할 수 있습니다. 마지막으로 필요한 형식으로 데이터를 내 보냅니다.

HTML 애자일 팩을 사용하여 웹 페이지에서 HTML을로드하고 텍스트 상자에 표시하려고합니다.

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

    }

대상 : HtmlWindow window = webBrowser.Document.Window;

오류가 발생합니다 : 개체 참조가 개체의 인스턴스로 설정되지 않았습니다.

수락 된 답변

브라우저 창을 참조 할 때 페이지로드가 완료되지 않았을 수 있습니다. 브라우저 컨트롤이 완료되면 navigationcomplete 이벤트를 시작하게 할 수 있습니다. 예를 보려면이 SO 답변을 참조하십시오. C # 계속하기 전에 웹 페이지로드가 완료 될 때까지 기다리는 방법


인기 답변

화면 긁기를 위해, 특정 이미지 / 모양을 검색하는 경우 http://www.emgu.com/wiki/index.php/Main_Page 를 사용할 수 있습니다. 편리 할거야.

또한 WinAPI를 사용하여 화면을 "읽을"수도 있습니다

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



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.