我正在尝试在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()
答案 0 :(得分:1)
您没有提供任何错误或堆栈跟踪信息,但是看起来您正在获取IndexError
,这是因为循环不正确。想象一下,您获得了100个代理,您当前的循环将从0变为100,但是,这是101个条目,而不是100个;因为0是第一个索引。一种快速的解决方案是更改此行,使其减少一行(0-99 = 100次迭代):
while proxy_Counter < len(raw_proxy) - 1:
但是,如果您的目标是加快检查代理的过程,则代码将产生相反的效果,因为对于您创建的每个线程,您都要再次检查每个代理,因此现在有了x10的冗余。最好使用ThreadPoolExecutor,然后将代理平均分配给您的线程并设置最大线程数量,以免服务器超载。