You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在Python循环中设置请求超时并解决ReadTimeout报错?

解决Python循环中请求超时问题并优化站点检测代码

嘿,我来帮你搞定这个超时问题,顺便给你的代码做些小优化,让它更健壮~

核心问题分析

你遇到的requests.exceptions.ReadTimeout是因为当前代码只处理了ConnectionError,但没有捕获读取超时的异常,而且默认情况下requests不会自动超时,会一直等待响应,这就导致程序卡住。

解决方案步骤

1. 设置请求超时时间

requests.get()方法支持timeout参数,你可以指定一个数值(比如10,表示连接和读取超时都用10秒),或者用元组分别设置连接超时和读取超时:timeout=(5, 10)(5秒内没建立连接就超时,10秒内没拿到响应就超时)。

2. 捕获ReadTimeout异常

需要导入requests.exceptions.ReadTimeout,并在try-except块中捕获它,把超时的站点归类到“不存在/无法访问”的列表里。

3. 代码优化点

  • 不要用Python关键字list作为变量名,改成websites这类更清晰的名字
  • 避免在循环里反复打开/关闭文件,最好用with语句一次性处理,减少IO开销
  • 修正计数变量的错误:g=+1是赋值为1,应该用g +=1来实现累加
  • 修复拼写错误:liste[i]应该是websites[i]

修改后的完整代码

import requests
from requests.exceptions import ConnectionError, ReadTimeout

# 读取网站列表,避免用list作为变量名
with open("list_website.txt") as infile:
    websites = [site.strip() for site in infile]

working_sites = []
non_working_sites = []
working_count = 0
non_working_count = 0

# 提前打开文件,避免循环内重复IO操作
with open('works.txt', 'a') as works_file, open('not_working.txt', 'a') as not_works_file:
    for site in websites:
        try:
            # 设置超时时间,这里用10秒,你可以根据需求调整
            response = requests.get(f'http://www.{site}.de', timeout=10)
            # 可选:可以检查响应状态码,比如200才算成功(避免把返回404的站点算成可访问)
            # if response.status_code == 200:
            working_sites.append(site)
            working_count += 1
            works_file.write(f"{site}\n")
        except (ConnectionError, ReadTimeout) as e:
            non_working_sites.append(site)
            non_working_count += 1
            not_works_file.write(f"{site}\n")
            # 可选:打印错误信息方便调试
            # print(f"站点 {site} 访问失败: {str(e)}")

print("可访问站点:", working_sites)
print("不可访问站点:", non_working_sites)
print(f"统计:可访问{working_count}个,不可访问{non_working_count}个")

代码说明

  • timeout=10:设置请求的总超时时间为10秒,超过这个时间就触发ReadTimeout异常
  • 同时捕获ConnectionError(连接失败)和ReadTimeout(读取超时),把这两种情况都归为不可访问站点
  • with语句管理文件,自动处理文件的打开和关闭,更安全高效
  • 用f-string拼接URL和写入内容,代码更简洁易读
  • 可选的状态码检查:如果需要严格判断站点是否正常服务,还可以加上response.status_code == 200的判断,避免把返回404/500的站点误判为可访问

这样修改后,你的程序就不会因为某些站点超时而卡住,而且代码结构更清晰健壮啦~

内容的提问来源于stack exchange,提问作者user11914084

火山引擎 最新活动