.NET을 사용하여 제한 없이 동적으로 생성된 HTML 코드를 검색하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-10-18 08:40:03
원래의
926명이 탐색했습니다.

How to Retrieve Dynamically Generated HTML Code Using .NET without Limitations?

.NET의 WebBrowser 또는 mshtml.HTMLDocument를 사용하여 HTML 코드를 동적으로 생성하는 방법은 무엇입니까?

소개

HTML 코드를 동적으로 검색 웹 페이지에서 생성되는 것은 웹 자동화 및 스크래핑 시나리오에서 일반적인 작업입니다. .NET에서는 이를 달성하기 위해 System.Windows.Forms.WebBrowser 클래스와 mshtml.HTMLDocument 인터페이스라는 두 가지 옵션을 제공합니다. 그러나 효과적으로 사용하는 것은 어려울 수 있습니다.

WebBrowser 클래스

System.Windows.Forms.WebBrowser 클래스는 애플리케이션 내에 웹 페이지를 포함하도록 설계되었습니다. 사용자 정의 탐색 및 문서 이벤트를 지원하지만 동적으로 생성된 HTML을 캡처하는 기능은 제한되어 있습니다.

다음 코드 조각은 WebBrowser 사용을 보여줍니다.

<code class="csharp">using System.Windows.Forms;
using mshtml;

namespace WebBrowserTest
{
    public class Program
    {
        public static void Main()
        {
            WebBrowser wb = new WebBrowser();
            wb.Navigate("https://www.google.com/#q=where+am+i");

            wb.DocumentCompleted += delegate(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)wb.Document.DomDocument;
                foreach (IHTMLElement element in doc.all)
                {
                    System.Diagnostics.Debug.WriteLine(element.outerHTML);
                }
            };
            Form f = new Form();
            f.Controls.Add(wb);
            Application.Run(f);
        }
    }
}</code>
로그인 후 복사

mshtml.HTMLDocument 인터페이스

mshtml.HTMLDocument 인터페이스는 기본 HTML 문서 개체에 대한 직접 액세스를 제공합니다. 그러나 수동 탐색 및 렌더링이 필요하므로 동적으로 생성된 콘텐츠에는 덜 편리합니다.

다음 코드 조각에서는 mshtml.HTMLDocument 사용을 보여줍니다.

<code class="csharp">using mshtml;

namespace HTMLDocumentTest
{
    public class Program
    {
        public static void Main()
        {
            mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)new mshtml.HTMLDocument();
            doc.write(new System.Net.WebClient().DownloadString("https://www.google.com/#q=where+am+i"));

            foreach (IHTMLElement e in doc.all)
            {
                System.Diagnostics.Debug.WriteLine(e.outerHTML);
            }
        }
    }
}</code>
로그인 후 복사

보다 강력한 접근 방식

WebBrowser 및 mshtml.HTMLDocument의 한계를 극복하려면 다음 접근 방식을 사용할 수 있습니다.

  1. WebBrowser 컨트롤을 만듭니다.
  2. 대상 URL을 지정하고 DocumentCompleted 이벤트를 처리하여 기본 mshtml.HTMLDocument2 개체를 얻습니다.
  3. 폴링과 WebBrowser.IsBusy 확인을 함께 사용하여 페이지 렌더링이 완료된 시기를 감지합니다.
  4. 루트 가져오기 요소가 안정될 때까지 OuterHtml 속성을 폴링합니다.

예제 코드

다음 C# 코드는 이 접근 방식을 보여줍니다.

<code class="csharp">using System;
using System.ComponentModel;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using mshtml;

namespace DynamicHTMLFetcher
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
            this.webBrowser.DocumentCompleted += WebBrowser_DocumentCompleted;
            this.Load += MainForm_Load;
        }

        private async void MainForm_Load(object sender, EventArgs e)
        {
            try
            {
                var cts = new CancellationTokenSource(10000); // cancel in 10s
                var html = await LoadDynamicPage("https://www.google.com/#q=where+am+i", cts.Token);
                MessageBox.Show(html.Substring(0, 1024) + "..."); // it's too long!
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private async Task<string> LoadDynamicPage(string url, CancellationToken token)
        {
            var tcs = new TaskCompletionSource<bool>();
            WebBrowserDocumentCompletedEventHandler handler = (s, arg) => tcs.TrySetResult(true);

            using (token.Register(() => tcs.TrySetCanceled(), useSynchronizationContext: true))
            {
                this.webBrowser.DocumentCompleted += handler;
                try
                {
                    this.webBrowser.Navigate(url);
                    await tcs.Task; // wait for DocumentCompleted
                }
                finally
                {
                    this.webBrowser.DocumentCompleted -= handler;
                }
            }

            var documentElement = this.webBrowser.Document.GetElementsByTagName("html")[0];
            var html = documentElement.OuterHtml;
            while (true)
            {
                await Task.Delay(500, token);
                if (this.webBrowser.IsBusy)
                    continue;
                var htmlNow = documentElement.OuterHtml;
                if (html == htmlNow)
                    break; // no changes detected, end the poll loop
                html = htmlNow;
            }

            token.ThrowIfCancellationRequested();
            return html;
        }

        private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            // Intentional no-op handler, we receive the DocumentCompleted event in the calling method.
        }
    }
}</code>
로그인 후 복사

이 접근 방식을 사용하면 동적으로 생성된 경우에도 완전히 렌더링된 HTML 코드를 얻을 수 있습니다.

위 내용은 .NET을 사용하여 제한 없이 동적으로 생성된 HTML 코드를 검색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