Python Library/웹 크롤링

[웹 크롤링 - Python] User-Agent

바보1 2022. 1. 28. 18:43

1. User-Agent란?


우리가 보통 컴퓨터로 들어가는 사이트의 화면과 휴대폰으로 들어가는 사이트의 화면은 다르다.

pc에서의 네이버 화면과, 휴대폰에서의 네이버 화면이 다르다.

이는 우리가 웹사이트에 접속할 때, 우리의 정보를 가지고 웹사이트에서 스마트폰인지 데스크탑인지

판단해서 보여주는 그런 정보를 담고 있다.

더보기
더보기
더보기

소프트웨어 에이전트가 네트워크 프로토콜 안에서 동작할 때, 문자적 식별 문자열을 피어(peer)에 제출함으로써 종종 자기 자신과 애플리케이션 유형, 운영 체제, 소프트웨어 업체, 소프트웨어 리비전을 식별한다. HTTP,[2] SIP,[1], NNTP[3] 프로토콜에서 이러한 식별 정보는 User-Agent라는 헤더 필드를 통해 전달된다. 웹 크롤러와 같은 은 종종 URL이나 이메일 주소를 포함하기도 하며 이로 말미암아 웹마스터가 봇의 운영자와 연락을 취할 수 있다.

라고 한다.

즉, 나에 대한 정보라고 쉽게 생각하면 될 것 같다.

내가 직접 접속을 하는 것과, requests를 통해 접속을 하는 것 또한 user-agent가 다르다.


2. 왜 알아야 하는가?


무분별한 크롤링과 서버 과부하를 막기 위해 사람이 직접 접속한게 아니라 프로그램을 통하여 접속하는 것을 차단하는 사이트들이 있다.

내가 직접 검색을 해서 들어가면 상관이 없지만, requests를 통해서 접속을 하려고 하면 막아 놓는 사이트가 있다.

예를 들어서 "https://www.melon.com"이다. 멜론 같은 경우에는 옆의 링크를 통해 접속하면 정상적으로 접속이 된다.

하지만, requests를 통해서 접속을 하려고 하면??

'406' 코드와 함께 아무것도 가져 오지 않는다.

다른 예로 response.stauts_code가 아닌 raise_for_status()를 사용해보자

와우

이렇게 오류가 떠버린다.

즉, 멜론 사이트는 내가 직접 접속한 것은 허용하지만, requests를 통해 크롤링하려는 것은 차단한다.
(아마 순위 조작 이런 이유가 아닐까???)

하여튼 이럴 때 써야 하는 것이 User-Agent이다. 내가 순위 조작 이런 이유가 아니라 뭐 다른 이유에 의해서

멜론 사이트를 크롤링 해야할 때, User-Agent를 바꿔서 내가

"requests를 통해 HTTP를 요청한게 아니라 내가 직접 사이트에 들어가서 HTTP를 요청하는거야 "

라고 속일 수가 있다.


3. 나의 User-Agent


내가 requests, 즉 프로그램을 통하여 접속하는 User-Agent는 알 수 없지만,

내가 직접 접속할 떄의 User-Agent는 쉽게 알 수 있다.

https://www.whatismybrowser.com/detect/what-is-my-user-agent

 

What is my user agent?

Every request your web browser makes includes your User Agent; find out what your browser is sending and what this identifies your system as.

www.whatismybrowser.com

위의 사이트에 들어가면

저기에 있는 Your User Agent is: 에 있는 이상한 값이 나의 User-Agent이다.

그리고, 내가 크롬에서 접속할 때와 인터넷 익스플로러에서 접속했을 때의 User-Agent는 또 다르다.


4. 사용법


User-Agent가 뭐하는 정보인지, 그리고 내가 직접 접속했을 때의 나의 User-Agent는 무엇인지 알았으니 이제 써먹을 일만 남았다.

일단 저기 User-Agent의 정보를 복사하자.

복사를 한 후 내가 쓴 코드처럼 똑같이 한 번 써보자.

header = {"User-Agent": "나의 User-Agent"} 
response = requests.get(url, headers=header)

똑같이 쓰지는 말고, 나의 User-Agent에 나의 User-Agent를 복사해서 넣으면 된다.

그리고 나서 requests.get 파라미터에 'headers=' 에 내가 위에서 만든 header를 넣어주면 된다.

그러면 이 requests는 내가 직접 접속하는 것과 같은 효과?를 가질 수 있게 된다.

한 번 실행해보자.

단순히 User-Agent만 바꿔줬을 뿐인데, 다른 결과가 나왔다. 아까는 '406' 코드가 왔지만 지금은 '200' 코드, 즉, 정상 응답 코드가 나왔다.

또한 response.text를 출력하면,

정상적으로 값이 나온다.

따라서 User-Agent를 바꿔줌으로써 크롬에서 가져온 것과 똑같은 웹사이트를 가져올 수가 있다.

이렇게 해서 제대로된 HTML 문서를 가지고 웹 스크래핑을 할 수가 있다.


5. 요약


쉽게 말해서 User-Agent는 나의 정보를 담은 것이다.

크롬으로 직접 접속한 것과 requests를 통해 접속한 것은 다른 User-Agent를 갖는다.

하지만 몇몇 웹사이트는 requests를 통해 접속하는 것을 막는 사이트가 있다.

따라서 requests를 통해 접속을 할건데, 크롬에서 접속하는 것과 똑같이 받아오고 싶다면,

나의 User-Agent를 크롬에서 접속하는 것과 똑같이 만들어 주면 된다.

header = {"User-Agent": "나의 User-Agent"} 
response = requests.get(url, headers= header)

를 통해 requests를 통해 접속하는 것이, 크롬에서 접속하는 것과 동일한 User-Agent를 만들어 주었다.

참고 : 나도 코딩