본문 바로가기

BLOG/웹크롤링

[웹크롤링] Response [406] : 에러 발생 이유 & 해결 방법 - 헤더값 설정

1. Response [406] : 에러 발생 이유

웹 크롤링을 할 때, 처음 코드에 url을 입력하고, requests.get(url) 함수를 통해 정상적으로 접속이 되는지 확인을 하는데요, 정상적으로 접속이 되었다면 Response [200] 이라는 코드가 출력됩니다.

 

아래 코드는 예시로 네이버 홈페이지에 접속하는 코드인데요,

 

from bs4 import BeautifulSoup   
import requests

url = "https://www.naver.com" 
resp = requests.get(url)

print(resp)


#output :
<Response [200]>

 

requests.get() 함수에 url을 입력하고, 반환된 값을 출력해보면 Response [200] 으로 정상적으로 접속이 된 것을 확인할 수 있습니다.

 

 

하지만, 많은 홈페이지의 경우 위와 같이 url만 바꾸고 실행을 해보면 Response [406] 또는 무한 로딩이 발생하게 되는데요, 아래 코드는 음악 사이트인 멜론 홈페이지에 접속했을 때의 코드입니다.

 

from bs4 import BeautifulSoup   
import requests

url = "https://www.melon.com/chart/index.htm" 
resp = requests.get(url)

print(resp)


# output :
<Response [406]>

 

반환된 값을 보면 해당 페이지에 정상적으로 접속이 되지 않았다는 것을 알 수 있는데요, 이렇게 되면 크롤링을 수행할 수 없게 됩니다.

 

이렇게 Response [406] 이 발생하는 이유는 바로 해당 페이지를 접속할 때, 사용자 정보를 나타내는 헤더값이 없어서 페이지 입장에서 사람이 접속하지 않았다고 판단해 이를 막기 때문입니다.

따라서 지금 접속하는 것이 사람임을 알려주어야 하는데요, 이를 위해서 헤더값을 입력해야 한답니다.

 

 

2. Response [406] 해결 방법

보통, 헤더값은 User Agent를 이용하는데요, User Agent는 http://www.useragentstring.com/에 접속해서 "Mozilla/5.0~"라고 길게 작성되어 있는 텍스트를 복사하면 됩니다.

 

현재 기준 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36" 라고 적혀져 있습니다.

 

그리고나서 아래와 같이 코드를 수정해줍니다.

 

url = "https://www.melon.com/chart/index.htm" 

user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"
hdr = {'User-Agent': user_agent}

resp = requests.get(url, headers=hdr)

 

위 코드를 보면, 헤더값을 user_agent 라는 변수에 저장해주었고, 이를 딕셔너리 형태로 저장한 다음, requests.get() 함수에 url 다음에 헤더값의 인자로 넣어주었습니다.

 

이렇게 입력한 뒤, resp 를 다시 출력해보면 <Response [200]> 가 나오는 것을 확인할 수 있답니다.

 

그리고나서, 이제 원하는 크롤링 명령어를 작성하면 됩니다.