我想使用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

使用此,我提出了一个请求。 如何更改ipaddress来做另一个?

===============>>#1 票数:83

您的问题有两个方面-

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

第1部分

第一个很容易处理最新的(v2.10.0及更高版本) requests库,并带有使用socks代理的requests[socks]的附加要求。

安装 -

pip install requests requests[socks]

基本用法 -

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)

第2部分

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

默认情况下,正常Tor安装不会启用ControlPort 您必须编辑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

请注意,上面的HashedControlPassword用于密码"password" 如果要设置其他密码,请注意tor --hash-password "<new_password>"的输出,替换torrc中的HashedControlPassword ,其中<new_password>是要设置的密码。

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

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

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

tor --service install

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

tor --service remove
tor --service install -options ControlPort 9051

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

好的,现在我们已经正确配置了Tor,如果Tor已经在运行,则必须重新启动它。

sudo service tor restart

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

安装-

pip install stem

您现在可以通过调用以下函数来更新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)

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

session = get_tor_session()
print(session.get("http://httpbin.org/ip").text)

===============>>#2 票数:26 已采纳

这是您要使用的代码(使用pip install 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")

祝你好运,希望能成功。

===============>>#3 票数: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

===============>>#4 票数: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)

===============>>#5 票数:3

该答案完成了Windows的Ashish Nitin Patil之一(随时更新此答案)

第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

上面的HashedControlPassword是密码。 如果要在控制台中设置其他密码,请导航到\\Tor Browser\\Browser\\TorBrowser\\Tor并键入以下命令: tor.exe --hash-password password_XYZ | more 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

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

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

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

===============>>#6 票数:3

此代码可以正常工作。 使用Tor,它会在每次请求后更改IP地址。

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

nbrOfIpAddresses=3

with Controller.from_port(port = 9051) as controller:
   controller.authenticate(password = 'my_pwd')
   socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
   socket.socket = socks.socksocket   

   for i in range(0, nbrOfIpAddresses):
       newIP=urlopen("http://icanhazip.com").read()
       print("NewIP Address: %s" % newIP)
       controller.signal(Signal.NEWNYM)
       if controller.is_newnym_available() == False:
        print("Waitting time for Tor to change IP: "+ str(controller.get_newnym_wait()) +" seconds")
        time.sleep(controller.get_newnym_wait())
   controller.close()

===============>>#7 票数:3

您可以尝试使用纯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'}

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

===============>>#8 票数:1

requesocksrequests非常老,它没有response.json()和许多其他内容。

我想保持我的代码干净。 但是, requests当前尚不支持socks5(有关更多详细信息,请阅读此线程https://github.com/kennethreitz/requests/pull/478

因此,我现在使用Privoxy作为连接Tor的http代理。

在Mac上安装和配置Privoxy

brew install privoxy
vim /usr/local/etc/privoxy/config
# put this line in the config
forward-socks5 / localhost:9050 .
privoxy /usr/local/etc/privoxy/config

在Ubuntu上安装和配置Privoxy

sudo apt-get install privoxy
sudo vim /etc/privoxy/config
# put this line in the config
forward-socks5 / localhost:9050 .
sudo /etc/init.d/privoxy restart

现在,我可以像使用HTTP代理一样使用Tor。 以下是我的python脚本。

import requests

proxies = {
  'http': 'http://127.0.0.1:8118',
}

print requests.get('http://httpbin.org/ip', proxies=proxies).text

  ask by Sachin Kelkar translate from so

未解决问题?本站智能推荐: