Python脚本WiFi断开时能否暂停?爬虫需逐行加try-except还是自动重试?
针对你的爬虫脚本问题的实用解决方案
我来帮你逐个拆解这两个爬虫脚本里的常见问题:
问题一:能否让脚本在WiFi断开时暂停?
其实更高效的思路是针对网络请求失败的场景处理(毕竟WiFi断开最终会导致网络请求失败),不过如果你想主动检测WiFi状态来暂停脚本,也有可行方案:
方案1:主动检测WiFi连接状态(分系统)
不同操作系统的检测命令不同,你可以写一个简单函数定期检查:
- Windows系统:
import subprocess import time def is_wifi_connected(): # 执行系统命令获取WiFi状态,适配中文系统编码 result = subprocess.run( ["netsh", "wlan", "show", "interfaces"], capture_output=True, text=True, encoding="gbk" ) return "已连接" in result.stdout # 在脚本关键节点(比如每次网络请求前)检测并暂停 while not is_wifi_connected(): print("WiFi已断开,暂停脚本等待连接恢复...") time.sleep(10)
- Linux/macOS系统:
import subprocess import time def is_wifi_connected(): try: # macOS 检测逻辑 result = subprocess.run( ["networksetup", "-getairportnetwork", "en0"], capture_output=True, text=True ) return "Current Wi-Fi Network:" in result.stdout except FileNotFoundError: # Linux 检测逻辑 result = subprocess.run(["iwconfig"], capture_output=True, text=True) return "ESSID:" in result.stdout and not "off/any" in result.stdout # 检测并暂停脚本 while not is_wifi_connected(): print("WiFi已断开,暂停脚本等待连接恢复...") time.sleep(10)
方案2:结合网络请求重试(更通用)
其实不用单独检测WiFi,直接在网络请求失败时自动等待重试,本质上就是让脚本在WiFi断开时暂停等待——这也是我更推荐的方式,因为它能覆盖所有网络异常(比如服务器超时、DNS解析失败等),后面会结合第二个问题详细说明。
问题二:避免重复写try-except,实现自动重试
完全不需要在每一行网络请求代码外都包裹try-except!你可以用装饰器或通用重试函数,把所有网络请求逻辑封装起来,一次定义,多处复用:
方案1:自定义重试装饰器
写一个装饰器,给所有网络请求函数自动添加重试逻辑:
import time import urllib2 def retry_on_network_failure(max_retries=3, delay=10): """给网络请求函数添加自动重试逻辑的装饰器""" def decorator(func): def wrapper(*args, **kwargs): retries = 0 while retries < max_retries: try: # 执行原网络请求函数 return func(*args, **kwargs) except urllib2.URLError as e: print(f"网络请求失败: {str(e)},{delay}秒后重试(剩余{max_retries - retries -1}次)") time.sleep(delay) retries += 1 # 重试多次仍失败时抛出异常或自定义处理 raise Exception(f"经过{max_retries}次重试后仍无法完成请求,请检查网络或目标网站状态") return wrapper return decorator # 用装饰器装饰你的网络请求函数 @retry_on_network_failure(max_retries=5, delay=10) def fetch_website_content(url): response = urllib2.urlopen(url) return response.read() @retry_on_network_failure() def submit_data(url, data): req = urllib2.Request(url, data=data) response = urllib2.urlopen(req) return response.read() # 调用时直接使用,无需关心重试逻辑 page_content = fetch_website_content("http://target-site.com/page1") submit_result = submit_data("http://target-site.com/submit", b"key=value")
这样不管你有多少个网络请求函数,只需要加一行装饰器就行,代码瞬间清爽很多。
方案2:使用第三方库(更省心)
如果允许引入第三方库,tenacity是专门处理重试逻辑的工具,用法更灵活:
from tenacity import retry, stop_after_attempt, wait_fixed, retry_if_exception_type import urllib2 # 给函数添加重试规则:最多重试3次,每次间隔10秒,仅在URLError时重试 @retry( stop=stop_after_attempt(3), wait=wait_fixed(10), retry=retry_if_exception_type(urllib2.URLError) ) def fetch_page(url): return urllib2.urlopen(url).read()
核心思路
把所有和网站交互的逻辑封装成单独的函数,然后用重试机制包裹这些函数,而不是在零散代码行上逐个加try-except——这样既符合代码复用原则,也能统一管理重试规则(比如调整延迟时间、重试次数)。
内容的提问来源于stack exchange,提问作者user1551817
相关产品推荐
相关产品推荐

