using var handler = new HttpClientHandler
{
    UseProxy = true,
    Proxy = new WebProxy("http://proxy.example:8080")
};
using var client = new HttpClient(handler);

string html = await client.GetStringAsync(
    "https://www.example.com/catalog");
var document = new HtmlAgilityPack.HtmlDocument();
document.LoadHtml(html);

이 현대적인 .NET 코드 조각은 System.Net과 System.Net.Http를 사용합니다. 구성된 클라이언트가 네트워크 라우팅을 담당하고 Html Agility Pack이 반환된 HTML 문자열을 받습니다. 페이지마다 풀을 다시 만들지 말고 지속적인 작업을 위해 적절히 구성된 클라이언트를 유지하세요.

이 공개 페이지 예시에서는 HTTP 프록시 목록의 인증되지 않은 후보가 중개자를 대체할 수 있습니다. 대상은 별도로 교체하세요. 웹사이트 URL은 TLS 신원을 유지합니다. 인증된 프록시 자격 증명은 WebProxy에 속합니다. 웹사이트 자격 증명이나 비활성화된 확인은 이를 대신하지 못합니다.

GetStringAsync은 성공하지 않은 HTTP 상태를 오류로 처리합니다. 실패한 다운로드를 빈 HtmlDocument로 변환하지 마세요. 애플리케이션에 헤더, 상태 세부 정보 또는 오류 본문이 필요하면 응답 지향 HTTP 작업을 사용하고 구문 분석 전에 검사하세요.

문자열 메서드는 원시 바이트에 대한 무조건적인 추가 UTF-8 변환을 피합니다. 바이트를 의도적으로 가져온다면 응답과 문서의 인코딩 요구 사항을 디코딩으로 넘기세요.

LoadHtml은 구문 분석된 문서를 생성합니다. 스크립트를 실행하지 않고 스타일을 로드하지 않으며 링크를 따라가지 않습니다. 이후의 상대 링크는 응답 위치를 기준으로 확인하고, 브라우저가 렌더링한 요소가 다운로드한 소스에 없을 수 있음을 기억하세요. 요청이 같은 구성된 HTTP 클라이언트를 공유하더라도 각 응답은 자체 문서를 생성해야 합니다.

관련 글