17

I'm trying to run my selenium driver on Tor. Note that the script already runs with no errors without Tor.

This is what I've done so far:

1) I called the Tor framework

import socks
import socket
from stem.util import term    


import stem.process

SOCKS_PORT=7000 

socks.setdefaultproxy(proxy_type=socks.PROXY_TYPE_SOCKS5,
                      addr = "127.0.0.1", 
                      port = SOCKS_PORT)
socket.socket = socks.socksocket

# Perform DNS resolution through the socket
def getaddrinfo(*args):   return [(socket.AF_INET, socket.SOCK_STREAM, 6, '', (args[0], args[1]))]

socket.getaddrinfo = getaddrinfo

def print_bootstrap_lines(line):   
    if "Bootstrapped " in line:
      print(term.format(line, term.Color.GREEN))

tor_process = stem.process.launch_tor_with_config(
    tor_cmd = "C:/Users/my-username\Desktop/Tor Browser/Browser/TorBrowser/Tor//tor.exe" ,
    config = { 'SocksPort': str(SOCKS_PORT),},
    init_msg_handler = print_bootstrap_lines,
)
  1. After calling the Tor framework which is like a container to my understanding, I then called the Chrome driver:

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.chrome.options import Options
    options = Options()
    options.binary_location = r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'
    driver = webdriver.Chrome(options=options, executable_path = r'C:\Users\my-username\chromedriver')
    

3) At this point I insert the scraping script.

4) Close driver and kill the Tor process:

driver.close()   
tor_process.kill()

The output I get is the following:

Apr 15 14:31:20.000 [notice] Bootstrapped 0%: Starting
Apr 15 14:31:23.000 [notice] Bootstrapped 10%: Finishing handshake with directory server
Apr 15 14:31:23.000 [notice] Bootstrapped 80%: Connecting to the Tor network
Apr 15 14:31:23.000 [notice] Bootstrapped 90%: Establishing a Tor circuit
Apr 15 14:31:24.000 [notice] Bootstrapped 100%: Done
Traceback (most recent call last):

  File "<ipython-input-2-2b2233fc0ae4>", line 1, in <module>
    runfile('C:/Users/my-username-folder/FireStarter_All_1Step_2.py', wdir='C:/Users/my-username-folder')

  File "C:\Users\my-username\AppData\Local\Continuum\anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 786, in runfile
    execfile(filename, namespace)

  File "C:\Users\my-username\AppData\Local\Continuum\anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/my-username-folder/FireStarter_All_1Step_2.py", line 94, in <module>
    driver = webdriver.Chrome(options=options, executable_path = r'C:\Users\my-username-folder\chromedriver')

  File "C:\Users\my-username\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\chrome\webdriver.py", line 73, in __init__
    self.service.start()

  File "C:\Users\my-username\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\common\service.py", line 104, in start
    raise WebDriverException("Can not connect to the Service %s" % self.path)

WebDriverException: Can not connect to the Service C:\Users\my-username-folder\chromedriver

What am I doing wrong?

Update: I am looking to use Tor with Chrome browser.

Mikee
  • 783
  • 1
  • 6
  • 18

2 Answers2

13

To use Tor with Chrome browser through Selenium you can use the following solution:

  • Code Block:

    from selenium import webdriver
    import os
    
    # To use Tor's SOCKS proxy server with chrome, include the socks protocol in the scheme with the --proxy-server option
    # PROXY = "socks5://127.0.0.1:9150" # IP:PORT or HOST:PORT
    
    torexe = os.popen(r'C:\Users\Debanjan.B\Desktop\Tor Browser\Browser\TorBrowser\Tor\tor.exe')
    PROXY = "socks5://localhost:9050" # IP:PORT or HOST:PORT
    options = webdriver.ChromeOptions()
    options.add_argument('--proxy-server=%s' % PROXY)
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("http://check.torproject.org")
    
  • Browser Snapshot:

Tor_Chrome


You can find a relevant discussion in How to connect to Tor browser using Python

Corey Goldberg
  • 59,062
  • 28
  • 129
  • 143
undetected Selenium
  • 183,867
  • 41
  • 278
  • 352
0

Things I'd look at first.

  1. ports - is the tor socks port interfering with the webdriver ports in any way?
  2. process order ( can you setup the webdriver and then start the tor service)
  3. you could setup a selenium hub that connects to selenium nodes through tor this might make the connection between the webdriver, tor, and your test easier to separate.
wordtronix
  • 61
  • 4
  • I did 2 but got same error. please explain in more detail/example how to go about 1 and 3. – Mikee Apr 15 '19 at 13:28
  • 1) SOCKS_PORT is set to 7000 , do you set ports in your selenium config? If so , does it conflict. I didn't see any port related information in your error trace. But if the webdriver can't connect to the chrome executable it can be due to a port conflict, or sometimes the chromedriver is old and doesn't match the webdriver version. – wordtronix Apr 15 '19 at 13:32
  • Yes for the Socks_port but there's no port setting in the selenium config so i fail to see how they interfere with each other. – Mikee Apr 15 '19 at 13:36
  • 3) check out [https://www.seleniumhq.org/docs/07_selenium_grid.jsp] . the selenium grid is a way to run multiple browsers and do more concurrent testing. But at this point it might be more confusion that help. – wordtronix Apr 15 '19 at 13:36