lizy169 发表于 2023-2-21 22:02

一个很少人用的功能,但非常实用

本帖最后由 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:16

本帖最后由 侃遍天下无二人 于 2023-2-21 22:17 编辑

ip格式错误是这样判断的吗?你那里出错的原因是字符和整数不能相加,而不是ip错误吧?还有为啥连怎么获取ip都没写,补上
自己花钱买注册码潜水不会被开除,乱灌水才有风险

pjy612 发表于 2023-2-23 12:13

{:301_1008:}
有时候自重试啥的。
如果语言支持的话 我选择用goto... 然后 try 外 放个 label.
在指定计数内 goto到顶部重试,catch 中 次数没超就goto, 超了就放行或者别的。
连 while 都省了...

帝玄奥懿 发表于 2023-3-26 00:40

给你一个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 池实现

lizy169 发表于 2023-2-21 22:26

侃遍天下无二人 发表于 2023-2-21 22:16
ip格式错误是这样判断的吗?你那里出错的原因是字符和整数不能相加,而不是ip错误吧?还有为啥连怎么获取ip ...

不是乱灌水啊
日常应用中,在使用其中一个I%P线路时,经常出现未知错误导致程序崩溃,
这种方式可以自动切换下一个I%P线路执行,一直循环.......

侃遍天下无二人 发表于 2023-2-21 22:55

lizy169 发表于 2023-2-21 22:26
不是乱灌水啊
日常应用中,在使用其中一个I%P线路时,经常出现未知错误导致程序崩溃,
这种方式可以自 ...

那也不对,既然经常会出问题,那正常情况下至少要形成ip池同时和多个ip建立连接吧?其他业务通过ip池取得连接和服务器通信,这些你也没写呀

YuanFang0w0 发表于 2023-2-21 22:55

这个思路挺好的 ,比如爬虫的时候,你这个IP访问过多被绊了,然后请求出错,自动切换IP再次请求咯

QingTianGG 发表于 2023-2-21 23:09

迭代器,几乎没有用过
我感觉forin可以解决呢

lizy169 发表于 2023-2-21 23:13

YuanFang0w0 发表于 2023-2-21 22:55
这个思路挺好的 ,比如爬虫的时候,你这个IP访问过多被绊了,然后请求出错,自动切换IP再次请求咯

嗯嗯,我也是遇到这个问题,才想的这个办法.........

lizy169 发表于 2023-2-21 23:32

这种方法如果遇到第一个Ip运行出错,第二个ip又连续出错,程序一样挂,谁有好的方法共享?多几个try?

不会想象的明天 发表于 2023-2-22 00:32

爬虫………额&#128531;,有点东西!

cao884 发表于 2023-2-22 00:40

不错不错,学习借鉴下
页: [1] 2 3 4
查看完整版本: 一个很少人用的功能,但非常实用