이 글에서 배울 내용:
- 사용자 에이전트란 무엇인가요?
- 사용자 에이전트를 사용해야 하는 이유는 무엇인가요?
- 스크래핑 시 사용자 에이전트 차단 방지 팁
사용자 에이전트란 무엇인가요?
이 용어는 최종 사용자가 웹 콘텐츠와 상호작용하는 것을 돕는 모든 소프트웨어를 의미합니다. 사용자 에이전트(UA) 문자열은 클라이언트 컴퓨터 소프트웨어가 요청을 통해 전송하는 텍스트입니다.
사용자 에이전트 문자열은 대상 서버가 사용 중인 브라우저, 기기 유형, 운영 체제를 식별하는 데 도움을 줍니다. 예를 들어, 이 문자열은 사용자가 Chrome 브라우저와 Windows 10을 사용 중임을 서버에 알립니다. 서버는 이 정보를 활용하여 기기 유형, OS, 브라우저에 맞게 응답을 조정할 수 있습니다.
대부분의 브라우저는 사용자 에이전트 헤더를 다음과 같은 형식으로 전송하지만, 사용자 에이전트 선택 방식에는 일관성이 거의 없습니다:
User-Agent: Mozilla/5.0 (system-information>)
<플랫폼> (<플랫폼 세부정보>) <확장 프로그램>
각 브라우저는 플랫폼이나 RV(릴리스 버전) 같은 자체 주석 구성 요소를 추가합니다. Mozilla는 크롤러용 문자열 예시를 제공합니다:
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Mozilla 브라우저에 사용할 수 있는 다양한 문자열에 대한 자세한 내용은 해당 개발자 사이트에서 확인할 수 있습니다.
아래는 Chrome 개발자 사이트에서 제공하는 다양한 기기와 브라우저별 UA 문자열 형식 예시입니다:
Chrome for Android
휴대폰 UA:
Mozilla/5.0 (Linux; <Android 버전>; <빌드 태그 등>)AppleWebKit/<WebKit 버전>
(KHTML, like Gecko) Chrome/<Chrome 버전>Mobile Safari/<WebKit 버전>
태블릿 UA:
Mozilla/5.0 (Linux; <Android 버전>; <빌드 태그 등>)AppleWebKit/<WebKit Rev>
(KHTML, like Gecko) Chrome/<Chrome Rev>Safari/<WebKit Rev>
사용자 에이전트를 사용해야 하는 이유는 무엇인가요?
웹 스크래핑을 할 때, 웹 서버가 특정 사용자 에이전트를 차단하는 경우가 있습니다. 이는 주로 해당 에이전트를 봇으로 식별하기 때문이며, 일부 웹사이트는 봇 크롤러나 스크래퍼를 허용하지 않습니다. 더 정교한 웹사이트들은 반대로, 즉 유효하다고 판단되는 사용자 에이전트만 크롤링 작업을 수행하도록 허용합니다. 정말 정교한 사이트들은 브라우저의 실제 동작이 주장하는 사용자 에이전트와 일치하는지 확인합니다.
요청에 사용자 에이전트를 포함하지 않는 것이 올바른 해결책이라고 생각할 수 있습니다. 그러나 이 경우 도구는 기본 UA를 사용하게 됩니다. 대부분의 경우 대상 웹 서버는 이를 블랙리스트에 등록하여 차단합니다.
그렇다면 사용자 에이전트가 차단되지 않도록 하려면 어떻게 해야 할까요?
스크래핑 시 사용자 에이전트 차단 방지 팁:
#1: 실제 사용자 에이전트 사용
사용자 에이전트가 주요 브라우저에 속하지 않으면 일부 웹사이트에서 요청을 차단합니다. 많은 봇 기반 웹 스크레이퍼는 UA 정의 단계를 생략하여 잘못된/기본 UA가 없다는 이유로 탐지 및 차단되는 결과를 초래합니다.
웹 크롤러에 널리 사용되는 UA를 설정하면 이 문제를 피할 수 있습니다. 인기 있는 사용자 에이전트 목록은 여기에서 확인할 수 있습니다. 인기 있는 문자열 목록을 작성하고 웹사이트에 cURL 요청을 수행하며 순환할 수 있습니다. 그러나 브라우저의 사용자 에이전트를 변경하지 않는 한, 브라우저의 동작이 UA에 기대되는 행동과 더 일치할 가능성이 높으므로 브라우저의 사용자 에이전트를 사용하는 것을 권장합니다.
#2: 사용자 에이전트 순환
웹 스크래핑 시 다수의 요청을 수행할 때는 이를 무작위화해야 합니다. 이렇게 하면 웹 서버가 사용자 에이전트를 식별하여 차단할 가능성을 최소화할 수 있습니다.
요청을 무작위화하는 방법은?
한 가지 해결책은 로테이팅 프록시를 사용하여 요청 IP 주소를 변경하는 것입니다. 이렇게 하면 매번 다른 헤더 세트를 전송하게 됩니다. 웹 서버 측에서는 요청이 서로 다른 컴퓨터와 브라우저에서 오는 것처럼 보일 것입니다.
프로 팁: 사용자 에이전트는 헤더의 일종이지만, 헤더는 사용자 에이전트 외에도 훨씬 더 많은 정보를 포함합니다. 무작위로 헤더를 전송해서는 안 되며, 전송하는 사용자 에이전트가 전송하는 헤더와 일치하도록 해야 합니다.
사용자 에이전트 확인 및 로테이션 방법
먼저 사용자 에이전트 문자열 목록을 수집해야 합니다. 실제 브라우저에서 추출한 문자열을 사용하는 것을 권장하며, 여기에서 확인할 수 있습니다. 다음 단계는 해당 문자열들을 Python 리스트에 추가하는 것입니다. 마지막으로 모든 요청이 리스트에서 무작위 문자열을 선택하도록 정의합니다.
Python 3과 Selenium 4를 사용한 사용자 에이전트 순환 예시는 이 스택 오버플로우 토론에서 확인할 수 있습니다. 코드 예시는 다음과 같습니다:
# Selenium과 fake_useragent는 pip 등으로 설치해야 합니다
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from fake_useragent import UserAgentimport sleep
options = Options() options.add_argument(f'user-agent={UserAgent().random}')
driver = webdriver.Chrome(chrome_options=options) driver.get("http://www.whatsmyua.info/")
sleep(5)
driver.execute_cdp_cmd("Network.enable", {}) driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": {"User-Agent": f"{UserAgent().random}"}}) driver.get ("http://www.whatsmyua.info/")
사용자 에이전트 헤더를 회전시키기 위해 선택한 프로그램이나 방법이 무엇이든, 탐지 및 차단되지 않도록 동일한 기술을 따라야 합니다:
- #1: 각 UA와 연관된 전체 헤더 세트를 순환시키세요
- #2: 실제 브라우저가 일반적으로 보내는 순서대로 헤더 전송
- #3: 이전에 방문한 페이지를 ‘리퍼러 헤더’로 사용하세요
프로 팁: 리퍼러 헤더 사용 시 IP 주소와 쿠키가 변경되지 않도록해야 합니다 . 이상적으로는 실제로 이전 페이지를 방문하여 대상 서버에 해당 기록이 남도록 하는 것이 좋습니다.
프록시를 이용한 사용자 에이전트 순환
회전 프록시 네트워크를 사용하면 수동으로 목록을 정의하고 IP를 회전시키는 번거로움을 피할 수 있습니다. 프록시는 자동 IP 회전 및 UA 문자열 회전을 설정할 수 있는 기능을 갖추고 있습니다. 이는 요청이 다양한 웹 브라우저에서 발생한 것처럼 보이게 합니다. 요청이 실제 웹 사용자로부터 발생한 것처럼 보이므로 차단이 크게 감소하고 성공률이 증가합니다. 데이터 언락킹 기술을 적용한 특정 프록시만이 사용자 에이전트를 적절히 관리하고 회전시킬 수 있다는 점을 유의하십시오.
스크래핑용 사용자 에이전트 목록
wget, cURL과 같은 도구를 사용하면서 다양한 브라우저를 모방하기 위해 활용할 수 있는 브라우저/휴대폰/기기/봇/검색 엔진/개발자 도구 기반의 다양한 사용자 에이전트가 있습니다. 여기에는 다음이 포함됩니다:
- Lynx: Lynx/2.8.8pre.4 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/2.12.23
- Wget: Wget/1.15 (linux-gnu)
- Curl: curl/7.35.0
- HTC: Mozilla/5.0 (Linux; Android 7.0; HTC 10 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36
- Google Nexus: Mozilla/5.0 (Linux; U; Android-4.0.3; en-us; Galaxy Nexus Build/IML74K) AppleWebKit/535.7 (KHTML, like Gecko) CrMo/16.0.912.75 Mobile Safari/535.7
- 삼성 갤럭시 노트 4: Mozilla/5.0 (Linux; Android 6.0.1; SAMSUNG SM-N910F Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.0 Chrome/44.0.2403.133 Mobile Safari/537.36
- 삼성 갤럭시 노트 3: Mozilla/5.0 (Linux; Android 5.0; SAMSUNG SM-N900 Build/LRX21V) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/2.1 Chrome/34.0.1847.76 Mobile Safari/537.36
- 삼성 폰: Mozilla/5.0 (Linux; Android 6.0.1; SAMSUNG SM-G570Y Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.0 Chrome/44.0.2403.133 Mobile Safari/537.36
- Bing의 검색 엔진 봇: Mozilla/5.0 (호환 가능; bingbot/2.0; +http://www.bing.com/bingbot.htm)
- Google의 검색 엔진 봇: Mozilla/5.0 (호환 가능; Googlebot/2.1; +http://www.google.com/bot.html)
- Apple iPhone: Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1
- Apple iPad: Mozilla/5.0 (iPad; CPU OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H321 Safari/600.1.4
- Microsoft Internet Explorer 11 / IE 11: Mozilla/5.0 (호환, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko
- Microsoft Internet Explorer 10 / IE 10: Mozilla/5.0 (호환 가능; MSIE 10.0; Windows NT 6.2; Trident/6.0; MDDCJS)
- Microsoft Internet Explorer 9 / IE 9: Mozilla/5.0 (호환; MSIE 9.0; Windows NT 6.0; Trident/5.0; Trident/5.0)
- Microsoft Internet Explorer 8 / IE 8: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
- Microsoft Internet Explorer 7 / IE 7: Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)
- Microsoft Internet Explorer 6 / IE 6: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
- Microsoft Edge: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393
- Mozilla Firefox: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:53.0) Gecko/20100101 Firefox/53.0
- Google Chrome: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
결론
대부분의 웹사이트는 유효하거나 인식 가능한 브라우저 사용자 에이전트가 누락된 요청을 차단하므로, 사이트 차단을 피하기 위해 UA를 적절하게 회전하는 방법을 배우는 것이 중요합니다. 올바른 사용자 에이전트를 사용하면 대상 웹사이트에 요청이 유효한 출처에서 왔음을 알릴 수 있으므로 원하는 대상 사이트에서 자유롭게 데이터를 수집할 수 있습니다.
Bright Data는 머신러닝 알고리즘을 활용해 사이트별 브라우저 사용자 에이전트를 생성하고 봇 탐지 시스템을 우회함으로써 팀의 시간과 자원을 절약하는 완전 자동화된 데이터 언락킹 솔루션을 개발했습니다.