首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从线程中的每个请求中获取新的ip?

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

Stack Overflow用户
提问于 2019-06-24 17:16:11
回答 1查看 2.4K关注 0票数 6

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

代码语言:javascript
复制
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()

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

代码语言:javascript
复制
{"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"}

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

我理解TOR在签发新的IP之前似乎有延迟,但为什么同一个IP会进入不同的流程?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-01 06:28:04

如果您想为每个连接指定不同的If,您还可以通过为每个连接指定不同的代理username:password组合来使用SOCKS上的Stream Isolation

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

为了设置它,像这样为每个requests.session对象添加唯一的代理凭据:socks5h://username:password@localhost:9050

代码语言:javascript
复制
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()

Tor浏览器通过将凭证设置为firstpartydomain:randompassword,以每个域为基础隔离流,其中随机密码是每个唯一第一方域名的随机随机数。

如果您正在爬行相同的站点,并且您想要随机的IP,那么对每个会话使用一个随机的用户名:密码组合。如果您正在搜索随机域,并希望对某个域的请求使用相同的电路,请使用Tor Browser的domain:randompassword方法获取凭据。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56733397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档