You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:32:30