웹 스크래핑을 위한 HTTP 헤더

가장 흔한 HTTP 헤더에 대해 알아보고, 웹 스크래핑에 중요한 이유와 최적화 방법을 확인하세요.
1 분 읽기
HTTP Headers for Web Scraping

모든 커뮤니케이션에는 문화적, 환경적, 관계적 맥락이 존재하며, 이러한 맥락은 커뮤니케이션의 효과성에 영향을 미칩니다. 웹 커뮤니케이션에서 HTTP 헤더는 웹 서버와 클라이언트가 HTTP 요청을 전송하거나 HTTP 응답을 수신할 때 교환하는 기술적 맥락입니다. 이 맥락은 인증을 용이하게 하거나, 캐싱 동작을 결정하거나, 세션 상태를 관리하는 데 활용될 수 있습니다. 또한 웹 서버가 HTTP 요청의 출처를 파악하고 이에 어떻게 응답할지 결정하는 데 도움을 줍니다. 이 응답에는 클라이언트 기기의 요구 사항을 충족하도록 웹사이트를 렌더링하거나 데이터를 전달하는 것이 포함될 수 있습니다. 후자의 작업이 봇을 통해 수행될 때, 이 작업을 웹 스크래핑이라고 하며, 웹사이트에서 데이터를 자동으로 획득해야 할 때 유용합니다.

스크레이퍼를 구축할 때 HTTP 헤더 설정을 간과하기 쉽습니다. 기본값으로도 요청이 진행되기 때문입니다. 그러나 HTTP 헤더를 적절히 구성하지 않으면 스크레이퍼와 웹 서버 간 지속적인 통신 유지가 어렵습니다. 웹 서버는 User-Agent, Referer, Accept-Language 등 기본 HTTP 헤더 정보를 기반으로 봇과 자동화 스크립트를 탐지하도록 설정될 수 있기 때문입니다.

하지만 헤더를 올바르게 구성하면 일반 사용자 트래픽을 모방하여 스크래핑 작업의 안정성을 높일 수 있습니다. 본 글에서는 HTTP 헤더의 모든 것, 웹 스크래핑에서의 역할, 효과적인 데이터 수집을 위한 최적화 방법을 알아봅니다.

HTTP 헤더가 필요한 이유

HTTP 헤더는 웹 통신에 필수적인 요청 및 응답의 키-값 쌍입니다. 웹 서버는 요청 헤더를 통해 클라이언트와 관심 대상 리소스에 대한 정보 및 지시를 수신합니다. 한편 응답 헤더는 클라이언트에게 가져온 리소스와 수신한 응답에 대한 추가 정보를 제공합니다. 수많은 HTTP 헤더가 존재하지만, 웹 스크래핑에 가장 중요한 헤더는 다음과 같습니다:

User-Agent

User-Agent는요청을 전송하는 클라이언트를 고유하게 식별하는 문자열입니다. 이 문자열에는 애플리케이션 유형, 운영 체제, 소프트웨어 버전, 소프트웨어 공급업체 등이 포함될 수 있습니다.

기본적으로 이 헤더는 스크레이퍼를 쉽게 봇으로 식별할 수 있는 값으로 설정됩니다. 예를 들어, Python requests 스크립트를 사용하여 전자상거래 웹사이트에서 가격 데이터를 스크레이핑하려는 경우, 스크레이퍼는 HTTP 헤더에 다음과 유사한 User-Agent를 전송합니다:

  u0022python-requests/X.X.Xu0022n

User-Agent를 변경하여 다양한 브라우저와 기기를 모방함으로써 탐지를 피할 수 있습니다. 이를 위해 Python requests의 User-Agent 헤더를 다음과 같이 대체해야 합니다:

      u0022Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36u0022n

이 새로운 헤더에는 브라우저와 해당 브라우저가 실행되는 기본 플랫폼에 대한 정보가 포함됩니다.

Accept-Language

