可以在 Try/Except 中重试/循环吗?

2024-01-12

我试图了解是否可以在 Try/Except 调用内部设置循环,或者是否需要重构以使用函数。长话短说,在花了几个小时学习 Python 和 BeautifulSoup 后,我设法将一些代码组合在一起来抓取 URL 列表,将数据提取到 CSV(现在将其更新到 MySQL 数据库)。代码现在按计划工作,除了我偶尔会遇到 10054,要么是因为我的 VPN 打嗝,要么可能是源主机服务器偶尔会拒绝我(我的循环中有 30 秒的延迟,但有时它仍然会困扰我) )。

我了解了 Try/Except 结构的一般概念,但我不太确定我将如何(或者如果可以)在其中循环以重试。我用于获取 URL、清理它并解析我需要的表的基本代码如下所示:

for url in contents:
    print('Processing record', (num+1), 'of', len(contents))
    if url:
        print('Retrieving data from ', url[0])
        html = requests.get(url[0]).text
        soup = BeautifulSoup(html, 'html.parser')
        for span in soup('span'):
            span.decompose()
       trs = soup.select('div#collapseOne tr')
        if trs:
            print('Processing')
            for t in trs:
                for header, value in zip(t.select('td')[0], t.select('td:nth-child(2)')):
                    if num == 0:
                        headers.append(' '.join(header.split()))    
                    values.append(re.sub(' +', ' ', value.get_text(' ', strip=True)))  

之后只需将数据处理为 CSV 并运行更新 sql 语句。

我想做的是,如果 HTML 请求调用失败,请等待 30 秒,再次尝试请求,然后处理,或者如果重试失败 X 次,则继续并退出脚本(假设此时我已经完全连接失败)。

是否可以在线执行类似的操作,或者我需要将请求语句放入函数中并设置一个循环来调用它?必须承认我还不熟悉 Python 如何处理函数返回。


您可以为重试添加一个内部循环,并将 try/ except 块放入其中。这是它的外观草图。您可以将所有这些放入一个函数中,并将该函数调用放入其自己的 try/ except 块中,以捕获导致循环退出的其他错误。

看着请求异常层次结构 https://requests.readthedocs.io/en/master/_modules/requests/exceptions/,超时涵盖了多个可恢复的异常,对于您可能想要捕获的所有内容来说,这是一个良好的开始。其他问题(例如 SSLError)不会因为重试而变得更好,因此请跳过它们。您可以浏览该列表,看看什么对您来说是合理的。

import itertools

# requests exceptions at 
# https://requests.readthedocs.io/en/master/_modules/requests/exceptions/
    
for url in contents:
    print('Processing record', (num+1), 'of', len(contents))
    if url:
        print('Retrieving data from ', url[0])
        retry_count = itertools.count()
        # loop for retries
        while True:
            try:
                # get with timeout and convert http errors to exceptions
                resp = requests.get(url[0], timeout=10)
                resp.raise_for_status()
            # the things you want to recover from
            except requests.Timeout as e:
                if next(retry_count) <= 5:
                    print("timeout, wait and retry:", e)
                    time.sleep(30)
                    continue
                else:
                    print("timeout, exiting")
                    raise # reraise exception to exit
            except Exception as e:
                print("unrecoverable error", e)
                raise
            break

        html = resp.text
        etc…
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可以在 Try/Except 中重试/循环吗? 的相关文章

