Windows下如何实现网站请求10秒超时自动跳过
解决请求超时跳过的方案
核心问题分析
你之前的timeout_decorator用法错误(它需要装饰函数而非直接写一行),且SIGALRM不支持Windows。最可靠的跨平台方案是直接使用requests库自带的timeout参数,这是官方推荐的超时控制方式。
修改后的代码实现
import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry import pandas as pd def get_the_text(_df): ''' 发送请求获取文章文本 Parameters ---------- _df : DataFrame Returns ------- 包含文章文本的DataFrame ''' # 复制传入的DataFrame避免修改原数据 df = _df.copy() df['text'] = '' # 全局创建一次session,复用连接提升效率 session = requests.Session() retry = Retry(connect=2, backoff_factor=0.3) adapter = HTTPAdapter(max_retries=retry) session.mount('http://', adapter) session.mount('https://', adapter) for k, link in enumerate(df['url']): if not link: continue print(f"处理链接: {link}\n序号: {k}") try: # 设置总超时10秒,也可以拆分连接/读取超时:timeout=(3, 10) response = session.get(link, timeout=10) response.raise_for_status() # 触发HTTP错误状态码的异常 # 这里添加提取文本的逻辑,示例: # from bs4 import BeautifulSoup # soup = BeautifulSoup(response.text, 'html.parser') # df.loc[k, 'text'] = soup.get_text(strip=True) except requests.exceptions.Timeout: print(f"链接 {link} 超时,跳过") continue except requests.exceptions.ConnectionError: print(f"链接 {link} 连接错误,跳过") except requests.exceptions.HTTPError as e: print(f"链接 {link} 返回错误状态码: {e},跳过") except Exception as e: print(f"链接 {link} 处理出错: {str(e)},跳过") return df
关键改动说明
- 复用Session:将
Session创建移到循环外,避免重复建立连接,提升爬取效率。 - 原生Timeout参数:
session.get(link, timeout=10)直接设置总超时10秒,跨平台兼容Windows。若需更精细控制,可拆分为timeout=(连接超时秒数, 读取超时秒数),比如timeout=(3,10)表示3秒内未建立连接则超时,10秒内未获取响应内容则超时。 - 异常捕获修正:捕获
requests库抛出的requests.exceptions.Timeout而非通用TimeoutError,确保精准捕获请求超时场景。 - 添加HTTP错误处理:用
response.raise_for_status()触发4xx/5xx状态码的异常,避免无效响应后续处理出错。
额外优化建议
如果250+链接爬取效率低,可以考虑用concurrent.futures.ThreadPoolExecutor实现多线程爬取,进一步减少总耗时,但需注意控制并发数避免被目标网站封禁。
内容的提问来源于stack exchange,提问作者Mostafa Bouzari
相关产品推荐
相关产品推荐

