python中的代理检查
我已经用python编写了一个使用cookies和POST/GET的脚本。我的脚本中还包含了代理支持。但是,当输入一个死代理时,脚本崩溃。在运行脚本的其余部分之前,是否有任何方法可以检查代理是否处于死/活状态python中的代理检查,python,http,proxy,Python,Http,Proxy,我已经用python编写了一个使用cookies和POST/GET的脚本。我的脚本中还包含了代理支持。但是,当输入一个死代理时,脚本崩溃。在运行脚本的其余部分之前,是否有任何方法可以检查代理是否处于死/活状态 此外,我注意到一些代理不能正确处理cookie/POST头。有没有办法解决这个问题?最简单的方法是从urllib捕获IOError异常: try: urllib.urlopen( "http://example.com", proxies={'htt
此外,我注意到一些代理不能正确处理cookie/POST头。有没有办法解决这个问题?最简单的方法是从urllib捕获IOError异常:
try:
urllib.urlopen(
"http://example.com",
proxies={'http':'http://example.com:8080'}
)
except IOError:
print "Connection error! (Check proxy)"
else:
print "All was fine"
此外,来自(略有改进):
用于python 2
import urllib2
import socket
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.example.com') # change the URL to test here
sock=urllib2.urlopen(req)
except urllib2.HTTPError, e:
print 'Error code: ', e.code
return e.code
except Exception, detail:
print "ERROR:", detail
return True
return False
def main():
socket.setdefaulttimeout(120)
# two sample proxy IPs
proxyList = ['125.76.226.9:80', '213.55.87.162:6588']
for currentProxy in proxyList:
if is_bad_proxy(currentProxy):
print "Bad Proxy %s" % (currentProxy)
else:
print "%s is working" % (currentProxy)
if __name__ == '__main__':
main()
用于python 3
import urllib.request
import socket
import urllib.error
def is_bad_proxy(pip):
try:
proxy_handler = urllib.request.ProxyHandler({'http': pip})
opener = urllib.request.build_opener(proxy_handler)
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
urllib.request.install_opener(opener)
req=urllib.request.Request('http://www.example.com') # change the URL to test here
sock=urllib.request.urlopen(req)
except urllib.error.HTTPError as e:
print('Error code: ', e.code)
return e.code
except Exception as detail:
print("ERROR:", detail)
return True
return False
def main():
socket.setdefaulttimeout(120)
# two sample proxy IPs
proxyList = ['125.76.226.9:80', '25.176.126.9:80']
for currentProxy in proxyList:
if is_bad_proxy(currentProxy):
print("Bad Proxy %s" % (currentProxy))
else:
print("%s is working" % (currentProxy))
if __name__ == '__main__':
main()
请记住,如果代理关闭(因为您将不得不等待两次连接超时),则脚本所用的时间可能会加倍。。除非您必须明确知道代理出错,否则处理IOError会更干净、更简单、更快速。我认为更好的方法就像dbr所说的那样,处理异常 在某些情况下,另一个更好的解决方案是使用外部工具检查代理服务器是否处于活动状态,然后继续使用脚本而不进行任何修改。有一个很好的包 因此,如果您觉得合适,可以编写如下内容(简单有效的代理检查器生成器):
您可以使用代理检查器库,它就这么简单
from proxy_checker import ProxyChecker
checker = ProxyChecker()
checker.check_proxy('<ip>:<port>')
有可能生成您自己的代理并用两行代码检查它们,但有些代理可以连接到url,但它们无法从该url打开实际的html,它们显示自定义错误,因此您无法捕获异常,最好在req.read()中检查字符串?socket.setdefaulttimeout()与
urllib
参数timeout
之间有什么区别?@macdonjo非常确定urllib timeout参数在Python 3中是新的。它可能比socket.setdefaulttimeout要好得多,后者应用于全局。用这段代码检查无效代理似乎需要很长时间(1分钟++)。你不能捕获异常吗?我认为捕获异常不是最好的方法,请检查我在dbr答案中留下的注释。你能告诉我你的意见吗?因为我计划自己编写一个代理检查器(我刚开始使用python,这将是我的第二个python脚本)
from proxy_checker import ProxyChecker
checker = ProxyChecker()
checker.check_proxy('<ip>:<port>')
{
"country": "United States",
"country_code": "US",
"protocols": [
"socks4",
"socks5"
],
"anonymity": "Elite",
"timeout": 1649
}