随机推荐

  • React-Native-Styled-Components:类型“DefaultTheme”上不存在属性“backgroundColor”

    我正在为我的应用程序使用react native Typescript 我的样式组件版本是 styled components 5 3 0 我已经创建了自定义ThemeProvider并包装到我的根应用程序 我的应用程序有切换深色主题 我的
  • 如何使用 IBM Bluemix Track & Plan 管理多个组件

    我们有一个由多个不同组件 不同功能 语言 组成的应用程序 在 IBM Bluemix 中是否可以使用单个 Track Plan 功能来管理组件的工作项 但将源代码保留在单独的 git 存储库中 例如 我希望整个应用程序有一个积压工作 然后由
  • 如何通过 FTP 访问我的 Azure 应用服务文件? wwwroot 目录为空

    使用 Azure 门户中应用服务页面导航上的部署中心链接 我能够找到我的 FTP 凭据并使用它们轻松登录 但是 wwwroot 文件夹中除了hostingstart html 之外没有任何文件 但是 当我使用 Azure 控制台时 我的所有
  • Android NDK 无法使用两个 gradle 插件调试本机代码

    我使用 NDK 和实验性 gradle 插件 最初我能够调试我的本机代码 然后我看到了这个问题https github com googlesamples android ndk issues 119 https github com go
  • 如何在Android文件系统上模拟文件的“tail”命令?

    我的 SD 卡上有文件 我的应用程序使用它作为日志文件 是否可以通过 adb 实时监视文件的所有更改 喜欢与tail f sdcard myfile log命令 这似乎对我很有用 adb shell while true do cat sl
  • 如何使用OKHTTP发出post请求?

    我读了一些将 json 发布到服务器的示例 有人说 OkHttp 是 HttpUrlConnection 接口的实现 由Java提供 它提供了一个用于写入内容的输入流 不知道 或关心 该内容是什么格式 现在我想使用名称和密码参数向 URL
  • 提取 Objective-c 二进制文件

    是否可以提取二进制文件 获取二进制文件背后的代码 使用类转储 您可以看到实现地址 但是是否也可以看到实现地址中的代码 有什么办法可以做到吗 您的所有代码都会编译为单个指令 并放置在可执行文件的文本部分中 编译器负责将高级语言转换为更简单的处
  • 简单的、结构类型的 XML 数据绑定(无需代码生成或反射)

    我正在寻找一个 Java 库 它允许我将 XML 编组到 Java 对象树 反之亦然 有很多库可以让我将 XML 绑定到JavaBeans由某些代码生成工具生成 但是 我不需要这些 JAXB JiBX Castor 等 我需要的是一个工具
  • 如何做 pd.get_dummies 或其他方式?

    实际上 我的问题是基于 是否有更快的方法根据条件更新数据框列值 https stackoverflow com questions 46678400 is there a faster way to update dataframe col
  • WCF 数据服务支持的 Linq

    我正在寻找与 WCF 数据服务兼容的受支持 linq 扩展方法的完整列表 通过反复试验 我发现 First Func 和 Single Func 不受支持 还有其他吗 This http msdn microsoft com en us l
  • Java - 如何检查字符串中的重复字符?

    我需要编写一个函数来检查字符串中是否有重复值并返回唯一字符的计数 如果计数大于 3 则应返回 true 如果计数小于 3 则应该为 false 这是我一直在尝试的 注意我是java新手 private boolean isFormatVal
  • SSE (SIMD):向量乘标量

    我在程序中执行的常见操作是按标量缩放向量 V s 例如 1 2 3 4 2 2 4 6 8 除了首先在向量中的每个位置加载标量 例如 mm set ps 2 2 2 2 然后相乘之外 是否有 SSE 或 AVX 指令可以执行此操作 这就是我
  • 如何从 UIView 创建 CGLayer 进行离屏绘图

    我已经阅读了我认为是 Quartz 2D 编程指南的相关部分 但找不到以下内容的答案 他们似乎在文档中没有过多谈论 iOS 我的应用程序在UIView 我时不时地必须以某种方式更新绘图 例如更改其中一个形状的填充颜色 我保留CGPathRe
  • 访问列表视图中的自定义对象

    我目前正在构建一个应用程序 该应用程序将请求发送到网络 然后解析结果并将其放入对象的 ArrayList 中 然后 该列表将填充 ListView 我想创建一个onClickListener这将使我知道单击了哪个对象 但我找不到实现此目的的
  • 如何访问 Sharepoint 2007/2010/2013 _layouts 文件夹

    我正在尝试在该位置插入一些数据 mysiteurl layouts 因为我必须使用第三方软件 该软件使用该文件夹中存储的数据 我是机器的管理员 Windows Server 2008R2 上的 Sharepoint 2010 但 Share
  • ActiveMQ - 通过命令行删除/清除所有队列

    有没有办法通过命令行 win linux 删除 清除ActiveMQ中的所有队列 我只能找到特定队列的命令 或者也许有办法通过 activeMQ 管理员来做到这一点 同样 我只找到了如何一一删除 清除队列 这可能非常乏味 Thanks 你可
  • gitlab.com SSH 连接超时

    我尝试让 Gitlab 与 SSH 一起工作 但不行 我已完成以下步骤 1 生成ssh密钥 ssh keygen t rsa C email protected cdn cgi l email protection b 4096 2 在文件
  • WPF DataGrid 虚拟化无法正常工作?

    我有一个 DataGrid 其中有一个 DataTable 设置为其 ItemsSource DataTable 包含 24 列和约 1600 行 实际上我稍后必须加载更多行 但目前这已经够麻烦的了 尽管将列和行的虚拟化设置为活动状态 Da
  • 使用 libwebsockets 编译 libuv

    我正在尝试运行与 LWS 库一起安装的 libwebsockets test server 但它不会运行 因为 lwsts 31616 libuv support not generated in 我检查过 libuv 已安装 1 8 0
  • 可以在 Try/Except 中重试/循环吗?

    我试图了解是否可以在 Try Except 调用内部设置循环 或者是否需要重构以使用函数 长话短说 在花了几个小时学习 Python 和 BeautifulSoup 后 我设法将一些代码组合在一起来抓取 URL 列表 将数据提取到 CSV