Python 使用tor代理时如何控制tor

Python 使用tor代理时如何控制tor,python,sockets,tor,Python,Sockets,Tor,我正在尝试使用tor连接到资源,更改标识。但在第一次连接后,尝试更改标识会导致错误。 代码: 我得到一个错误: File "/media/all/Run/e/c.py", line 21, in <module> newI() File "/media/all/Run/e/c.py", line 7, in newI with Controller.from_port(port=9051) as controller: File "/usr/local/l

我正在尝试使用tor连接到资源,更改标识。但在第一次连接后,尝试更改标识会导致错误。 代码:

我得到一个错误:

  File "/media/all/Run/e/c.py", line 21, in <module>
    newI()
  File "/media/all/Run/e/c.py", line 7, in newI
    with Controller.from_port(port=9051) as controller:
  File "/usr/local/lib/python2.7/dist-packages/stem/control.py", line 659, in from_port
    control_port = stem.socket.ControlPort(address, port)
  File "/usr/local/lib/python2.7/dist-packages/stem/socket.py", line 314, in __init__
    self.connect()
  File "/usr/local/lib/python2.7/dist-packages/stem/socket.py", line 187, in connect
    self._socket = self._make_socket()
  File "/usr/local/lib/python2.7/dist-packages/stem/socket.py", line 340, in _make_socket
    control_socket.connect((self._control_addr, self._control_port))
  File "/usr/lib/python2.7/dist-packages/socks.py", line 369, in connect
    self.__negotiatesocks5(destpair[0],destpair[1])
  File "/usr/lib/python2.7/dist-packages/socks.py", line 236, in __negotiatesocks5
    raise Socks5Error(ord(resp[1]),_generalerrors[ord(resp[1])])
TypeError: __init__() takes exactly 2 arguments (3 given)

有趣。我想知道是否

socket.socket = socks.socksocket

正在导致
\u make_socket()
获得非标准套接字,进而导致批量。如果改为使用,它是否工作?

问题是由
socket.socket=socks.socksocket
行引起的

作为一种临时解决方案,可以保留一份
socket.socket
的备份副本,并在请求Tor提供新身份之前使用该副本取消代理设置,然后再次设置代理

代码如下所示:

import urllib2, socks, socket
from stem import Signal
from stem.control import Controller

old_socket = socket.socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket

def newI():
    socket.socket = old_socket  # don't use proxy
    with Controller.from_port(port=9051) as controller:
        controller.authenticate()
        controller.signal(Signal.NEWNYM)
    # set up the proxy again
    socket.socket = socks.socksocket

newI()

headers = {'User-Agent': 'Mozilla/3.0 (x86 [en] Windows NT 5.1; Sun)'} 
req = urllib2.Request('https://google.com', None, headers)
response = urllib2.urlopen(req)
html = response.read()

newI()

然而,我仍然在等待有人发布一个关于错误发生原因的解释,以及更好的修复方法

这并不能真正回答问题,因为使用PycURL并不总是一个选项。例如,我需要直接使用
socket.socket
,因此不能使用PycURL。
socket.socket = socks.socksocket
import urllib2, socks, socket
from stem import Signal
from stem.control import Controller

old_socket = socket.socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket

def newI():
    socket.socket = old_socket  # don't use proxy
    with Controller.from_port(port=9051) as controller:
        controller.authenticate()
        controller.signal(Signal.NEWNYM)
    # set up the proxy again
    socket.socket = socks.socksocket

newI()

headers = {'User-Agent': 'Mozilla/3.0 (x86 [en] Windows NT 5.1; Sun)'} 
req = urllib2.Request('https://google.com', None, headers)
response = urllib2.urlopen(req)
html = response.read()

newI()