티스토리 뷰
TIL
[Python] SSL Error & Max retries exceeded with url - Request 모듈 과 셀레니움 동시 사용으로 인한 트래픽 중복
0_hoonie 2022. 1. 9. 18:09qpldocs.dla.mil/search/parts.aspx?qpl=1780
상기의 url에서 아래 이미지에 나오는 리스트들을 텍스트로 추출하고자 했다.
아래는 코드
import requests
from bs4 import BeautifulSoup
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
from urllib.request import urlopen
def set_chrome_driver():
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
return driver
driver = webdriver.Chrome("./chromedriver")
url = "https://qpldocs.dla.mil/search/parts.aspx?qpl=1780"
driver.get(url)
#오류가 발생하는 아래 3줄
res = requests.get(url)
res.raise_for_status()
soup = BeautifulSoup(res.text,"lxml")
partlist = driver.find_element(By.ID, "Lu_gov_DG_ctl03_btnGovPartNo")
print(partlist.text)
driver.find_element(By.XPATH,"//*[@id='Lu_gov_DG_ctl03_btnGovPartNo']").click()
partauthorizationcompay = driver.find_element(By.ID, "Lu_man_DG_ctl03_lblCompany")
print(partauthorizationcompay.text)
partstatus = driver.find_element(By.ID, "Lu_man_DG_ctl03_imgCompanyStatus")
print(partstatus.text)
하지만, 위에 주석을 달아놓은 오류가 발생하는 아래 3줄을 넣으면 오류가 뜨고 , 안넣으면 또 에러 없이 잘 실행이되었다.
안넣으면 문제는 for문을 통해 리스트를 가지고 올 수가 없다는거..^^
아래는 오류 출력 사항
> Max retries exceeded with url: /search/parts.aspx?qpl=1780 (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate
ㅇ
이러한 오류 내용을 #ashcode에 문의하였고, 이에 대한 답변은
셀레니움과 BS4 사용시 Max retries exceeded with url & [SSL: CERTIFICATE_VERIFY_FAILED] unable to get local issuer certif
안녕하세요, qpldocs.dla.mil/search/parts.aspx?qpl=1780 상기의 url에서 아래 이미지에 나오는 리스트들을 텍스트로 추출하고자 합니다.(이후 각 리스트들을 타고 들어가 추가 크롤링을 할 예정이므로, 단
hashcode.co.kr
정리하자면, SSL 인증서 에러 + request 모듈과 셀레니움 동시 사용으로 인한 트래픽 중복 이 동시에 발생했다는 것.
그래서 import request 삭제 및 위와 같이 lxml 사용을 page_source로 바꾼 셀레니움 맞춤형으로 바꾸자 오류가 해결되었다.
왜 SSL 인증서 에러까지 해결되었는지는 미궁이지만..^^ 이건 다음에 알아보도록 하자.
바뀐 정상 코드
from bs4 import BeautifulSoup
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
from urllib.request import urlopen
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
def set_chrome_driver():
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
return driver
driver = webdriver.Chrome("./chromedriver")
url = "https://qpldocs.dla.mil/search/parts.aspx?qpl=1780"
driver.get(url)
html = driver.page_source
soup = BeautifulSoup(html,"lxml")
partlist = driver.find_element(By.ID, "Lu_gov_DG_ctl03_btnGovPartNo")
print(partlist.text)
driver.find_element(By.XPATH,"//*[@id='Lu_gov_DG_ctl03_btnGovPartNo']").click()
partauthorizationcompay = driver.find_element(By.ID, "Lu_man_DG_ctl03_lblCompany")
print(partauthorizationcompay.text)
partstatus = driver.find_element(By.ID, "Lu_man_DG_ctl03_imgCompanyStatus")
print(partstatus.text)
# request가 들어간 함수를 지우기 작동은 되지만 requests.exceptions.SSLError 는 그대로 표기됨
# request 모듈 임포트 해준걸 빼주니 모두 해결, 왜 SSL 문제까지 해결된거지?