我如何从线程中的每个请求获得新的IP?

sh

我尝试使用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()

运行它时,我看到输出:

{"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进入不同的进程?

drew010

如果每个连接都需要不同的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()

通过将凭据设置为firstpartydomain:randompasswordTor浏览器可以将每个域隔离流,方法是将凭据设置为,其中randompassword是每个唯一的第一方域的随机随机数。

如果您要爬网相同的站点,并且需要随机IP,请为每个会话使用随机的username:password组合。如果要爬网随机域,并且希望对域的请求使用相同的电路,请使用Tor浏览器的domain:randompassword凭据方法

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何获得子网中的每个IP地址?

我如何只获得每个组的新唯一值?

我如何在线程中获得 odoo 环境

如何在我的 railsApp 中获得更少的 SQL 请求

如何获得每个请求的刷新令牌?

我如何从python的txt文件中请求每个令牌

我试图通过thread_func调用中的for循环的每个遍历请求打印的线程数

我如何获得带有呼叫的主机名/ IP的完整请求URL?

Android Retrofit请求如何在主线程中获得改造响应

如何为NestJS中的每个新HTTP请求使用新实例?

我应该在每个传入请求中创建新的上下文吗?

如何增加我在响应中获得的变量并在下一个请求JMETER中分配新值

我如何获得数组的每个元素

我如何获得每个国家的最大价值

我如何获得每个月的数量?

我如何获得每个社区的直径

我试图从每个句子中获得表达

我如何获得http请求的内容?

如何根据我从请求中获得的顺序动态地订购我的反应组件?

如何合并每个数组中的值以获得一个新数组

如何限制Node.JS中每个IP的请求数量?

我如何获得该网站的IP地址?

当我的UI在MFC中获得关闭输入时,如何退出线程

如何在jmeter中的任何侦听器中获取每个线程的发送请求和接收响应的日期/时间

我如何从Django中的发帖请求中仅获得小时或分钟部分?

如何获得每个请求的数据库数据?

如何从pthreads中的每个线程依次打印?

Tomcat线程模型-每个请求模型中的线程中的线程是否处理与该请求相关的所有工作?

我能否获得一个日志,该日志显示命中Kubernetes集群中的NodePort的请求的源IP?