【问题标题】:Stem is not generating new IP address in PythonStem 没有在 Python 中生成新的 IP 地址
【发布时间】:2017-07-13 23:22:14
【问题描述】:

为什么Signal.NEWNYM 没有生成新的 IP 地址?

from stem import Signal
from stem.control import Controller
import requests

with Controller.from_port(port=9051) as controller:
    print('Ready')
    controller.authenticate(password='872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C')
    print("Success!")
    controller.signal(Signal.NEWNYM)
    print("New Tor connection processed")
    print(requests.get('http://icanhazip.com').content)

【问题讨论】:

  • 它显示的是相同的原始 IP 地址。

标签: python tor


【解决方案1】:

NEWNYM 信号并非用于获取新的退出节点,它只是将当前电路标记为脏并确保新连接将使用新电路。

来自stem docs

需要注意的重要一点是,新电路不一定意味着新 IP 地址。路径是根据速度和稳定性等启发式随机选择的。 Tor 网络中的大型出口只有这么多,因此重复使用以前的出口并不少见。

Tor 没有循环使用您的 IP 地址的方法。这是故意的,并且出于几个原因。首先是通常出于不那么好的原因(例如规避禁令或搜索引擎优化)要求此功能。其次,重复的电路创建会给 Tor 网络带来非常高的负载,所以请不要这样做!

编辑。我最初错过了您在发出请求时没有使用 Tor(代理)!这是问题的第一部分。

您应该首先安装 socks 支持 requests 库 (pip install requests[socks]),然后通过本地 Tor 代理发出请求,如下所示:

requests.get('https://httpbin.org/ip', 
             proxies={'http': 'socks5://127.0.0.1:9050',
                      'https': 'socks5://127.0.0.1:9050'}).text

【讨论】:

  • 实际上,我正在尝试为我的研究目的解析谷歌学者,谷歌在一个请求后就阻止了我。我找到了 IP 解决方案的更改并尝试了,但它显示我的原始 IP 甚至没有被该程序使用。
  • 恐怕tor 不会为此提供帮助。
  • Look here 我从这里阅读了一些 cmets 和建议,以便在几秒钟后更改 ip。
  • 非常感谢您的帮助。现在我每次都得到新的IP。我可以用它来向谷歌和其他网站(用于抓取)请求不同的用户代理吗?
  • 我正在尝试修改我的代码,当我使用this 网站作为我的IP 时,它每次都显示相同的IP 并显示验证码错误。
【解决方案2】:

当您提出请求时,您获得了相同的 IP 或第一次 IP 没有改变?

如果请求中的 IP 相同:您应该让脚本休眠 30 秒并且可以工作。

我遇到了同样的问题,通过 sleep 解决了。

def renew_connection():
    with Controller.from_port(port=9051) as controller:
        controller.authenticate(password="YourPass")
        controller.signal(Signal.NEWNYM)
    time.sleep(30)

还要确保密码和端口正确!

【讨论】:

    猜你喜欢
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 2017-11-27
    • 2014-01-27
    • 2017-10-02
    • 1970-01-01
    • 2021-04-12
    相关资源
    最近更新 更多