이 튜토리얼에서는 다음을 배울 수 있습니다:
- 사용자 에이전트 헤더 설정이 필요한 이유
- 기본 Python
요청사용자 에이전트 - Requests에서 사용자 에이전트 변경 및 해제 방법
- Python에서 사용자 에이전트 로테이션 구현 방법
자, 시작해 보겠습니다!
사용자 에이전트 헤더를 항상 설정해야 하는 이유
User-Agent HTTP 헤더는 브라우저, 웹 요청을 수행하는 애플리케이션 및 HTTP 클라이언트가 요청을 보내는 클라이언트 소프트웨어를 식별하기 위해 설정합니다. 이 값은 일반적으로 요청이 발생한 브라우저 또는 애플리케이션 유형, 운영 체제 및 아키텍처에 대한 세부 정보를 포함합니다.
예를 들어, 현재 시점에서 웹 페이지를 방문할 때 Chrome이 설정하는 사용자 에이전트는 다음과 같습니다:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36
이 사용자 에이전트의 구성 요소는 다음과 같습니다:
Mozilla/5.0:역사적으로 Mozilla 브라우저와의 호환성을 나타내는 데 사용되었습니다. 현재는 호환성 이유로 사용자 에이전트에 추가되는 일반적인 접두사입니다.Windows NT 10.0; Win64; x64: 운영 체제(Windows NT 10.0), 플랫폼(Win64), 아키텍처(x64).AppleWebKit/537.36: 요청을 수행하는 Chrome 버전이 사용하는 브라우저 엔진입니다.KHTML, like Gecko: Mozilla에서 사용하는 KHTML 엔진 및 Gecko 레이아웃 엔진과의 호환성을 나타냅니다.
Chrome/125.0.0.0: 브라우저 이름 및 버전.Safari/537.36: Safari와의 호환성.
요약하면, 사용자 에이전트는 요청이 잘 알려진 브라우저에서 발생했는지, 아니면 다른 유형의 소프트웨어에서 발생했는지 식별하는 데 매우 중요합니다.
스크래핑 봇은 기본값이나 일관성 없는 사용자 에이전트 문자열을 사용하는 경향이 있어 자동화된 특성을 드러냅니다. 따라서, 안티 스크래핑 솔루션은 User-Agent 헤더를 확인하여 현재 사용자가 합법적인 사용자인지 봇인지 판단함으로써 웹 페이지의 데이터를 보호합니다.
자세한 내용은 웹 스크래핑을 위한 사용자 에이전트 가이드를 참조하십시오.
Python Requests의 기본 사용자 에이전트는 무엇입니까?
대부분의 HTTP 클라이언트와 마찬가지로 Requests는 HTTP 요청 시 User-Agent 헤더를 설정합니다. 특히 Requests가 설정하는 기본 사용자 에이전트는 아래 형식을 따릅니다:
python-requests/X.Y.Z
여기서 X.Y.Z는 프로젝트에 설치된 requests 패키지의 버전입니다.
httpbin.io의 /user-agent 엔드포인트에 GET 요청을 보내 위 문자열이 실제로 Requests 사용자 에이전트인지 확인하세요. 이 API는 수신 요청에서 읽은 User-Agent 헤더를 반환합니다. 즉, HTTP 클라이언트가 자동으로 설정한 사용자 에이전트를 확인할 수 있게 해줍니다.
requests를 임포트하고 get() 메서드를 사용하여 원하는 HTTP 요청을 수행하세요:
import requests
# 지정된 URL로 HTTP GET 요청 수행
response = requests.get('https://httpbin.io/user-agent')
# API 응답을 JSON으로 파싱하여 출력
print(response.json())
위의 Python 코드 조각을 실행하면 다음과 같은 결과가 출력됩니다:
{'user-agent': 'python-requests/2.32.3'}
사용자 에이전트는 python-requests/2.32.3으로, 이 요청이 requests 라이브러리에서 비롯되었음을 명확히 식별합니다. 결과적으로, 봇 방지 시스템은 이러한 요청을 인간 사용자가 보낸 것이 아니라고 판단하여 즉시 차단할 수 있습니다. Python Requests 사용자 에이전트 값을 변경하는 것이 왜 그렇게 중요한지 이제 알 수 있습니다!
자세한 내용은 Python Requests 라이브러리에 대한 완전한 가이드를 확인하세요.
Python Requests 사용자 에이전트 변경 방법
Requests에서 User-Agent 헤더 값을 변경하고 해제하는 방법을 알아봅시다!
사용자 정의 사용자 에이전트 설정
Requests는 사용자 에이전트 값을 직접 설정하는 옵션을 제공하지 않습니다. 동시에 User-Agent는 단순한 HTTP 헤더에 불과합니다. 따라서 아래와 같이 headers 옵션을 사용하여 다른 HTTP 헤더와 마찬가지로 값을 사용자 정의할 수 있습니다:
import requests
# 사용자 정의 사용자 에이전트 헤더
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
}
# 지정된 URL로 HTTP GET 요청 수행
# 사용자 정의 헤더 설정
response = requests.get('https://httpbin.io/user-agent', headers=headers)
# API 응답을 JSON으로 파싱하여 출력
print(response.json())
위의 Python 코드 조각을 다시 실행하면 이번에는 다음과 같이 출력됩니다:
{'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'}
훌륭합니다! 이제 사용자 정의 Python requests 사용자 에이전트를 설정하려면 다음을 수행해야 함을 배웠습니다:
사용자 에이전트속성을 가진 Python 사전(dictionary )을 정의합니다.- 사용 중인 HTTP
요청 메서드의headers매개변수에 이 사전 전달하기.
HTTP 헤더 이름은 대소문자를 구분하지 않으므로 헤더 사전의 속성 이름은 원하는 형식으로 지정할 수 있습니다.
참고: 이 방법은 request(), post(), patch(), put(), delete(), head() 메서드에서도 동일하게 적용됩니다.
전역 요청 사용자 에이전트를 설정하려면 다음과 같이 사용자 정의 HTTP 세션을 구성해야 합니다:
import requests
# HTTP 세션 초기화
session = requests.Session()
# 세션에 커스텀 헤더 설정
session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
# HTTP 세션 내에서 GET 요청 수행
response = session.get('https://httpbin.io/user-agent')
# API에서 반환된 데이터 출력
print(response.json())
# 세션 내에서 사용자 에이전트를 커스텀한 다른 요청들 ...
이 코드는 이전과 동일한 출력을 생성합니다. Requests의 HTTP 세션에 익숙하지 않다면 문서를 참고하세요.
사용자 에이전트 해제
사용자 에이전트 설정 없이 HTTP 요청을 보내는 것은 안티봇 솔루션에 쉽게 걸릴 수 있는 나쁜 관행입니다. 하지만 사용자 에이전트 헤더를 제거해야 하는 상황도 있습니다.
Requests에서 사용자 에이전트를 해제하는 첫 번째 방법은 User-Agent 헤더를 None으로 설정하는 것입니다:
import requests
# 사용자 정의 사용자 에이전트 헤더
headers = {
'user-agent': None
}
# 지정된 URL로 HTTP GET 요청 수행
# 사용자 정의 헤더 설정
response = requests.get('https://httpbin.io/user-agent', headers=headers)
# API 응답을 JSON으로 파싱하여 출력
print(response.json())
이 방법은 작동하지 않습니다. requests는 내부적으로 urllib3를 사용하기 때문입니다. 따라서 기본적으로 urllib3의 사용자 에이전트 값이 사용됩니다:
python-urllib3/2.2.1
자세히 설명하면, /user-agent 엔드포인트는 다음과 같은 값을 반환합니다:
{'user-agent': 'python-urllib3/2.2.1'}
대신 urllib3.util.SKIP_HEADER를 사용하여 urllib3의 기본 사용자 에이전트 값을 건너뛰도록 구성해야 합니다. httpbin.io의/headers 엔드포인트를 대상으로 하여 사용자 에이전트가 설정되지 않았는지 확인하세요. 이 엔드포인트는 들어오는 요청의 HTTP 헤더를 반환합니다:
import requests
import urllib3
# 기본 사용자 에이전트 값 제외
headers = {
'user-agent': urllib3.util.SKIP_HEADER
}
# HTTP 요청 준비
req = requests.Request('GET', 'https://httpbin.io/headers')
prepared_request = req.prepare()
# 사용자 에이전트 없이 커스텀 헤더 설정
prepared_request.headers = headers
# 요청 세션 생성 및 요청 실행
session = requests.Session()
response = session.send(prepared_request)
# 반환된 데이터 출력
print(response.json())
위의 Python 코드를 실행하면 다음과 같은 결과가 반환됩니다:
{'headers': {'Accept-Encoding': ['identity'], 'Host': ['httpbin.io']}}
대단하네요! 예상대로 Python 요청 사용자 에이전트가 없습니다.
Requests에서 사용자 에이전트 로테이션 구현
기본 User-Agent 헤더를 실제 브라우저의 적절한 값으로 변경하는 것만으로는 충분하지 않을 수 있습니다. 동일한 IP 주소에서 동일한 사용자 에이전트로 너무 많은 요청을 보내면, 자동화된 요청이 일반적으로 규칙적인 패턴을 따르는 것을 알고 있는 봇 방지 기술의 의심을 유발할 수 있습니다.
봇 탐지를 피하는 핵심은 요청을 무작위화하는 것입니다. 각 요청을 서로 다르게 만드는 좋은 방법은 사용자 에이전트 로테이션입니다. 이 기술의 핵심은 HTTP 클라이언트가 사용하는 사용자 에이전트 헤더를 계속 변경하는 것입니다. 이렇게 하면 자동화된 요청이 서로 다른 브라우저에서 오는 것처럼 보이게 하여 차단 또는 일시적 금지 조치를 유발할 위험을 줄일 수 있습니다.
이제 Requests에서 사용자 에이전트 로테이션을 구현하는 단계를 따라하세요!
단계 #1: 유효한 사용자 에이전트 목록 수집
User Agent String.com 과 같은 사이트에서 적절한 사용자 에이전트 목록을 수집하고 Python 배열에 저장하세요:
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:126.0) Gecko/20100101 Firefox/126.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"
# 기타 사용자 에이전트...
]
단계 #2: 무작위 사용자 에이전트 추출
random.choice()를 사용하여 배열에서 사용자 에이전트 문자열을 무작위로 추출합니다:
random_user_agent = random.choice(user_agents)
위 코드 실행을 위해 다음 임포트가 필요함을 잊지 마세요:
import random
단계 #3: 무작위 사용자 에이전트 설정 및 HTTP 요청 실행
랜덤 사용자 에이전트로 헤더 사전 정의 후 requests 요청에 사용:
headers = {
'user-agent': random_user_agent
}
response = requests.get('https://httpbin.io/user-agent', headers=headers)
print(response.json())
이 지침에는 다음 임포트가 필요합니다:
import requests
단계 #4: 모든 것을 결합하기
Python Requests 사용자 에이전트 로테이션 로직은 다음과 같습니다:
import random
import requests
# 사용자 에이전트 목록
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:126.0) Gecko/20100101 Firefox/126.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"
# 기타 사용자 에이전트...
]
# 목록에서 무작위 사용자 에이전트 선택
random_user_agent = random.choice(user_agents)
# 무작위 사용자 에이전트 설정
headers = {
'user-agent': random_user_agent
}
# 지정된 URL로 GET 요청 수행
# 응답 데이터 출력
response = requests.get('https://httpbin.io/user-agent', headers=headers)
print(response.json())
이 스크립트를 여러 번 실행하면 서로 다른 사용자 에이전트 문자열을 얻을 수 있습니다.
자, 이제 Requests Python 사용자 에이전트 값 설정의 달인이 되셨습니다.
결론
이 가이드에서는 User-Agent 헤더 설정의 중요성과 requests에서 이를 수행하는 방법을 배웠습니다. 이를 통해 기본적인 안티봇 시스템을 속여 요청이 합법적인 브라우저에서 온 것처럼 보이게 할 수 있습니다. 그러나 고급 솔루션은 여전히 사용자를 탐지하고 차단할 수 있습니다. IP 차단 방지를 위해 requests와 함께 프록시를 사용할 수 있지만, 그것조차 충분하지 않을 수 있습니다!
웹 스크레이퍼 API로 이러한 복잡함을 피하세요. 이 차세대 스크래핑 API는 requests 또는 기타 HTTP 클라이언트를 사용한 자동화된 웹 요청 수행에 필요한 모든 것을 제공합니다. IP 및 사용자 에이전트 로테이션 같은 기능을 활용해 자동으로 봇 방지 기술을 우회합니다. 성공적인 자동화된 요청이 이토록 쉬웠던 적은 없습니다!
스크래핑 솔루션에 대해 데이터 전문가와 상담하거나 지금 바로 등록하여 모든 제품을 살펴보세요. 무료 체험판 제공!