使用Python over Tor发出请求

Sac*_*kar 51 python tor

我想使用Tor对网页发出多个GET请求.我想为每个请求使用不同的ipaddress.

import socks
import socket
socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 9150)
socket.socket = socks.socksocket
import requests
print (requests.get('http://icanhazip.com')).content
Run Code Online (Sandbox Code Playgroud)

使用这个,我提出了一个请求.如何更改ipaddress以制作另一个?

sha*_*k3r 85

你的问题有两个方面 -

  1. 使用Tor发出请求
  2. 根据要求更新连接(在您的情况下,在每次请求后)

第1部分

第一个很容易使用最新的(v2.10.0以上)requests库,另外还需要requests[socks]使用socks代理.

安装 -

pip install requests requests[socks]
Run Code Online (Sandbox Code Playgroud)

基本用法 -

import requests

def get_tor_session():
    session = requests.session()
    # Tor uses the 9050 port as the default socks port
    session.proxies = {'http':  'socks5://127.0.0.1:9050',
                       'https': 'socks5://127.0.0.1:9050'}
    return session

# Make a request through the Tor connection
# IP visible through Tor
session = get_tor_session()
print(session.get("http://httpbin.org/ip").text)
# Above should print an IP different than your public IP

# Following prints your normal public IP
print(requests.get("http://httpbin.org/ip").text)
Run Code Online (Sandbox Code Playgroud)

第2部分

要更新Tor IP,即拥有一个新的可见退出IP,您需要能够通过它连接到Tor服务ControlPort,然后发送NEWNYM信号.

ControlPort默认情况下,Normal Tor安装不启用.您必须编辑您的torrc文件并取消注释相应的行.

ControlPort 9051
## If you enable the controlport, be sure to enable one of these
## authentication methods, to prevent attackers from accessing it.
HashedControlPassword 16:05834BCEDD478D1060F1D7E2CE98E9C13075E8D3061D702F63BCD674DE
Run Code Online (Sandbox Code Playgroud)

请注意,HashedControlPassword以上是密码"password".如果你想设置不同的密码,更换HashedControlPassword时指出,从输出中的torrc tor --hash-password "<new_password>"这里<new_password>是您要设置的密码.

.................................................. ..............................

Windows用户警告:请参阅此处的帖子.

在Windows上存在一个问题,如果使用以下命令安装了tor,则会忽略torrc文件中controlport的设置:

tor --service install
Run Code Online (Sandbox Code Playgroud)

要解决此问题,请在编辑torrc文件后,键入以下命令:

tor --service remove
tor --service install -options ControlPort 9051
Run Code Online (Sandbox Code Playgroud)

.................................................. ..............................

好的,现在我们已经正确配置了Tor,如果Tor已经运行,你将不得不重启Tor.

sudo service tor restart
Run Code Online (Sandbox Code Playgroud)

Tor现在应该在9051上启动并运行ControlPort,我们可以通过它向它发送命令.我更喜欢使用官方的词库来控制Tor.

安装 -

pip install stem
Run Code Online (Sandbox Code Playgroud)

您现在可以通过调用以下函数来更新Tor IP.

续订IP -

from stem import Signal
from stem.control import Controller

# signal TOR for a new connection 
def renew_connection():
    with Controller.from_port(port = 9051) as controller:
        controller.authenticate(password="password")
        controller.signal(Signal.NEWNYM)
Run Code Online (Sandbox Code Playgroud)

要验证Tor是否有新的退出IP,只需重新运行第1部分中的代码.由于某些我不知道的原因,您需要创建一个新session对象才能使用新IP.

session = get_tor_session()
print(session.get("http://httpbin.org/ip").text)
Run Code Online (Sandbox Code Playgroud)

  • 感谢@jamescampbell获取信息,更新我的答案以反映相同的信息. (2认同)
  • @JinSnow 这比 Tor 更像是一个 Scrapy 问题,请参阅 /sf/ask/3150695831/ 以获得更多帮助。 (2认同)
  • 我建议您使用socks5h,以便将DNS 解析委托给代理。 (2认同)

jam*_*ell 26

这是您要使用的代码(使用下载stem包pip install stem)

from stem import Signal
from stem.control import Controller

