python

python go爬虫如何进行网络请求重试

小樊
83
2024-12-10 17:40:05
栏目: 编程语言

在Python中,如果你使用requests库进行网络请求,你可以使用第三方库tenacity来实现重试机制。首先,你需要安装tenacity库:

pip install tenacity

接下来,你可以使用tenacity库来实现网络请求的重试。以下是一个简单的示例:

import requests
from tenacity import retry, stop_after_attempt, wait_exponential

@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
def fetch_url(url):
    response = requests.get(url)
    if response.status_code == 200:
        return response.text
    else:
        raise Exception(f"请求失败,状态码:{response.status_code}")

url = "https://example.com"
try:
    content = fetch_url(url)
    print(content)
except Exception as e:
    print(e)

在这个示例中,我们使用@retry装饰器来定义重试策略。stop_after_attempt(3)表示在尝试3次后停止重试,wait=wait_exponential(multiplier=1, min=4, max=10)表示每次重试之间的等待时间按指数增长,范围在4秒到10秒之间。

如果你使用的是go语言,你可以使用github.com/avast/retry-go库来实现重试机制。首先,你需要安装retry-go库:

go get github.com/avast/retry-go

接下来,你可以使用retry-go库来实现网络请求的重试。以下是一个简单的示例:

package main

import (
	"fmt"
	"net/http"
	"time"

	"github.com/avast/retry-go"
)

func fetchURL(url string) (string, error) {
	resp, err := http.Get(url)
	if err != nil {
		return "", err
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		return "", fmt.Errorf("请求失败,状态码:%d", resp.StatusCode)
	}

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return "", err
	}

	return string(body), nil
}

func main() {
	url := "https://example.com"

	err := retry.Do(
		func() error {
			content, err := fetchURL(url)
			if err != nil {
				return err
			}
			fmt.Println(content)
			return nil
		},
		retry.Attempts(3),
		retry.Delay(time.Second),
		retry.OnRetry(func(n uint, err error) {
			fmt.Printf("重试次数:%d,错误:%v\n", n, err)
		}),
	)

	if err != nil {
		fmt.Println("重试失败:", err)
	}
}

在这个示例中,我们使用retry.Do函数来实现重试机制。retry.Attempts(3)表示在尝试3次后停止重试,retry.Delay(time.Second)表示每次重试之间的等待时间为1秒,retry.OnRetry用于在每次重试时执行自定义操作。

0
看了该问题的人还看了