我如何从线程中的每个请求中获取新 ip?

ksh*_*kvn 4 tor multiprocessing python-3.x python-requests python-asyncio

我尝试使用 TOR 代理进行抓取,并且在一个线程中一切正常,但这很慢。我尝试做一些简单的事情:

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


def check_ip():
    get_new_ip()
    session = requests.session()
    session.proxies = {'http': 'socks5h://localhost:9050', 'https': 'socks5h://localhost:9050'}
    r = session.get('http://httpbin.org/ip')
    r.text


with Pool(processes=3) as pool:
    for _ in range(9):
        pool.apply_async(check_ip)
    pool.close()
    pool.join()
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我看到输出:

{"origin": "95.179.181.1, 95.179.181.1"}
{"origin": "95.179.181.1, 95.179.181.1"}
{"origin": "95.179.181.1, 95.179.181.1"}
{"origin": "151.80.53.232, 151.80.53.232"}
{"origin": "151.80.53.232, 151.80.53.232"}
{"origin": "151.80.53.232, 151.80.53.232"}
{"origin": "145.239.169.47, 145.239.169.47"}
{"origin": "145.239.169.47, 145.239.169.47"}
{"origin": "145.239.169.47, 145.239.169.47"}
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况,我如何为每个线程提供自己的 IP?顺便说一下,我尝试过像 TorRequests、TorCtl 这样的库,结果是一样的。

我知道TOR在发布新IP之前似乎有延迟,但是为什么相同的IP会进入不同的进程?

dre*_*010 7

如果您希望每个连接使用不同的 IP,您还可以通过为每个连接指定不同的代理组合来使用SOCKS 上的流隔离username:password

使用这种方法,您只需要一个 Tor 实例,并且每个请求客户端都可以使用具有不同出口节点的不同流。

为了进行设置,请为每个requests.session对象添加唯一的代理凭据,如下所示:socks5h://username:password@localhost:9050

import random
from multiprocessing import Pool
import requests

def check_ip():
    session = requests.session()
    creds = str(random.randint(10000,0x7fffffff)) + ":" + "foobar"
    session.proxies = {'http': 'socks5h://{}@localhost:9050'.format(creds), 'https': 'socks5h://{}@localhost:9050'.format(creds)}
    r = session.get('http://httpbin.org/ip')
    print(r.text)


with Pool(processes=8) as pool:
    for _ in range(9):
        pool.apply_async(check_ip)
    pool.close()
    pool.join()
Run Code Online (Sandbox Code Playgroud)

Tor 浏览器通过将凭据设置为 来在每个域的基础上隔离流firstpartydomain:randompassword,其中 randompassword 是每个唯一的第一方域的随机随机数。

如果您正在抓取同一个站点并且您想要随机 IP,则为每个会话使用随机的用户名:密码组合。如果您正在抓取随机域并希望对域的请求使用相同的电路,请使用 Tor 浏览器的方法domain:randompassword获取凭据。