Q> Selenium WebDriver와 Proxychains의 충돌 해결방안에 대한 문의
python으로 간단한 웹크롤러 만들었고 원하는 대로 잘 작동 되었습니다.
그런데, 소스 IP를 숨기기 위해 proxychains으로 이 프로그램을 돌리면 proxy들간의 chain에 denied되면서 데이터를 못가져오네요...?
관련 글을 구글링해보니깐 많은 개발자들이 동일한 문제를 겪었던것 같은데, 혹시 방법이 없을까요?
A>
우선, 고객님과 똑같은 고생을 해본 개발자로써 반갑기 그지 없습니다~ ^^
페이지 이동 구조로 되어 있는 웹사이트의 크롤러를 만들때 Web crawler를 Selenium WebDriver를 이용하면 만들기 간편합니다.
그런데 이런 WebDriver들은 서버의 브라우저와 브라우저 드라이버를 통해서 대상 웹사이트를 크롤링하기 때문에 호스트가 필요하고 localhost를 사용하게 됩니다.
그러다 보니 기본적으로 socks4 127.0.0.1 9050 를 설정값으로 사용하는 proxychains와 충돌나면서 denied 또는 timeout 를 뿌려주는 것 같더라고요~
저도 프로그램이 잘 돌아가는 것까지 확인하고 마지막으로 proxychains에 얹어서 프로그램을 돌리니깐 고객님과 동일한 문제가 생기더라고요~
그래서 reddit, stackoverflow 등 나올만한 곳은 다 뒤져봤으나 동일한 문제점을 얘기하는 글은 많은데 정작 시원한 해결책을 얘기하는 사람은 없었습니다.
이렇게 저렇게 방법을 바꿔보고 webdriver를 바꿔보면서 하루가 지나갔는데요~ 우연히 방법을 찾게 되었습니다.
Web crawler 프로그램을 proxychains에 얹어서 사용하는 것이 아닌, Web crawler 안의 WebDriver에 proxy server 옵션을 직접 설정하는 것입니다.
options = webdriver.ChromeOptions() options.add_argument('--proxy-server=socks4://localhost:9050') # 기본 proxychains 설정값인 socks4 127.0.0.1 9050 값 사용 browser = webdriver.Chrome(driver_path, options=options)
정확한 원인은 아직 좀더 테스트를 해봐야 하겠지만, 이 방법으로 selenium webdriver와 proxychains 설정을 이용하여 현재 구동되고 있는 https://vul.wikisecurity.net이 아주 잘 돌아가고 있습니다.
추가로 proxychains의 사용팁을 하나 더 알려드리면~
proxychains의 메뉴얼에 따르면, 설정 파일 proxychains.conf를 수정해서 random chain으로 변경하면 사용할때 마다 source ip를 바꿀수 있다고 되어 있는데요~
이방법은 99% timeout 에러가 나면서 작동하지 않습니다. 세상에 공짜는 없습니다. ㅎㅎㅎ
제가 사용하고 있는 차선책 중에 하나는, dynamic chain으로 설정을 바꾸고, tor service가 주기적으로 restart하도록 cron에 등록하는 것입니다.
이렇게 하면 그나마, source ip를 바꿔가면서 proxychains를 깔끔하게 사용할 수 있는 차선택이 될수 있습니다.