Accept-Language 헤더를 사용하면 요청한 리소스를 어떤 언어로 받을지 지정할 수 있습니다. 필요한 경우 국가 코드나 문자 유형을 포함할 수 있습니다. 예를 들어 Accept-Language를 "en-US"로 설정하면, 다른 대륙에 있더라도 해당 리소스가 미국에서 사용하는 영어로 제공되기를 기대한다는 의미입니다. 또한 알파벳 유형을 사용하여 "sr-Latn"을 지정함으로써 헤더를 세르비아어의 라틴 문자 버전으로 정의할 수도 있습니다. 이렇게 하면 적절한 현지화된 데이터를 검색할 수 있습니다.

여러 언어가 존재할 경우, Accept-Language 헤더는 우선순위 순서를 정의하는 데 도움이 되는 품질 값이 포함된 쉼표로 구분된 언어 목록이 됩니다. 예를 들어 "en -GB;q=1.0, en-US;q=0.9, fr;q=0.8"과 같습니다. 여기서 q 값이 높을수록 우선순위가 높으며 q는 0에서 1 사이의 값을 가집니다.

쿠키

쿠키 헤더는 웹 서버가 여러 요청-응답 사이클에 걸쳐 사용자 세션을 식별할 수 있게 하는 데이터를 포함합니다. 스크래핑 시 클라이언트 측에서 쿠키를 생성하거나(또는 이전에 저장된 쿠키를 사용) 새 요청의 HTTP 헤더에 포함시킬 수 있습니다. 이를 통해 웹 서버는 요청을 유효한 사용자 세션과 연결하여 필요한 데이터를 반환할 수 있습니다. 예를 들어, 전자상거래 웹사이트에서 사용자별 데이터를 얻기 위해 여러 요청을 수행해야 하는 경우, 스크레이퍼의 로그인 상태를 유지하고 관련 데이터를 보관하며 쿠키 기반 봇 탐지 시스템을 피하기 위해 HTTP 요청의 Cookie 헤더에 세션 쿠키를 포함해야 합니다.

쿠키 헤더는 세미콜론과 공백("; ")으로 구분된 하나 이상의 키-값 쌍 목록으로 구성됩니다. 일반적으로 "name0=value0; name1=value1; name2=value2" 형식을 취합니다.

리퍼러

Referer에는 리소스를 요청한 페이지의 절대 또는 부분 URL이 포함됩니다. 예를 들어, 전자상거래 웹사이트의 홈페이지를 스크롤하다가 관심 있는 링크를 클릭할 수 있습니다. 다음 웹 페이지를 여는 HTTP 요청의 Referer 헤더는 요청을 시작한 전자상거래 웹사이트의 홈페이지를 가리킵니다. 현재 페이지에서 다른 웹 페이지로 이동할 때마다, 이전에 본 각 페이지가 다음 페이지의 Referer 역할을 합니다. 이는 인간 상호작용에서의 추천 방식과 유사합니다.

당연히 일부 웹사이트는 이 헤더를 반스크래핑 메커니즘의 일부로 확인합니다. 즉, 다른 웹사이트로부터의 자연스러운 트래픽 흐름을 모방하고 차단되는 것을 피하려면 Referer 헤더를 해당 사이트의 홈페이지나 검색 엔진 URL과 같은 유효한 URL로 설정해야 합니다.

웹 스크래핑을 위한 HTTP 헤더 최적화 방법

스크래핑 시, 필요한 데이터가 해당 소유자에게 가치 있으며 공유를 꺼릴 수 있다는 점을 명심하세요. 결과적으로 많은 소유자는 콘텐츠에 접근하려는 자동화 에이전트를 탐지하기 위한 조치를 취합니다. 탐지에 성공하면 차단하거나 관련 없는 데이터를 반환할 수 있습니다.

