在这段python3的代码中,我做错了什么 [关闭]

问题描述 投票:0回答:1

我试图在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()
python-3.x python-requests python-multithreading http-proxy
1个回答
1
投票

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

while proxy_Counter < len(raw_proxy) - 1:

然而,如果你的目的是加快检查代理的过程,你的代码会产生相反的效果,因为你每创建一个线程,你就会再次检查每个代理,所以现在你有x10个冗余。最好的办法是使用 线程池执行器 并将代理服务器均匀地分配到你的线程中,并设置一个最大的线程量,这样你就不会让服务器负荷过重。

© www.soinside.com 2019 - 2024. All rights reserved.