고흐의 연구실/Python

[Selenium + Python] Tor browser(proxy)사용 ip 변경

전고흐 2022. 7. 31. 23:03
728x90

0. 개요

사이트 접속 시 proxy를 사용해 ip를 임의 변경하여 지속 접속을 하려 한다.

proxy는 tor browser를 사용합니다.

내용은 작업 간 동시 작성

 

1. 사전 조사

Tor에 대해서 간략하게 알아보고 가면,

Tor browser는 네트워크 우회와 익명화를 위해 사용하는 툴이다. 그리고 다크 웹에 이용됩니다. 추적이 불가능 하기 때문에!

일반적인 프록시를 한번 거치고 tor를 사용하면 더욱 더 추적이 힘들다고 합니다.

여담으로 사실 여부는 확인이 필요하지만, Tor는 미국 정부기관에서 제작을 했는데 Tor를 사용하면 해당 기관 사람인 것을 들켜버리는 문제점이 생겼다고 합니다. 그래서 일반인에게 오픈을 하게 되었다고... 그로인해 다크 웹에서의 범죄가 사이드 이펙트로 따라왔지만,,

Tor network의 네트워크는 아래와 같이 구성이되어 추적이 힘들어 집니다.

추적과는 상관 없지만 proxy의 기능을 사용하여 ip를 변경하고자 Tor를 사용하게 되었습니다.

 

2. 환경

ip 변경하는 루틴을 python으로 제작해보자.

버전은 windows와 linux 각각 진행하려 합니다.

windows는 로컬 환경에서, linux는 ncp 환경(ubuntu 18.04 server)에서 진행한다.

 

3. 개발

3.1. For windows

Tor browser 설치

아래 tor 공식 페이지에서 tor browser를 설치합니다.

https://www.torproject.org/download/

이후 tor browser를 열면, 따로 실행 버튼이 있는데, 해당 버튼을 눌르면 프록시 연결이 활성화 됩니다. 활성화 되지 않는다면 해당 인터넷 환경의 설정을 확인해보아야 합니다.(회사 내부 등과 같이 안되는 네트워크 환경이 있어요)

 

아래 블로그를 참조하여 chrome driver를 실행할 때, 옵션을 주고 테스트 해보았습니다.

테스트 방식은 해당 코드를 이용하여 selenium browser를 open한 후, find my ip로 확인하는 방식으로 진행.

https://sulung-sulung.tistory.com/14

from selenium import webdriver

def selenium_driver():
    options = webdriver.ChromeOptions()
    options.add_argument("--proxy-server=socks5://127.0.0.1:9150")
    options.add_argument('window-size=1920x1080')
    options.add_argument('disable-gpu')
    options.add_experimental_option('excludeSwitches', ['enable-logging'])
    driver = webdriver.Chrome('C:/Users/real1/Desktop/exe/chromedriver.exe', options=options)

    return driver

if __name__ == "__main__":

        url = 'https://www.whatismyip.com/'
        driver = selenium_driver()
        driver.get(url)

위 블로그의 코드에서 for문은 왜 들어가있는지 모르겠습니다. for문을 순회하는 i가 없습니다. 따라서 삭제 후 테스트 진행했습니다.

코드는 해당 블로그 토대로 조금 변경하였습니다.

driver에 본인이 사용하는 chrome dirver 위치로 변경해주면 됩니다.

 

proxy를 타긴했는데.. naver 등 국내 페이지에서 tor를 통한 접속을 막아놓았습니다.

ip 우회 후 최종적으로는 네이버 쇼핑 페이지에 적용 예정이라 해당 방법 이외의 방법을 더 서칭해야 될 것 같습니다.

 

그렇지만, Linux 상에서도 테스트를 진행 해보겠습니다.

 

3.2. For Linux

Tor browser 설치

https://blog.naver.com/hcheong/221960206418

위 블로그를 참조합니다.

 

저는 위의 환경에 기재한대로 NCP 환경에서 설치합니다.(root 계정 / user일 경우 sudo 명령어 사용하세요)

1) tor 설치

apt-get install updat

apt-get upgrade

apt-get install tor

 

2) stem 라이브러리 설치(파이썬으로 tor를 사용하려면 설치가 필요합니다.)

apt-get install python3-stem

 

3) tor passwd 설정

tor --hash--password [passwd]

 

16:뒤에 해쉬값이 표기가 됩니다.

 

4) tor config 

vim /etc/tor/torrc

여기에서 ControlPort 9051을 uncomment 하고,

HashedControlPassword 16:~~~ 부분도 uncomment 한다.  여기서는 16: 뒤에다가 위에서 받은 해쉬값을 넣어줍니다.

 

5) tor 재실행

service tor restart

 

셀레니움 / 크롬 드라이버 설치

pip3 install selenium

apt-get install chromium-chromedriver

 

동작확인

#! /user/bin/python3
# -*- coding: utf-8 -*-

import time 
from stem import Signal
from stem.control import Controller
from selenium import webdriver

with Controller.from_port(port=9051) as controller:
	while True:
		url="https://search.naver.com/search.naver?sm=top_hty&fbm=1&ie=utf8&query=%EB%82%B4%EC%95%84%EC%9D%B4%ED%94%BC"
		hostname="socks5://127.0.0.1"
		port="9050"
		chrome_options = webdriver.ChromeOptions()
		chrome_options.add_argument('--proxy-server=%s' % hostname + ":" + port)
		driver = webdriver.Chrome(options=chrome_options)

		driver.get(url)
		time.sleep(20)
		driver.quit()

		controller.authenticate('')
		controller.signal(Signal.NEWNYM) 
            
		if controller.is_newnym_available() == False:
			print("waiting for Tor to change IP: " + str(controller.get_newnym_wait()) + " sec")
			time.sleep(controller.get_newnym_wait()) 
                  
controller.close()

 

 

https://jjzyra.tistory.com/2

def open_browser_c(path, url, useragent):
    
    torexe = os.popen(r'/usr/local/bin/tor')
    PROXY = "socks5://localhost:9050" # IP:PORT or HOST:PORT
    
    # 옵션 설정
    chrome_options = webdriver.ChromeOptions() 
    chrome_options.add_argument("--disable-extensions") 
    chrome_options.add_argument("disable-infobars")
    chrome_options.page_load_strategy = 'normal'
    chrome_options.add_argument('--enable-automation')
    chrome_options.add_argument('disable-infobars')
    chrome_options.add_argument('disable-gpu')
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('user-agent={}'.format(useragent))
    chrome_options.add_argument('--lang=ko_KR')
    chrome_options.add_argument('--ignore-certificate-errors')
    chrome_options.add_argument('--allow-insecure-localhost')
    chrome_options.add_argument('--allow-running-insecure-content')
    chrome_options.add_argument('--disable-notifications')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_argument('--disable-browser-side-navigation')
    chrome_options.add_argument('--mute-audio')
#    Tor 프록시 설정 (ip 우회)   
#    chrome_options.add_argument('--proxy-server=%s' % PROXY)
    chrome_options.headless = True
    
    # 브라우저 열기 
    driver = webdriver.Chrome(executable_path=path, options=chrome_options)
    driver.get(url)
    rand_num = (2 + random.random())*2
    time.sleep(rand_num)
    
    return driver

 

 

* 참고

Tor browser의 port

일반적으로 Tor는 9050번 포트로 SOCKS 연결을 지원한다.(참고로 Tor 브라우저는 9150번 포트로 지원한다)

728x90