一个很少人用的功能,但非常实用
本帖最后由 lizy169 于 2023-2-24 22:33 编辑才疏学浅,习惯了潜水
再不冒泡,担心被吾爱开除
不说废话,直接上代码
抛砖引玉,有请大神献上更优雅方法
增加说明:
看了楼下童鞋的回复,可能是我说得不够明白;
以下代码在用于在某些频繁的网络操作的时候,IP经常会被屏蔽一段时间,屏蔽就中断出错,要手动重来,该思路用于IP被屏蔽后,自动循环切换IP,直到你程序自动完成不崩溃;
至于IP怎样获取,各又各的方法,这里就不说了
下面示例用的while循环,是为了各位童鞋便于理解,我实际用的是for循环;
各位童鞋可根据自己的需要编写自己的代码
我来吾爱的时候,是一张白纸,也就是小白,现在依然是小白
期望得到大神的指点,和童鞋们一起进步.......
import time
ip_list = ['ip1', 'ip2', 'ip3']
ip_iter = iter(ip_list)
IP = next(ip_iter)
while True:
try:
print(IP)
d = "a" + 1# 故意设置的出错代码
time.sleep(1)
except:
print('IP出错, 使用下一个IP地址')
if IP == ip_list[-1]:
ip_iter = iter(ip_list)
IP = next(ip_iter)
else:
IP = next(ip_iter)
print(IP)
time.sleep(1) 本帖最后由 侃遍天下无二人 于 2023-2-21 22:17 编辑
ip格式错误是这样判断的吗?你那里出错的原因是字符和整数不能相加,而不是ip错误吧?还有为啥连怎么获取ip都没写,补上
自己花钱买注册码潜水不会被开除,乱灌水才有风险 {:301_1008:}
有时候自重试啥的。
如果语言支持的话 我选择用goto... 然后 try 外 放个 label.
在指定计数内 goto到顶部重试,catch 中 次数没超就goto, 超了就放行或者别的。
连 while 都省了... 给你一个IP池参考
该实现使用 requests 库从免费代{过}{滤}理 IP 网站获取 IP 地址,并将其存储在 ip_list 中。然后,它使用多线程检查 IP 地址的可用性。每个线程从 ip_list 中获取一个 IP 地址,使用 requests 库测试该 IP 地址是否可用。如果 IP 地址可用,则将其打印出来。
要使用该实现,请创建一个 IP_Pool 对象并调用 run() 方法。该方法将启动多个线程来检查 IP 地址的可用性。在 run() 方法中,您可以更改线程数,
import requests
import threading
class IP_Pool:
def __init__(self):
self.ip_list = []# 存储 IP 地址的列表
self.lock = threading.Lock()# 线程锁,用于多线程操作时的同步
def get_ip(self):
url = 'http://www.89ip.cn/tqdl.html?api=1&num=20&port=&address=&isp='# 获取 IP 地址的网址
response = requests.get(url)# 发送 GET 请求获取网页内容
ips = response.text.split('<br>')[:-1]# 将网页内容按照 <br> 分割成 IP 地址列表
for ip in ips:
self.ip_list.append(ip)# 将 IP 地址添加到列表中
def test_ip(self, ip):
proxies = {
'http': 'http://' + ip,
'https': 'https://' + ip
}# 构造代{过}{滤}理字典
try:
response = requests.get('http://www.baidu.com', proxies=proxies, timeout=5)# 使用代{过}{滤}理访问百度网站
if response.status_code == 200:# 如果返回状态码为 200,则说明代{过}{滤}理可用
with self.lock:
print(ip + ' is available')# 打印可用的 IP 地址
except:
pass
def check_ip(self):
while True:
with self.lock:
if len(self.ip_list) == 0:# 如果 IP 地址列表为空,则退出循环
break
ip = self.ip_list.pop()# 从 IP 地址列表中取出一个 IP 地址
self.test_ip(ip)# 测试该 IP 地址是否可用
def run(self):
self.get_ip()# 获取 IP 地址列表
threads = []
for i in range(10):# 创建 10 个线程
t = threading.Thread(target=self.check_ip)# 每个线程执行 check_ip 方法
threads.append(t)
t.start()
for t in threads:
t.join()# 等待所有线程执行完毕
if __name__ == '__main__':
pool = IP_Pool()
pool.run()# 运行 IP 池实现 侃遍天下无二人 发表于 2023-2-21 22:16
ip格式错误是这样判断的吗?你那里出错的原因是字符和整数不能相加,而不是ip错误吧?还有为啥连怎么获取ip ...
不是乱灌水啊
日常应用中,在使用其中一个I%P线路时,经常出现未知错误导致程序崩溃,
这种方式可以自动切换下一个I%P线路执行,一直循环....... lizy169 发表于 2023-2-21 22:26
不是乱灌水啊
日常应用中,在使用其中一个I%P线路时,经常出现未知错误导致程序崩溃,
这种方式可以自 ...
那也不对,既然经常会出问题,那正常情况下至少要形成ip池同时和多个ip建立连接吧?其他业务通过ip池取得连接和服务器通信,这些你也没写呀 这个思路挺好的 ,比如爬虫的时候,你这个IP访问过多被绊了,然后请求出错,自动切换IP再次请求咯 迭代器,几乎没有用过
我感觉forin可以解决呢 YuanFang0w0 发表于 2023-2-21 22:55
这个思路挺好的 ,比如爬虫的时候,你这个IP访问过多被绊了,然后请求出错,自动切换IP再次请求咯
嗯嗯,我也是遇到这个问题,才想的这个办法......... 这种方法如果遇到第一个Ip运行出错,第二个ip又连续出错,程序一样挂,谁有好的方法共享?多几个try? 爬虫………额😓,有点东西! 不错不错,学习借鉴下