본문 바로가기

C#

C#을 이용해서 웹 크롤링하는 방법

반응형

웹 크롤링은 웹 페이지에서 데이터를 수집하고 분석하는 프로세스입니다.
C#에는 웹 크롤링을 위해 사용할 수 있는 다양한 도구와 라이브러리가 있습니다. 그 중에서도 HttpClient 클래스와 HtmlAgilityPack 라이브러리를 사용하여 웹 크롤링을 할 수 있습니다.
아래는 C#을 사용하여 웹 크롤링을 수행하는 단계별 예시 코드입니다

HttpClient 클래스를 사용하여 웹 페이지에 HTTP 요청을 보냅니다.

using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        // HttpClient 인스턴스 생성
        using (HttpClient client = new HttpClient())
        {
            // 웹 페이지에 GET 요청 보내기
            HttpResponseMessage response = await client.GetAsync("http://example.com");

            // 응답 내용 가져오기
            string responseBody = await response.Content.ReadAsStringAsync();

            // 가져온 데이터 출력
            Console.WriteLine(responseBody);
        }
    }
}

 

HtmlAgilityPack 라이브러리를 사용하여 HTML 문서를 파싱합니다. 이를 통해 웹 페이지에서 원하는 데이터를 추출할 수 있습니다. HtmlAgilityPack은 NuGet 패키지로 설치해야 합니다.

using System;
using HtmlAgilityPack;

class Program
{
    static void Main()
    {
        // HtmlWeb 인스턴스 생성
        HtmlWeb web = new HtmlWeb();
        
        // 웹 페이지 로드
        HtmlDocument document = web.Load("http://example.com");

        // XPath 또는 CSS 선택자를 사용하여 원하는 요소 선택
        HtmlNodeCollection nodes = document.DocumentNode.SelectNodes("//h1");

        // 선택한 요소에서 데이터 추출
        foreach (HtmlNode node in nodes)
        {
            Console.WriteLine(node.InnerText);
        }
    }
}

위의 코드는 웹 페이지에서 HTML을 가져오고, HtmlAgilityPack을 사용하여 특정 요소를 선택하고 데이터를 추출하는 간단한 예시입니다. 

또 다른 방법으로는 C#의 HttpClient와 정규 표현식(Regular Expressions)을 사용하여 웹 크롤링을 수행하는 방법이 있습니다. 아래는 해당 방법의 예시 코드입니다

using System;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        // HttpClient 인스턴스 생성
        using (HttpClient client = new HttpClient())
        {
            // 웹 페이지에 GET 요청 보내기
            HttpResponseMessage response = await client.GetAsync("http://example.com");

            // 응답 내용 가져오기
            string responseBody = await response.Content.ReadAsStringAsync();

            // 정규 표현식을 사용하여 원하는 데이터 추출
            string pattern = "<h1>(.*?)</h1>"; // h1 태그 내의 내용 추출
            MatchCollection matches = Regex.Matches(responseBody, pattern);

            // 추출한 데이터 출력
            foreach (Match match in matches)
            {
                Console.WriteLine(match.Groups[1].Value);
            }
        }
    }
}

위의 예시 코드에서는 HttpClient를 사용하여 웹 페이지에 GET 요청을 보내고, 응답 내용을 문자열로 가져옵니다. 그런 다음, 정규 표현식을 사용하여 원하는 데이터를 추출합니다. 정규 표현식 패턴인 <h1>(.*?)</h1>은 <h1> 태그 사이의 내용을 추출하도록 설정되어 있습니다.

이 방법은 HtmlAgilityPack보다 더 간단한 경우에 사용할 수 있는 방법입니다. 하지만 정규 표현식을 사용하여 HTML을 파싱하는 것은 일반적으로 권장되지 않습니다. 정규 표현식은 HTML의 구조적인 특성을 충분히 반영하지 못할 수 있고, 복잡한 HTML 문서의 경우에는 예측하기 어렵고 오류가 발생할 수 있습니다. 따라서, HTML 파싱을 위해 HtmlAgilityPack 또는 다른 HTML 파싱 라이브러리를 사용하는 것이 더 안정적이고 좋은 방법입니다.

웹 크롤링은 서버의 요청 주기를 적절히 조절하고, 대상 웹 사이트의 이용 약관을 준수하는 등의 윤리적인 측면을 고려해야 합니다. 또한, 대상 웹 사이트의 HTML 구조가 변경되면 코드도 변경해야 할 수 있습니다.

반응형