파이썬 크롤링 Response에러 해결하기(Feat. User-Agent)

저번에 파이선 사이트 크롤링에 대해서 알아보았는데요.

 

먼저 사이트 상태가 정상적인지 Response를 통해서 확인하였습니다.

 

response 에러

하지만 일부 멀쩡하게 표시된 사이트도 에러 메시지를 뿜는경우가 있는데요.

etc-image-0

아래 사이트의 경우 저번에 알려준 크롤링 방법으로 크롤링하면 정상 페이지지만 404 에러코드를 보냅니다.

2022.08.22 - [Programming/Python] - 파이썬 웹사이트 크롤링하기- 1. request

 

파이썬 웹사이트 크롤링하기- 1. request

파이썬의 웹사이트 크롤링의 기초 나도코딩 사이트로 파이썬 웹사이트 크롤링을 공부하고 있는데요. 나도코딩 이 사이트를 통해서 하나씩 배워가고 있습니다. 먼저 requests 패키지를 통해서 사

remake.tistory.com

etc-image-1

사용한 코드는 가장 간단하게 혹시 ssl에러가 뜨면 예외처리하는 ssl 코드와

 

그리고 url을 불러와서 status_code를 불러오는 코드인데요.

 

404에러가 발생합니다.

import pandas as pd
from bs4 import BeautifulSoup
import requests
import re
import ssl


if hasattr (ssl, '_create_unverified_context') :
    ssl._create_default_https_context = ssl._create_unverified_context

urls= 'https://www.hankyung.com/thepen/lifeist/article/202210160742Q'

r = requests.head(urls)

print(r)
http_status = r.status_code

print(http_status)

이는 해당 사이트가 이런 봇으로 접근하는 경우를 차단하는 것인데요.

 

무분별한 크롤링과 서버 과부하를 막기 위해 사람이 직접 접속한게 아니라 프로그램을 통하여 

 

접속하는 것을 차단하는 사이트들이 있기 때문입니다.

 

이 경우 우리가 브라우저를 통한 접속은 아무 문제가 없으나, 

python의 requests를 통해서 접속을 하려고 하면 막아 놓았기 때문입니다.

 

하지만 우리는 이를 해결할 수 있습니다.

 

바로 User-agent 기능인데요.

User-Agent?

User-agent는 바로 사용자가 어떤 디바이스와 운영체제 웹브라우저 등으로 서버에 접속했는지를 알려주는 기능입니다.

 

이를 활용해서 우리는 모바일 페이지에 맞는 페이지를 보여주거나, 태블릿에 맞춰서

 

반응형 페이지 등을 보내줄 수 있습니다. 보다 자세한 설명은 아래 사이트에서 참고하시면 좋구요.

 

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent

 

User-Agent - HTTP | MDN

The User-Agent request header is a characteristic string that lets servers and network peers identify the application, operating system, vendor, and/or version of the requesting user agent.

developer.mozilla.org

크롬을 사용한다면 F12 개발자 도구를 들어가신 다음

 

Console 메뉴 하단에 navigator.userAgent라고 명령어를 치시면

 

본인의 User-agent값을 알수 있습니다.

etc-image-2

그리고 이를 request에 포함시켜 주시면 됩니다

import pandas as pd
from bs4 import BeautifulSoup
import requests
import re
import ssl


if hasattr (ssl, '_create_unverified_context') :
    ssl._create_default_https_context = ssl._create_unverified_context

urls= 'https://www.hankyung.com/thepen/lifeist/article/202210160742Q'

r = requests.head(urls,  headers={'User-agent': 'Mozilla/5.0'})

print(r)
http_status = r.status_code

print(http_status)

이렇게 명령어를 실행시키면 아까와 달리 정상적으로 데이터를 가져오는 것을 알 수 있습니다.

etc-image-3

혹시 크롤링을 하다가 잘 안되는 사이트가 있다면 user-agent 기능을 활용해보시기 바랍니다.

 

그럼 즐거운 하루 보내세요.