我在python3的这段代码中做错了什么

时间:2020-05-28 07:09:57

标签: python-3.x python-requests python-multithreading http-proxy

我正在尝试在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()

1 个答案:

答案 0 :(得分:1)

您没有提供任何错误或堆栈跟踪信息,但是看起来您正在获取IndexError,这是因为循环不正确。想象一下,您获得了100个代理,您当前的循环将从0变为100,但是,这是101个条目,而不是100个;因为0是第一个索引。一种快速的解决方案是更改此行,使其减少一行(0-99 = 100次迭代):

while proxy_Counter < len(raw_proxy) - 1:

但是,如果您的目标是加快检查代理的过程,则代码将产生相反的效果,因为对于您创建的每个线程,您都要再次检查每个代理,因此现在有了x10的冗余。最好使用ThreadPoolExecutor,然后将代理平均分配给您的线程并设置最大线程数量,以免服务器超载。