Python代理检查器,改为线程版本

1 投票
1 回答
2147 浏览
提问于 2025-04-15 16:45

我有一个用Python写的代理检查器。

为了加快检查的速度,我决定改成多线程版本。

但是对我来说,线程模块是第一次使用,我尝试了好几次把它改成线程版本。

我查了很多资料,但对新手Python程序员来说,这并不是那么简单。

如果有人能帮我,我会非常感激!!

提前谢谢大家!

import urllib2, socket

socket.setdefaulttimeout(180)
# read the list of proxy IPs in proxyList
proxyList = open('listproxy.txt').read()

def is_bad_proxy(pip):    
    try:        
        proxy_handler = urllib2.ProxyHandler({'http': pip})        
        opener = urllib2.build_opener(proxy_handler)
        opener.addheaders = [('User-agent', 'Mozilla/5.0')]
        urllib2.install_opener(opener)        
        req=urllib2.Request('http://www.yahoo.com')  # <---check whether proxy alive 
        sock=urllib2.urlopen(req)
    except urllib2.HTTPError, e:        
        print 'Error code: ', e.code
        return e.code
    except Exception, detail:

        print "ERROR:", detail
        return 1
    return 0


for item in proxyList:
    if is_bad_proxy(item):
        print "Bad Proxy", item
    else:
        print item, "is working"

1 个回答

4

urllib2.install_opener() 这个函数会安装一个 全局 的打开器,也就是说它在多线程环境下不安全。所以最好不要用这个函数,而是直接调用 opener.open() 方法,而不是全局的 urllib2.urlopen() 函数。此外,建议使用 Queue 类,这个类来自 Queue 模块,用来存放你要检查的代理列表。你代码的其他部分在多线程模式下是可以正常使用的。

撰写回答