크롤링 관련해서 응답데이터가 깨지는 문제

안녕하세요 크롤링 관련해서 응답데이터가 자꾸 깨져서 오는 문제가 있어 질문을 올려봅니다.
본래 파이썬으로 하다가 갑자기 c#으로 하게될 일이 생겨서 지금 c#으로 크롤링해보고 있는데요…

문제는 페이지요청 시 오는 html데이터가 전부 깨져서 온다는 겁니다…
응답을 받는 부분은 아래 처럼 되어있습니다.

var html = (string)null;
var doc = new HtmlAgilityPack.HtmlDocument();
using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
{
    HttpStatusCode status = resp.StatusCode;
    string characterSet = resp.CharacterSet;
    Stream respStream = resp.GetResponseStream();
    using (StreamReader sr = new StreamReader(respStream, Encoding.GetEncoding("euc-kr")))
    {
         html = sr.ReadToEnd();
         doc.LoadHtml(html);
    }
}

charset이 잘못되었나 싶어서 없이도 해보고 euc-kr도 해보고 UTF-8도 해봤는데 모두 깨져서 오네요…
참고로 저기 characterSet 값은 UTF-8로 나옵니다.

피들러로 헤더랑 쿠키 체크해서 최대한 채워넣어줬는데 파이썬에선 잘보이는데 c#에서만 깨지네요
혹시 어디를 좀 체크해봐야할 지 조언 좀 부탁드립니다…

가져오려는 페이지의 URL과 사용하시는 닷넷 버전이 어떻게 되나요?

페이지가 정말 UTF-8 인코딩인지 확인이 필요하고 닷넷 버전(.NET Core, .NET Framework 여부)에 따라서 GetEncoding("euc-kr")이 동작하지 않는 경우도 있습니다.

1개의 좋아요

페이지 url은 예로 이런 쿠팡 제품리스트 페이지를 보고있었구
https://www.coupang.com/np/search?component=&q=아이폰케이스&channel=user&listSize=72

닷넷버전은 4.6입니다…

Accept-Encoding"gzip, deflate, br"로 했을 때 응답이 정상 수신 되는 걸 보니 GZIP 압축 때문인 듯 합니다.

request.AutomaticDecompression = DecompressionMethods.GZip |
     DecompressionMethods.Deflate | DecompressionMethods.Brotli;

위 코드를 포함해 요청을 생성하거나 응답 스트림을 GZipStream을 사용해서 압축 해제 후 UTF-8 텍스트로 변환해 보세요. (참고: TAEYO.NET - HTTP 압축 (2) : HTTP 압축 작동 원리)

3개의 좋아요

답변 감사드립니다.

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*;q=0.8,application/signed-exchange;v=b3;q=0.7";
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Whale/3.21.192.18 Safari/537.36";
request.Host = "www.coupang.com";
request.Referer = "https://www.coupang.com/";
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate, br");
request.Headers.Add(HttpRequestHeader.AcceptLanguage, "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7");

헤더를 이렇게 세팅해서 요청했음에도 위 코드를 포함해 요청을 해봐야할까요??

위 부분 때문에 서버는 응답 데이터를 압축해서 전송합니다.

따라서 답변대로 AutoDecompression 플래그를 설정해서 요청을 수행하거나 StreamReader로 응답을 읽기전에 수동으로 압축을 해제해아 합니다.

4개의 좋아요

저게 문제일줄은 전혀 몰랐네요… 감사합니다 덕분에 하나 더 배웠습니다!

결국 압축하는 헤더를 빼거나 아니면 플래그를 추가하거나 둘중 취사선택하면 되는거였네요

정말감사합니다… 이거때문에 반나절을 머리를 싸맸는데 하하…

1개의 좋아요