• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

웹크롤링 관련 SSL 인증이 필요한 경우에는 어떻게 해야하나요?

20.11.29 06:00 작성 조회수 1.61k

1

안녕하세요 좋은강의 감사드립니다.

박사님의 강의를 들으며 웹크롤링을 실습해 보는 도중 SSL 인증이 필요한 사이트에 경우에는 웹크롤링을 할 수 없단것을 알게되었습니다. (request 를 하게되면 redirction 되는 문제)

처음 코드결과를 html로 살펴보니

response = requests.get(testURL)
print(response.text)

로딩창이 표시되는 것 같았습니다.

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

로 SSL 인증을 False로 만드니 다음과 같은 에러가 발생했습니다.

requests.exceptions.SSLError: HTTPSConnectionPool(host='r2d.asml.com', port=443): Max retries exceeded with url: /material-request/details/106698 (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)')))

urllib으로 불러온 경우에는 이전에 불러왔던 HTML 의 title만 불러오는 것 같았습니다.

context = ssl._create_unverified_context()
result = urllib.request.urlopen(testURL, context=context)

해당 .pem file 을 통해 varify도 똑같은 _ssl.c:1056 에러가 발생합니다..

cafile = certifi.where()

with requests.Session()as s:
    r = s.get(test, verify = cafile)
    print(r.content)

SSL 인증서가 요구되는 사이트의 경우 메인페이지 + 하위페이지에 대해 어떤식으로 HTML 크롤링을 해야할지 조언을 주실 수 있을까요?

감사합니다.

강의와 관련있는 질문을 남겨주세요.


• 강의와 관련이 없는 질문은 지식공유자가 답변하지 않을 수 있습니다. (사적 상담, 컨설팅, 과제 풀이 등)
• 질문을 남기기 전, 비슷한 내용을 질문한 수강생이 있는지 먼저 검색을 해주세요. (중복 질문을 자제해주세요.)
서비스 운영 관련 질문은 인프런 우측 하단 ‘문의하기’를 이용해주세요. (영상 재생 문제, 사이트 버그, 강의 환불 등)

질문 전달에도 요령이 필요합니다.
• 지식공유자가 질문을 좀 더 쉽게 확인할 수 있게 도와주세요.
• 강의실 페이지(/lecture) 에서 '질문하기'를 이용해주시면 질문과 연관된 수업 영상 제목이 함께 등록됩니다.
• 강의 대시보드에서 질문을 남길 경우, 관련 섹션 및 수업 제목을 기재해주세요. 
• 수업 특정 구간에 대한 질문은 꼭 영상 타임코드를 남겨주세요!

구체적인 질문일수록 명확한 답을 받을 수 있어요.
• 질문 제목은 핵심 키워드를 포함해 간결하게 적어주세요.
• 질문 내용은 자세하게 적어주시되, 지식공유자가 답변할 수 있도록 구체적으로 남겨주세요.
• 정확한 질문 내용과 함께 코드를 적어주시거나, 캡쳐 이미지를 첨부하면 더욱 좋습니다.

기본적인 예의를 지켜주세요.
• 정중한 의견 및 문의 제시, 감사 인사 등의 커뮤니케이션은 더 나은 강의를 위한 기틀이 됩니다. 
• 질문이 있을 때에는 강의를 만든 지식공유자에 대한 기본적인 예의를 꼭 지켜주세요. 
반말, 욕설, 과격한 표현 등 지식공유자를 불쾌하게 할 수 있는 내용은 스팸 처리 등 제재를 가할 수 있습니다. 

답변 2

·

답변을 작성해보세요.

0

박관서님의 프로필

박관서

질문자

2020.11.30

답변달아주셔서 감사합니다 !!

결국 request 로는 HTML을 받지 못했어요 ㅜㅜ

처리하는데 조금 오래걸리지만 말씀하신대로 selenium 통해서 .page_source를 받고 

받아온 HTML을 통해서 작업을 처리했습니다.

좋은강의 감사드려요

0

어떤 사이트를 대상으로 하는건지 알수없어 좀 두리뭉실한 답변을 드릴수밖에 없습니다만.... 일단 SSL 인증서를 요구하는 사이트에 따라서 크롤링하는 방식이 달라질 수 있습니다. 단, 일반적인 HTTPS 사이트의 경우에는 특별히 처리할거 없이 크롤링이 가능합니다만 여기서 https 사이트에서는 보통 로그인 후에 정상적인 기능들이 동작하는 방식인경우에는 먼저 로그인 후 로그인된 세션에서 다른 기능들을 수행해야 합니다.

이경우가 아닌경우에는 특정 내부망 같은 사이트에서 개별인증서를 요구하는 경우가 있는데 이런경우에는 보통 requests 같은 내부에서 동작하는 방식보다는 셀레니움 같은 라이브러리를 쓰기도 합니다. 

import requests

cert_file_path = "인증서.pem"
key_file_path = "인증서.pem"

url = "https://SSL인증을필요하는URL"
params = {"파람1": "1", "파람2": "2"}
cert = (cert_file_path, key_file_path)
r = requests.get(url, params=params, cert=cert, verify=False)

물론 내부에서 직접 처리를 하려면 직접 인증서를 선택해서 넣어주는 방식을 사용하기도 합니다만... 정말 특별한 경우 외에는 잘 사용되지는 않습니다.

또한 셀레니움같이 브라우저를 직접 핸들링해서 쿠키를 얻은 후 이렇게 얻은 쿠기를 내부에서 활용해서 requests 같은 라이브러를 사용하게 하는 방식도 있으니 참고해보시기 바랍니다.