반응형

Selenium 사용 시 아래와 같은 경고 메시지가 표시되는 경우가 있다.

 

WARNING:urllib3.connectionpool:Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<urllib3.connection.HTTPConnection object at 0x00000229B1AA7FD0>: Failed to establish a new connection: [WinError 10061] 대상 컴퓨터에서 연결을 거부했으므로 연결하지 못했습니다')': /session/bf8000eff591a4e17810d9d23c3c91cc/window/handles
WARNING:urllib3.connectionpool:Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<urllib3.connection.HTTPConnection object at 0x00000229B1AC3760>: Failed to establish a new connection: [WinError 10061] 대상 컴퓨터에서 연결을 거부했으므로 연결하지 못했습니다')': /session/bf8000eff591a4e17810d9d23c3c91cc/window/handles
WARNING:urllib3.connectionpool:Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<urllib3.connection.HTTPConnection object at 0x00000229B1AC3280>: Failed to establish a new connection: [WinError 10061] 대상 컴퓨터에서 연결을 거부했으므로 연결하지 못했습니다')': /session/bf8000eff591a4e17810d9d23c3c91cc/window/handles

 

이유는 selenium 의 webdriver 선언을 한 후 반복문에 들어간 후 quit() 로 닫았다가 다시 시도를 하는 경우 발생한다.

driver = webdriver.Chrome('./chromedriver', chrome_options=options)

for i in range(1, 100):
	driver.get("https://url.com")  
	driver.quit()

이런 경우 발생한다.

 

해결방법은 다음과 같이 webdriver 선언을 반복문 안으로 넣으면 된다.

for i in range(1, 100):
	driver = webdriver.Chrome('./chromedriver', chrome_options=options)
	driver.get("https://url.com")  
	driver.quit()
반응형
반응형

언젠가 부터 파이썬 Selenium 을 돌리는데 아래 경고 메시지가 표시되기 시작했다.

DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead

이 경고 메시지는 Selenium 이 4.* 으로 업데이트 되면서 그동안 우리가 잘 써오던 driver.find_element_by_id(), find_element_by_css_selector() 등이 deprecated 됐다. 쉽게 말해 문법이 바뀌어서 다른 방법을 적용해야 한다.

 

우선 import 부터 하자

from selenium.webdriver.common.by import By

 

각 변경된 내용은 아래와 같다.

driver.find_element_by_id("element_id")
driver.find_element(By.ID, "element_id")

driver.find_element_by_name("element_name")
driver.find_element(By.NAME, "element_name")

driver.find_element_by_tag_name("element_tag_name")
driver.find_element(By.TAG_NAME, "element_tag_name")

driver.find_element_by_css_selector("element_css_selector")
driver.find_element(By.CSS_SELECTOR, "element_css_selector")

driver.find_element_by_class_name("class_name")
driver.find_element(By.CLASS_NAME, "class_name")

driver.find_element_by_link_text("element_link_text")
driver.find_element(By.LINK_TEXT, "element_link_text")

driver.find_element_by_partial_link_text("element_partial_link_text")
driver.find_element(By.PARTIAL_LINK_TEXT, "element_partial_link_text")

driver.find_element_by_xpath("element_xpath")
driver.find_element(By.XPATH, "element_xpath")

 

그리고 driver.find_elements_* 를 사용하던 경우는 아래와 같이 s 만 더 붙여주면 된다.

driver.find_elements_by_id("element_id")
driver.find_elements(By.ID, "element_id")

driver.find_elements_by_name("element_name")
driver.find_elements(By.NAME, "element_name")

driver.find_elements_by_tag_name("element_tag_name")
driver.find_elements(By.TAG_NAME, "element_tag_name")

driver.find_elements_by_css_selector("element_css_selector")
driver.find_elements(By.CSS_SELECTOR, "element_css_selector")

driver.find_elements_by_class_name("class_name")
driver.find_elements(By.CLASS_NAME, "class_name")

