如何在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




