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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:57:39