HTTP 헤더는 스크래퍼가 해당 웹사이트를 탐색하는 일반 인터넷 사용자로 보이도록 하여 이러한 보안 조치를 우회하는 데 도움이 됩니다. User-Agent, Accept, Accept-Language, Referer 등의 헤더를 올바르게 설정하면 웹 서버가 귀하의 봇을 스크래퍼로 식별하기 어렵게 하면서도 정상적인 웹 트래픽을 효과적으로 모방할 수 있습니다.

사용자 정의 헤더 가져오기 및 설정하기

HTTP 헤더를 최적화하는 방법을 보여드리기 위해, 가상의 전자상거래 웹사이트 Books to Scrape에서 미스터리 장르의 책을 스크래핑하는 Python 요청을 만들어 보겠습니다. 이를 수행하기 전에 브라우저의 개발자 도구에서 HTTP 헤더를 가져와야 합니다.

먼저, 다른 브라우저 탭에서 웹사이트를 방문하세요:

그런 다음 브라우저에서 개발자 도구를 실행하세요. 페이지 아무 곳이나 마우스 오른쪽 버튼으로 클릭하고 ‘검사’를 선택하거나 도구 하위 목록을 확인하는 방법이 있습니다. 그런 다음 개발자 도구 상단 메뉴에서 ‘네트워크’ 탭을 클릭하세요:

네트워크 탭이 열리면 ‘캐시 비활성화’ 옆의 체크박스를 선택하세요. 이렇게 하면 전체 요청 헤더를 볼 수 있습니다. 그런 다음 웹사이트의 카테고리 목록에서 ‘미스터리’ 카테고리 링크를 클릭하세요. 해당 카테고리의 책이 있는 페이지가 열리지만, 더 중요한 것은 개발자 도구 창 네트워크 탭에 요청 목록이 표시된다는 점입니다:

목록 맨 위로 스크롤하여 첫 번째 항목을 클릭하세요. 개발자 도구 내 작은 창이 열립니다. ‘요청 헤더(Request Headers)’로 스크롤하세요:

요청 헤더 아래에서 HTTP 요청 헤더, 특히 방금 배운 헤더들을 확인할 수 있습니다. 스크레이퍼에서 이 헤더들을 사용하려면 User-Agent, Accept, Accept-Language, Cookie, Referer 헤더용 변수를 포함한 Python 스크립트를 작성하세요:

  import requestsnnreferer = u0022https://books.toscrape.com/u0022naccept = u0022text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8u0022naccept_language = u0022en-GB,en;q=0.6u0022ncookie = u0022zero-chakra-ui-color-mode=light-zero; AMP_MKTG_8f1ede8e9c=JTdCJTIycmVmZXJyZXIlMjIlM0ElMjJodHRwcyUzQSUyRiUyRnd3dy5nb29nbGUuY29tJTJGJTIyJTJDJTIycmVmZXJyaW5nX2RvbWFpbiUyMiUzQSUyMnd3dy5nb29nbGUuY29tJTIyJTdE; AMP_8f1ede8e9c=JTdCJTIyZGV2aWNlSWQlMjIlM0ElMjI1MjgxOGYyNC05ZGQ3LTQ5OTAtYjcxMC01NTY0NzliMzAwZmYlMjIlMkMlMjJzZXNzaW9uSWQlMjIlM0ExNzA4MzgxNTQ4ODQzJTJDJTIyb3B0T3V0JTIyJTNBZmFsc2UlMkMlMjJsYXN0RXZlbnRUaW1lJTIyJTNBMTcwODM4MjE1NTQ2MCUyQyUyMmxhc3RFdmVudElkJTIyJTNBNiU3RA==u0022nuser_agent = u0022Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36u0022nncustom_headers = {n    u0022User-Agentu0022: user_agent,n    u0022Acceptu0022: accept,n    u0022Accept-Languageu0022: accept_language,n    u0022Cookieu0022: cookie,n    u0022Refereru0022: referern}n

