想要学习如何在Python Requests 爬虫脚本中正确地集成重试功能吗?那么您来对地方了,因为下面的文章将为您提供逐步指南,告诉您如何完成这个任务。

无论何时设计基于Python请求的网络爬虫的逻辑,您需要记住事情不总是按照您自己的方式进行。可能会出现的问题之一是请求失败。这可能是由于连接错误或目标阻止了您。如果发生这种情况,代码将中断并抛出异常。

尽管抛出异常并不是件坏事,但我们希望编写一个健壮的代码,甚至可以重试某些操作,直到确定在调用您之前无法继续执行为止。幸运的是,Python 的 requests 模块确实支持根据设置次数重试请求。在本指南中,我将向您展示如何利用此功能来重试在网络爬虫中失败的请求。

Python Requests重试 — 概述

Requests的设计本身就很强大,可以让您的许多工作变得更轻松。然而,它确实有一个方面,你必须从自己的角度做事。请求的设计方式没有嵌入重试功能或逻辑。

如果您需要代码重试失败的请求,则需要为此编写逻辑代码,并且在大多数情况下,您要么必须使用 urllib 中的重试对象,要么只需自己编写重试函数。对我们来说幸运的是,做到这一点并不困难,因为只需几行代码即可完成。

如何使用自定义Requests逻辑重试请求

使用 Python 请求重试Requests的最简单方法是开发您自己的自定义重试逻辑。您基本上需要做的就是有一个变量来保存您想要的尝试次数,然后在发送 Web 请求时在一定范围内循环遍历它。一旦您的请求成功,您就可以跳出 for 循环。如果没有,您将继续重试,直到达到允许的最大重试次数,然后才会引发异常。下面是如何完成此操作的示例。

import requests

NUMBER_OF_RETRIES = 5

for i in range(NUMBER_OF_RETRIES):

            try:

                        response = requests.get(“YOUR_TARGET_URL”)

                        if response.status_code in [200, 404]:

                                    break

                        except requests.exceptions.ConnectionError:

                                    pass

If response is not None and response.status_code == 200:

            print(response.content)

正如您在上面看到的,我检查状态代码,看看它是 200(成功)还是 404(页面未找到)。这是因为,在这两种情况下,都不需要重试请求。最后一个if语句是检查请求是否成功,然后执行你想要的任务。在我自己的例子中,我所做的就是将内容打印到屏幕上。

换句话说,您可以创建一个可重用的重试函数来包装 Python 的请求。以下是如何完成此操作。

import requests 

def retry_requests(url, num_of_retries=5,  **kwargs):

            for i in range(num_of_retries):

                        try:

                                    response = requests.get(url, **kwargs)

                                    if response.status_code in [200, 404]:

                                                return response

                        except requests.exception.ConnectionError:

                                    pass
            return None

x = retry_requests(“https://google.com/search”, number_of_retries=3)

print(x,content)

如何使用会话和 HTTPAdapter 重试Requests

将 Requests逻辑集成到代码中的另一种方法是使用会话和 HTTPAdapter。与上面那样自己创建逻辑相比,这要复杂一些。但是,如果您经常使用 Requests.Session 对象,那么没有比使用它来重试文件请求更好的选择了。我们先看一下代码,然后再解释。

import requests

from requests.adapters import HTTPAdapter

from requests.packages.urllib3.util.retry import Retry

s = requests.Session()

retries = Retry(total=5, status_forcelist=[429, 500, 502, 503, 504])

s.mount('http://', HTTPAdapter(max_retries=retries))

x = s.get(TARGET_URL)

如上所示,代码依赖于请求模块中的 HTTPAdapter 和 Session 类以及 Retry 对象。


关于 Python Requests重试的常见问题解答

问:Python 请求是否支持开箱即用?

Python 的Requests确实支持开箱即用的重试。但对于大多数初学者来说并不明显。如果您检查上面的最后一个代码,您将看到请求模块中存在重试功能。然而,它的用法是相当先进的。如果您觉得难以理解,您仍然可以创建自己理解的重试函数,以便更好地理解脚本的逻辑。

问:为什么 Python 请求失败?

请求失败与 Python Requests无关。一旦您尝试访问远程资源,许多事情可能会出错,从而导致您的请求失败。您访问的 URL 可能需要很长时间才能响应,直到超时,甚至您的连接也无法建立。在其他一些情况下,从请求发送的方式来看,它可能只是一个错误请求。

问:Python Requests擅长处理重试吗?

是的,Python request 擅长处理重试,只要您指示它这样做。如前所述,它确实支持这一点,这就是处理重试的第二种方法中讨论的内容。对于第一种方法,您不依赖于请求的支持,而是编写自己的逻辑,以防止脚本在请求失败时抛出异常,但首先重试多次。


结    论

将代码重试请求使您的代码更加健壮,并保护它免受偶发性故障的影响,这些故障并不是导致代码崩溃的真正原因。我经常进行网络爬虫操作,由于所在地区的网络状况较差,您的脚本可能会因为低网络连接而中断。但通过重试功能的帮助,直到出现需要我的注意力解决的真正问题之前,我都不必干预。

这篇文章有用吗?

点击星号为它评分!

平均评分 / 5. 投票数:

到目前为止还没有投票!成为第一位评论此文章。

No more articles