driver.find_elements_by_link_text("element_link_text")
driver.find_elements(By.LINK_TEXT, "element_link_text")

driver.find_elements_by_partial_link_text("element_partial_link_text")
driver.find_elements(By.PARTIAL_LINK_TEXT, "element_partial_link_text")

driver.find_elements_by_xpath("element_xpath")
driver.find_elements(By.XPATH, "element_xpath")

 

기존 find_element_by_* 이 방식도 당분간은 계속 사용해도 되지만, 언젠가는 사용이 중지되어 에러가 나게 될 것이니

검색한 김에 수정해보자.

반응형
반응형

어떠한 이유(?)로 chromedriver 를 사용하면서 proxy 를 사용해야만 할 때가 있다.

 

proxy 를 왜 사용하는지는 별도로 검색해보시길 ^^;;

 

구글 검색을 통해 여러가지 해보았지만, 아래 내용으로만 성공을 했다.

 

내가 사용한 python 버전은 3.7 이다.

 

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_autoinstaller

chromedriver_autoinstaller.install(True)


PROXY = "proxy-server-ip:proxy-server-port"

options = webdriver.ChromeOptions()
options.add_argument('--proxy-server=http://%s' % PROXY)

driver = webdriver.Chrome(options=options)

driver.get('https://icanhazip.com/')

 

공개된 무료 proxy server 가 많으니 찾아서 적용해보기 바란다.

 

 

모든 proxy server 가 모두 다 잘 적용되는 것은 아니니 여러 서버를 테스트를 해봐야 한다.

 

그리고 쉽게 사라지고 또 새로운 서버가 생겨나니 주기적으로 확인해야 한다.

 

아니면 아예 proxy server 리스트를 크롤링해서 적용하는 방법도 있겠다.

 

반응형
반응형

파이썬에 chromedriver-autoinstaller 를 적용한 후 갑자기 에러가 나서 사용을 못하는 경우가 발생했다.

 

PermissionError: [Errno 13] Permission denied 가 발생해서 보니 chromedriver_autoinstaller.install() 에서 시작되어

chromedriver.exe 의 권한없음으로 에러가 난 것이다.

 

최근 크롬이 버전업 되면서 발생한 것으로 생각된다.

Traceback (most recent call last):
  File "C:\Users\test\Desktop\test\test.py", line 14, in <module>
    chromedriver_autoinstaller.install()
  File "C:\Users\test\AppData\Local\Programs\Python\Python39\lib\site-packages\chromedriver_autoinstaller\__init__.py", line 15, in install
    chromedriver_filepath = utils.download_chromedriver(cwd)
  File "C:\Users\test\AppData\Local\Programs\Python\Python39\lib\site-packages\chromedriver_autoinstaller\utils.py", line 202, in download_chromedriver
    zip_file.extract(chromedriver_filename, chromedriver_dir)
  File "C:\Users\test\AppData\Local\Programs\Python\Python39\lib\zipfile.py", line 1616, in extract
    return self._extract_member(member, path, pwd)
  File "C:\Users\test\AppData\Local\Programs\Python\Python39\lib\zipfile.py", line 1687, in _extract_member
    open(targetpath, "wb") as target:
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\test\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\chromedriver_autoinstaller\\91\\chromedriver.exe'

 

 

해결방법은 의외로 간단하다.

 

chromedriver_autoinstaller.install()

 

대신에

 

chromedriver_autoinstaller.install(True)  로 True 만 적용해주면 된다.

 

True 를 적용해주면 현재 파이썬이 실행되는 폴더에 자동으로 최신버전이 이름이 된 폴더가 생성되면서 그 폴어 안에 크롬드라이브의 최신버전이 다운로드 되면서 적용이 된다.

 

처음부터 다 다시 세팅해야 하나 걱정했는데 다행이다.

반응형

+ Recent posts