Selenium WebDriver + Tor 作为 Stem 的代理?
Selenium WebDriver + Tor as proxy with Stem?
我需要确认如果 Stem 可用于启动公开 127.0.0.1:port 的 Tor 进程,然后在 selenium 脚本上将其用作代理 (SOCKS)。
我正在使用 Python 3.4.2、Stem 1.3.0 和 Tor(tor-win32-tor-0.2.5.10 专家
捆绑)在 Windows.
这段代码适用于标准的 SOCKS 代理。
from selenium import webdriver
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
profile = FirefoxProfile()
profile.set_preference('network.proxy.type', 1)
profile.set_preference('network.proxy.socks', '127.0.0.1')
profile.set_preference('network.proxy.socks_port', 9000)
driver = webdriver.Firefox(profile)
driver.implicitly_wait(30)
driver.get('http://www.reddit.com')
但我无法使用 Tor 作为我的代理。我试图创建一个 Tor 进程,并创建了它。但我真的不知道它是否正常工作。我的 tor_error_log.txt
中没有错误
# File: stem_process.py
import stem.process
import stem
stem.process.launch_tor_with_config(
config = {
'SocksPort': '9000',
'ControlPort': '9051',
'ExitNodes': '{us}',
'Log': [
'NOTICE stdout',
'ERR file c:\tor-win32-tor-0.2.5.10\Tor\tor_error_log.txt',
],
},
tor_cmd = 'C:\tor-win32-tor-0.2.5.10\Tor\tor.exe',
)
然后我尝试了两种创建连接或验证的方法。第一个是使用 with
和 stem.control.controller
。第二个在较低级别 stem.socket
和 stem.connection
第一个:
# File: stem_test1.py
from stem.control import Controller
with Controller.from_port(address='127.0.0.1', port=9051) as controller: #port = 9051
controller.authenticate()
print("Tor is running version %s" % controller.get_version())
'''
# Output:
Tor is running version 0.2.5.10 (git-13318a95ddfbbf8d)
'''
第二个:
# File: stem_test2.py
import sys
import stem
import stem.connection
import stem.socket
if __name__ == '__main__':
try:
control_socket = stem.socket.ControlPort(port = 9051)
stem.connection.authenticate(control_socket)
except stem.SocketError as exc:
print('Unable to connect to tor on port 9051: %s' % exc)
sys.exit(1)
except stem.connection.AuthenticationFailure as exc:
print('Unable to authenticate: %s' % exc)
sys.exit(1)
print("Issuing 'GETINFO version' query...\n")
control_socket.send('GETINFO version')
print(control_socket.recv())
'''
# Output:
Issuing 'GETINFO version' query...
version=0.2.5.10 (git-13318a95ddfbbf8d)
OK
'''
并且 运行 都没有错误...但是当我使用代码以 127.0.0.1:9000
作为代理调用 Firefox WebDriver 实例时(也尝试使用 127.0.0.1:9051
,因为我不真不知道socksPort
和controlPort
的区别)不行。
Stem 无法创建 tor 进程,它只是一个用于通过控制端口连接到 inspection/control 现有 tor 服务器的库。
要创建 tor 进程本身,您需要让系统以 upstart/launchctl/etc 启动它。或者,如果安装了 tor
,您可以从命令行输入 tor
,它会在前台显示 运行。
这样,要使用 stem,您需要将 torrc 编辑为 a.启用 ControlPort,和 b。设置身份验证方法(存储在您的 torrc 中的 cookieauth 或散列密码)。默认的 tor SocksPort 是 9050,ControlPort 是 9051。
SocksPort 是您路由流量(即 firefox)的端口,ControlPort 是您连接到的端口。
请注意,只有当你甚至需要 stem 时,因为它看起来就像你试图用它启动一个 tor 实例(那是不可能的),如果你在你的系统香草上得到它 运行ning,它将与 selenium/firefox 一起工作,因为你已经配置好了(好吧,默认端口是 9050 而不是 9000)
我需要确认如果 Stem 可用于启动公开 127.0.0.1:port 的 Tor 进程,然后在 selenium 脚本上将其用作代理 (SOCKS)。
我正在使用 Python 3.4.2、Stem 1.3.0 和 Tor(tor-win32-tor-0.2.5.10 专家 捆绑)在 Windows.
这段代码适用于标准的 SOCKS 代理。
from selenium import webdriver
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
profile = FirefoxProfile()
profile.set_preference('network.proxy.type', 1)
profile.set_preference('network.proxy.socks', '127.0.0.1')
profile.set_preference('network.proxy.socks_port', 9000)
driver = webdriver.Firefox(profile)
driver.implicitly_wait(30)
driver.get('http://www.reddit.com')
但我无法使用 Tor 作为我的代理。我试图创建一个 Tor 进程,并创建了它。但我真的不知道它是否正常工作。我的 tor_error_log.txt
# File: stem_process.py
import stem.process
import stem
stem.process.launch_tor_with_config(
config = {
'SocksPort': '9000',
'ControlPort': '9051',
'ExitNodes': '{us}',
'Log': [
'NOTICE stdout',
'ERR file c:\tor-win32-tor-0.2.5.10\Tor\tor_error_log.txt',
],
},
tor_cmd = 'C:\tor-win32-tor-0.2.5.10\Tor\tor.exe',
)
然后我尝试了两种创建连接或验证的方法。第一个是使用 with
和 stem.control.controller
。第二个在较低级别 stem.socket
和 stem.connection
第一个:
# File: stem_test1.py
from stem.control import Controller
with Controller.from_port(address='127.0.0.1', port=9051) as controller: #port = 9051
controller.authenticate()
print("Tor is running version %s" % controller.get_version())
'''
# Output:
Tor is running version 0.2.5.10 (git-13318a95ddfbbf8d)
'''
第二个:
# File: stem_test2.py
import sys
import stem
import stem.connection
import stem.socket
if __name__ == '__main__':
try:
control_socket = stem.socket.ControlPort(port = 9051)
stem.connection.authenticate(control_socket)
except stem.SocketError as exc:
print('Unable to connect to tor on port 9051: %s' % exc)
sys.exit(1)
except stem.connection.AuthenticationFailure as exc:
print('Unable to authenticate: %s' % exc)
sys.exit(1)
print("Issuing 'GETINFO version' query...\n")
control_socket.send('GETINFO version')
print(control_socket.recv())
'''
# Output:
Issuing 'GETINFO version' query...
version=0.2.5.10 (git-13318a95ddfbbf8d)
OK
'''
并且 运行 都没有错误...但是当我使用代码以 127.0.0.1:9000
作为代理调用 Firefox WebDriver 实例时(也尝试使用 127.0.0.1:9051
,因为我不真不知道socksPort
和controlPort
的区别)不行。
Stem 无法创建 tor 进程,它只是一个用于通过控制端口连接到 inspection/control 现有 tor 服务器的库。
要创建 tor 进程本身,您需要让系统以 upstart/launchctl/etc 启动它。或者,如果安装了 tor
,您可以从命令行输入 tor
,它会在前台显示 运行。
这样,要使用 stem,您需要将 torrc 编辑为 a.启用 ControlPort,和 b。设置身份验证方法(存储在您的 torrc 中的 cookieauth 或散列密码)。默认的 tor SocksPort 是 9050,ControlPort 是 9051。
SocksPort 是您路由流量(即 firefox)的端口,ControlPort 是您连接到的端口。 请注意,只有当你甚至需要 stem 时,因为它看起来就像你试图用它启动一个 tor 实例(那是不可能的),如果你在你的系统香草上得到它 运行ning,它将与 selenium/firefox 一起工作,因为你已经配置好了(好吧,默认端口是 9050 而不是 9000)