我试图在python3中创建一个代理检查器,一切都很好,直到我没有在其中引入多线程以使其快速,现在它给我的错误,我不能理解为什么它是这样的。
import requests
import threading
#DECLARING ALL VARIABLES
proxy_api="https://api.proxyscrape.com/?request=getproxies&proxytype=http&timeout=50&country=all&ssl=all&anonymity=all"
raw_proxy = []
live_proxy = []
#Declaring ALL COUNTERS
proxy_Counter = 0
def main():
pass
def fetch_proxy():
global raw_proxy
res = requests.get(proxy_api)
raw_proxy = res.text.splitlines()
print(len(raw_proxy))
return raw_proxy
def check_proxy():
global raw_proxy
global live_proxy
global proxy_Counter
while proxy_Counter < len(raw_proxy):
try:
proxyDict = {
"https" : "https://"+raw_proxy[proxy_Counter],
"http" : "http://"+raw_proxy[proxy_Counter],
}
res = requests.get("http://httpbin.org/ip",proxies=proxyDict,timeout=3)
print(f"Proxy Live {raw_proxy[proxy_Counter]}")
live_proxy.append(raw_proxy[proxy_Counter])
proxy_Counter+=1
except Exception as e:
print(f"Dead Proxy {raw_proxy[proxy_Counter]}")
proxy_Counter+=1
print(len(live_proxy))
return live_proxy
fetch_proxy()
threads = []
for _ in range(10):
t = threading.Thread(target=check_proxy)
t.start()
threads.append(t)
for t in threads:
t.join()
你没有提供任何错误或堆栈跟踪,但看起来你得到的是个 IndexError
这是因为你的循环不正确。想象一下,你得到了100个代理,你当前的循环将从0到100,然而,这是101个条目,而不是100;因为0是第一个索引。一个快速的解决方案是改变这一行,使其少一个(0-99=100次迭代)。
while proxy_Counter < len(raw_proxy) - 1:
然而,如果你的目的是加快检查代理的过程,你的代码会产生相反的效果,因为你每创建一个线程,你就会再次检查每个代理,所以现在你有x10个冗余。最好的办法是使用 线程池执行器 并将代理服务器均匀地分配到你的线程中,并设置一个最大的线程量,这样你就不会让服务器负荷过重。