with Controller.from_port(port = 9051) as controller:
    controller.authenticate(password='your password set for tor controller port in torrc')
    print("Success!")
    controller.signal(Signal.NEWNYM)
    print("New Tor connection processed")
Run Code Online (Sandbox Code Playgroud)

祝你好运,希望有效.


Jam*_*own 22

您可以尝试纯 python Tor 协议实现Torpy。根本不需要原始 Tor 客户端或 Stem 依赖。

$ pip3 install torpy[requests]
...

$ python3.7
>>> from torpy.http.requests import TorRequests
>>> with TorRequests() as tor_requests:
...    print("build circuit")
...    with tor_requests.get_session() as sess:
...        print(sess.get("http://httpbin.org/ip").json())
...        print(sess.get("http://httpbin.org/ip").json())
...    print("renew circuit")
...    with tor_requests.get_session() as sess:
...        print(sess.get("http://httpbin.org/ip").json())
...        print(sess.get("http://httpbin.org/ip").json())
...
build circuit
{'origin': '23.129.64.190, 23.129.64.190'}
{'origin': '23.129.64.190, 23.129.64.190'}
renew circuit
{'origin': '198.98.50.112, 198.98.50.112'}
{'origin': '198.98.50.112, 198.98.50.112'}
Run Code Online (Sandbox Code Playgroud)

因此,每次当您获得新会话时,您都会获得新身份(基本上,您将获得带有新出口节点的新电路)。在自述文件https://github.com/torpyorg/torpy 中查看更多示例


Erd*_*ker 15

你可以使用torrequest库(无耻插件).它可以在PyPI上找到.

from torrequest import TorRequest

with TorRequest() as tr:
  response = tr.get('http://ipecho.net/plain')
  print(response.text)  # not your IP address

  tr.reset_identity()

  response = tr.get('http://ipecho.net/plain')
  print(response.text)  # another IP address, not yours
Run Code Online (Sandbox Code Playgroud)

  • 我知道这是一个古老的问答,但这个对我有用.我只需这样做:使用TorRequest(proxy_port = 9050,ctrl_port = 9051,password ='password')作为tr: (3认同)
  • `tr.reset_identity()`不会改变IP地址.我错过了什么吗?我需要更改tor配置文件吗? (2认同)
  • tr.reset_identity() 对我不起作用。但无论如何,您可以创建许多 &lt;code&gt;TorRequest(proxy_port=9050, ctrl_port=9051, password='password')&lt;code&gt; 对象,每个新对象都会有新的 IP/会话。 (2认同)

小智 7

请求使用版本2.10.0中的SOCKS协议支持代理.

import requests
proxies = {
    'http': 'socks5://localhost:9050',
    'https': 'socks5://localhost:9050'
}
url = 'http://httpbin.org/ip'
print(requests.get(url, proxies=proxies).text)
Run Code Online (Sandbox Code Playgroud)


Jin*_*now 5

这个答案完成了 Ashish Nitin Patil for windows的答案 (请随时更新这个答案)

第2部分

ControlPort 9051
## If you enable the controlport, be sure to enable one of these
## authentication methods, to prevent attackers from accessing it.
HashedControlPassword 16:05834BCEDD478D1060F1D7E2CE98E9C13075E8D3061D702F63BCD674DE
Run Code Online (Sandbox Code Playgroud)

上面HashedControlPassword是密码。如果您想在控制台中设置不同的密码,请导航至\Tor Browser\Browser\TorBrowser\Tor并键入以下命令:)tor.exe --hash-password password_XYZ | more。它会给你类似HashedControlPassword 16:54C092A8...“这是你的密码”的信息。现在您可以将其添加到 torrc 文件 ( Tor Browser\Browser\TorBrowser\Data\Tor\torrc)。

然后您需要重新启动 Tor:

tor --service remove
tor --service install -options ControlPort 9051
Run Code Online (Sandbox Code Playgroud)

要检查是否有效,请键入netstat -an您现在将看到端口 9051 已打开。

请注意,这tor --service install -...将创建Tor Win32 Service. 由于某种原因,似乎您必须停止服务才能使用浏览器(运行services.msc

编辑:您会在这里找到很多信息(关于端口号和代理、Tor、Privoxy、自动切换用户代理...)。