티스토리 뷰

반응형

Python에서 웹 크롤링을 진행할 때, Senelium을 이용하여 사이트를 접속하고 Requests를 이용하여 원하는 데이터를 가져옵니다.

 

Requests는 HTTP 메소드를 이용하여 접속을 하는데, 주로 GET과 POST를 사용합니다.

GET은 requests.get()을 사용하고 POST는 requests.post()를 사용합니다.

 

1. requests 모듈 설치

 

pip(패키지 관리자)를 이용하여 모듈을 설치합니다.

 

pip install requests

pip install requests

 

2. 초간단 테스트

 

ㄱ. 정상적인 https 사이트 접속 코드 및 결과

import requests

response = requests.get("https://www.naver.com")
data = response.text
print(data)

테스트로 네이버(https://www.naver.com) 사이트를 접속하여 봅니다.

 

<!doctype html>             <html lang="ko"> 
<head> <meta charset="utf-8"> 
<title>NAVER</title> <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
<meta name="viewport" content="width=1190"> 
<meta name="apple-mobile-web-app-title" content="NAVER"/> 
<meta name="robots" content="index,nofollow"/> 
<meta name="description" content="네이버 메인에서 다양한 정보와 유용한 컨텐츠를 만나 보세요"/> 

https(암호화된 사이트)에서 정상적으로 html 문서가 그대로 출력됨을 확인할 수 있습니다.

 

ㄴ. 신뢰하지 않은 SSL 인증서가 설치되어 있는 https 사이트 접속 및 결과

 

그래서 제가 테스트하는 https 서버에 requests 모듈을 이용하여 접속 테스트를 시도해보았습니다.

테스트 서버다 보니 https의 인증서가 정상적으로 설치하지 않았습니다.

 

참고로, 인증서가 없는 사이트는 접속 시 웹 브라우저에서 다음과 같은 에러 메시지가 발생합니다

테스트 서버다 보니 다음과 같이 클릭하면 됩니다.

 

비 신뢰하는 SSL 인증서가 설치된 웹사이트 접속 시 경고 문구

  1. 고급 클릭
  2. 안전하지 않음으로 이동 클릭

시 정상적으로 사이트에 접속합니다.

 

다시 돌아와서 테스트 서버의 URL을 Get으로 요청합니다.

import requests

url= "https://192.168.105.2"
response = requests.get(url)
data = response.text
print(data)

이번에는 에러 메시지가 다음과 같이 발생합니다.

 

requests.exceptions.SSLError: HTTPSConnectionPool(host='192.168.105.2', port=443):
Max retries exceeded with url: / 
(Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] 
certificate verify failed: self signed certificate (_ssl.c:1051)')))

에러 메시지 :  SSL: CERTIFICATE_VERIFY_FAILED , Certificate verify failed

인증서와 관련하여 유효하지 않기에 에러 메시지를 뱉고(?) Trackback과 함께 프로그램이 종료됩니다.

 

해결 방법

requests 모듈에서 url 뒤에 옵션을 하나 주면 해결할 수 있습니다.

response = requests.get(url,verify=False)

verify=False

해당 옵션을 사용하면 HTTPS 요청에 대한 SSL 인증서 확인 과정을 생략하겠다는 의미입니다.

 

InsecureRequestWarning: 
Unverified HTTPS request is being made. 
Adding certificate verification is strongly advised. 
See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)

<Response [200]>

SSL-Warning 문구는 보이지만 응답 코드는 200이 떨어져서 정상적으로 사이트에 접속 됨을 확인 할 수 있었습니다.

http 응답코드 (200)
서버가 요청을 제대로 처리했다는 뜻이다. 이는 주로 서버가 요청한 페이지를 제공했다는 의미로 쓰인다.

 

반응형