Skip to content
本页目录

python,检测代理ip是否有效

测试环境

  • python3.6 、window10系统

测试方法

第一种

  • 使用requests模块。
  • 使用requests.get() 发请求,根据其返回的网页内容进行判断,代理ip是否有效。
python
import requests

proxies = {'http': '120.236.128.201:8060',
           'https': '120.236.128.201:8060'
           }
url = "http://www.baidu.com/"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
try:
    response = requests.get(url, headers=headers, proxies=proxies, timeout=5)
    print(response.text)
except Exception as e:
    print(f"请求失败,代理IP无效!{e}")
else:
    print("请求成功,代理IP有效!")
  • 缺点:虽然可以检测代理ip是否有效,但是该方法只能用于检测少量的代理ip,原因是该方法检测速度比较慢,主要耗时的是发请求这一过程。(可以使用)

第二种

  • telnet 方法。
python
import telnetlib
try:
    telnetlib.Telnet(ip, port, timeout=3)
    print("代理IP有效!")
except:
        print("代理IP无效!")
  • 缺点:虽然该方法可以比较快速的验证,但是经测试发现一些代理ip可以测试通过,但实际上代理ip仍然无效。(不推荐使用)

第三种

  • 利用的http://icanhazip.com/返回的IP进行校验,如返回的是代理池的IP,说明代理有效,否则实际代理无效
python
def check_proxy(ip, port):
    """第二种:"""
    try:
        # 设置重连次数
        requests.adapters.DEFAULT_RETRIES = 3
        # IP = random.choice(IPAgents)
        proxy = f"http://{ip}:{port}"
        # thisIP = "".join(IP.split(":")[0:1])
        # print(thisIP)
        res = requests.get(url="http://icanhazip.com/", timeout=2, proxies={"http": proxy})
        proxyIP = res.text
        if (proxyIP == proxy):
            print("代理IP:'" + proxyIP + "'有效!")
            return True
        else:
            print("2代理IP无效!")
            return False
    except:
        print("1代理IP无效!")
        return False
  • 推荐使用。

httpbin.org 这个网站能测试 HTTP 请求和响应的各种信息,比如 cookie、ip、headers 和登录验证等,且支持 GET、POST 等多种方法,对 web 开发和测试很有帮助。
它用 Python + Flask 编写,是一个开源项目。
官方网站
开源地址
今天使用的是它的ip检测功能,能够返回本机ip
ip检测

python
import requests,sys

ip_port = '222.74.202.233:80'
#ip_port为空时只返回本机ip,为代理ip时返回本机ip和代理ip
proxies = {
'http': ip_port,
 'https': ip_port
 }
 #ip检测网址
url="http://httpbin.org/ip"
header={'User-Agent':'Mozilla/5.0'}
if not ip_port:
print('ip_port不能为空')
sys.exit(0)
try:
response=requests.get(url,headers=header,proxies=proxies,timeout=5)
print(response)
html = response.text
print(html)
except :
print("超时")