我尝试使用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进入不同的进程?
如果每个连接都需要不同的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:randompassword
,Tor浏览器可以将每个域隔离流,方法是将凭据设置为,其中randompassword是每个唯一的第一方域的随机随机数。
如果您要爬网相同的站点,并且需要随机IP,请为每个会话使用随机的username:password组合。如果要爬网随机域,并且希望对域的请求使用相同的电路,请使用Tor浏览器的domain:randompassword
凭据方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句