이 코드 조각에서는 requests 라이브러리를 임포트하고 각 HTTP 헤더에 대한 변수를 문자열로 정의합니다. 그런 다음 HTTP 헤더 이름을 정의된 변수에 매핑하기 위해 headers라는 사전(dictionary)을 생성합니다.

다음으로, 사용자 정의 헤더 없이 HTTP 요청을 전송하고 결과를 출력하는 코드를 스크립트에 추가합니다:

  URL = 'https://books.toscrape.com/catalogue/category/books/mystery_3/index.html'nnr = requests.get(URL)nprint(r.request.headers)n

여기서 미스터리 도서 URL을 변수에 할당합니다. 그런 다음 이 URL을 유일한 매개변수로 requests.get 메서드를 호출하고 요청 헤더를 출력합니다.

출력 결과는 다음과 같아야 합니다:

  {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}n

보시다시피 기본 HTTP 헤더는 스크레이퍼를 봇으로 식별할 가능성이 높습니다. 함수에 추가 매개변수를 전달하여 requests.get 라인을 업데이트하세요:

  r = requests.get(URL, headers=custom_headers)n

여기서 생성한 custom_header 사전과 URL 매개변수를 requests.get 메서드에 전달합니다.

출력 결과는 다음과 같아야 합니다:

  {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8', 'Connection': 'keep-alive', 'Accept-Language': 'en-GB,en;q=0.6', 'Cookie': 'zero-chakra-ui-color-mode=light-zero; AMP_MKTG_8f1ede8e9c=JTdCJTIycmVmZXJyZXIlMjIlM0ElMjJodHRwcyUzQSUyRiUyRnd3dy5nb29nbGUuY29tJTJGJTIyJTJDJTIycmVmZXJyaW5nX2RvbWFpbiUyMiUzQSUyMnd3dy5nb29nbGUuY29tJTIyJTdE; AMP_8f1ede8e9c=JTdCJTIyZGV2aWNlSWQlMjIlM0ElMjI1MjgxOGYyNC05ZGQ3LTQ5OTAtYjcxMC01NTY0NzliMzAwZmYlMjIlMkMlMjJzZXNzaW9uSWQlMjIlM0ExNzA4MzgxNTQ4ODQzJTJDJTIyb3B0T3V0JTIyJTNBZmFsc2UlMkMlMjJsYXN0RXZlbnRUaW1lJTIyJTNBMTcwODM4MjE1NTQ2MCUyQyUyMmxhc3RFdmVudElkJTIyJTNBNiU3RA==', 'Referer': 'https://books.toscrape.com/'}n

여기서 헤더가 브라우저에서 가져온 정보로 업데이트된 것을 확인할 수 있습니다. 이렇게 하면 웹 서버가 자동 방문을 감지하기 어려워져 차단될 가능성이 낮아집니다.

헤더 최적화의 이점

HTTP 헤더를 적절히 최적화하는 것은 스크래핑 작업의 지속적인 성공을 보장하는 데 매우 중요합니다.

최적화의 한 가지 장점은 차단률이 감소한다는 점입니다. 헤더를 최적화하면 스크레이퍼의 웹사이트 상호작용이 일반 사용자와 유사해집니다. 결과적으로 일부 봇 탐지 시스템을 피할 수 있어 시간이 지남에 따라 스크레이퍼가 차단될 가능성(차단률)이 낮아집니다.

HTTP 헤더 최적화의 또 다른 이점은 차단률 감소로 데이터 스크래핑이 용이해져 성공률이 높아진다는 점입니다.

또한 HTTP 헤더 최적화에 집중하면 스크래핑 작업의 효율성이 향상됩니다. 이는 필요에 부합하는 관련 데이터를 확보할 수 있도록 보장합니다.

헤더 최적화 팁

헤더를 적절히 구성하는 것은 웹 스크래핑 프로젝트의 성공을 보장하는 데 중요하지만, 특히 대규모 데이터 스크래핑이 필요한 경우 이로 끝나는 것은 아닙니다. 스크래퍼의 성공률을 높이기 위한 몇 가지 팁은 다음과 같습니다:

헤더 순환

사용자의 정상적인 트래픽을 모방하기 위해 User-Agent와 같은 헤더를 정의하는 것을 넘어, 여러 개의 고유한 HTTP 헤더를 정의하고 요청마다 이를 순환할 수 있습니다. 이를 통해 웹 서버에 접근하는 여러 사용자를 시뮬레이션하고 생성된 트래픽을 분산시킬 수 있습니다. 이는 봇으로 식별되어 차단될 가능성을 더욱 줄여줍니다.

스크래핑 작업 규모에 따라 10개에서 수백 개의 User-Agent를사용할 수 있습니다. 짧은 시간 내에 전송해야 하는 요청이 많을수록 더 많은 User-Agent를전환하는 것이 합리적입니다.

헤더 업데이트 유지

HTTP 헤더 최적화와 관련해 고려해야 할 또 다른 사항은 헤더의 정기적인 유지 관리입니다. 사용자는 일반적으로 새 버전이 출시되면 브라우저를 업데이트하므로, 특정 시점에 유효한 헤더는 최신 브라우저 버전의 헤더와 일치할 가능성이 높습니다. 오래된 브라우저나 소프트웨어 버전을 참조하는 하나 이상의 사용자 에이전트로헤더를 설정하면, 웹 서버는 일반 사용자들과 구분하여 요청을 차단할 수 있습니다. 자주 업데이트가 필요한 다른 헤더에도 동일한 원칙이 적용됩니다.

잘못된 헤더 설정 피하기

잘못된 헤더 구성도 피해야 합니다. User-Agent와 같은 헤더가 설정한 다른 표준 헤더들과 일치하지 않을 때 발생할 수 있습니다. 예를 들어, User-Agent를 Windows에서 실행되는 Mozilla Firefox 브라우저로 설정해 놓고 나머지 헤더들은 Windows에서 실행되는 Chromium 브라우저용으로 정의하면 스크레이퍼가 차단될 가능성이 높습니다.

또한 클라이언트와 서버 사이의 중개자 역할을 하는 프록시 서버를 사용할 때, 브라우저 측의 탐지 시스템이 요청을 자동화된 것으로 식별할 수 있는 헤더를 의도치 않게 추가할 수 있습니다. 헤더를 확인하려면 테스트 요청을 보내고 프록시 서버가 식별 가능한 헤더를 추가하지 않는지 확인하세요.

결론

이 글에서는 웹 스크래핑에 가장 중요한 헤더 중 일부인 User-Agent, Referer, Accept-Language, Cookie 헤더를 포함한 HTTP 헤더에 대해 알아보았습니다. 스크래핑 작업의 지속성과 유용성을 보장하려면 HTTP 헤더를 최적화해야 합니다.

웹 스크래핑 프로젝트에서 HTTP 헤더를 적절히 활용해 요청을 수행하면 차단률을 낮추고 성공률을 높일 수 있습니다. 이는 반스크래핑 메커니즘을 더 쉽게 우회할 수 있게 하며 스크래핑 작업의 효율성도 향상시킵니다. 다만 자바스크립트 챌린지나 CAPTCHA를 포함한 고급 반스크래핑 메커니즘은 여전히 장애물이 될 수 있습니다. Bright Data는 수상 경력에 빛나는 사용자 친화적인프록시 네트워크, 고급 스크래핑 브라우저, 포괄적인 웹 스크래핑 API, 웹 언락커를 제공하여 스크래핑 작업을 간소화합니다. 초보자든 전문가든, 이러한 제품들을 통해 스크래핑 목표를 달성할 수 있습니다. 지금 바로 무료 체험을 시작하고 Bright Data의 서비스를 살펴보세요.