티스토리 뷰

728x90
반응형

웹 브라우저에서의 User-Agent란?

웹 사이트에 들어갔을 때 HTTP 패킷을 열어보면 HTTP Header에 항상 존재하는 헤더 값으로 User-Agent란 값이 있습니다.

GET / HTTP/1.1
Host: domdom.tistory.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
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.9
Accept-Encoding: gzip, deflate, br
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: 쿠키값 생략

 

블로그에서 블로그 관리 기능이 있는데, 여기서 어떤 사람이 어떤 디바이스(PC 또는 모바일이나 태블릿 등)에서 블로그에 방문했는 지 알 수 있습니다. 이 때 확인하게 되는 값이 바로 이 User-Agent 값입니다.

 

User-Agent는 사용자를 대신해서 일을 수행하는 소프트웨어 에이전트가 사전적 의미입니다. 그리고 우리가 웹사이트를 탐색할 때 사용하는 Software 는 바로 웹 브라우저(Web Browser)입니다. 근데 이 웹 브라우저는 종류도 다양하죠. PC 버전의 크롬 브라우저, Firefox, Safari, Internet Explorer, IE, 등등. PC뿐만 아니라 Mobile 버전의 웹 브라우저도 있을 수 있고, 태블릿 버전의 웹브라우저도 있을 수 있고, 반드시 웹 브라우저만 있지 않을 수도 있습니다. HTTP 프로토콜을 사용하는 다양한 서비스나 앱이나 네트워크 프로그램이 있을 수 있기 때문입니다.

 

아무튼 다시 본 주제로 넘어와서, 웹 크롤러 만들 때 User-Agent 는 매우 중요합니다.

 

왜냐하면 요즘에는 대부분이 PC 버전의 웹사이트, Mobile 버전의 웹 사이트를 별도로 분리해서 개발한 사이트가 많기 때문이죠. 저희 돔돔이블로그도 모바일로 들어왔을 때랑 PC로 들어왔을 때랑 UI 도 다르고 실제로 HTML 코드도 달라집니다. 이 때문에 웹 크롤러는 항상 일정한 형식으로 크롤링을 해오기 위해서 User-Agent 값을 정해두고 크롤링을 수행해야합니다.

 

사실 위 이유뿐만 아니라 어떤 경우에는 웹 사이트 자체에서 특정 User-Agent 로 들어왔을 경우에 차단하는 사이트도 있습니다. 

가령 이런 경우은 웹 자동화 스크래핑 도구로써 파이썬을 많이 사용하게 되는데, 파이썬 자동화 프로그램이 웹사이트를 계속 긁다보면 해당 웹 서버는 부하가 오기 때문에 부하 방지를 위해서라도 파이썬 관련 User-Agent를 차단하곤 합니다.

 

이 때 파이썬 크롤러의 User-Agent는 아래와 같이 노출되게 됩니다.

User-Agent : python-requests/2.22.0

그리고 curl 네트워크 프로그램의 경우에는 아래와 같이 나옵니다.

User-Agent : curl/7.55.1

 

만약 웹 사이트에서 위와 같은 User-Agent를 막고 있다면 User-Agent 값을 조작해서 우회할 수 있어야 합니다.

Python에서 requests 모듈로 특정 웹사이트에 요청할 때 User-Agent 값을 조작할 수 있는 예제는 아래와 같습니다.

 

import requests

url = "https://domdom.tistory.com"
headers = {
	"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"
}
res = requests.get(url, headers=headers)
res.raise_for_status()
with open("domdom.html", "w", encoding="utf8") as f:
	f.write(res.text)

위 코드는 간단히 domdom.tistory.com 웹 사이트에 크롬브라우저의 User-Agent 로 설정 후 요청하여 결과로 돌아온 HTML 코드를 domdom.html 파일로 저정하는 코드입니다.

 

위 코드와 같이 작성하면 동일한 웹 브라우저의 User-Agent로 요청하기 때문에 크롤러를 제작하는 것이 보다 용이할 것이라고 생각합니다.

 

- 끝 -

728x90
반응형
댓글