簡體   English   中英

帶有 urllib2 的 Python HTTP 錯誤 429

[英]Python HTTP Error 429 with urllib2

我正在使用以下代碼來解決重定向以返回鏈接最終 url

def resolve_redirects(url):
    return urllib2.urlopen(url).geturl()

不幸的是,我有時會收到HTTPError: HTTP Error 429: Too Many Requests 有什么好的方法可以解決這個問題? 以下是好的還是有更好的方法。

def resolve_redirects(url):
    try:
        return urllib2.urlopen(url).geturl()
    except HTTPError:
        time.sleep(5)
        return urllib2.urlopen(url).geturl()

另外,如果except塊中出現異常會發生什么?

最好在重試之前確保HTTP代碼實際上是429。

可以這樣完成:

def resolve_redirects(url):
    try:
        return urllib2.urlopen(url).geturl()
    except HTTPError, e:
        if e.code == 429:
             time.sleep(5);
             return resolve_redirects(url)
        raise

這還將允許任意數量的重試(可能需要也可能不需要)。

https://docs.python.org/2/howto/urllib2.html#httperror

這是處理異常的一種好方法,盡管您應該檢查以確保在給定網站的請求之間始終保持適當的睡眠時間(例如,twitter限制了每分鍾的請求數量,並清楚地顯示了該數量。在他們的api文檔中)。 因此,請確保您始終睡足夠長的時間。

要從異常中恢復,您可以簡單地嵌入另一個try / catch塊:

def resolve_redirects(url):
    try:
        return urllib2.urlopen(url).geturl()
    except HTTPError:
        time.sleep(5)
        try:
            return urllib2.urlopen(url).geturl()
        except HTTPError:
            return "Failed twice :S"

編輯:正如@ jesse-w-at-z指出的那樣,在第二種錯誤情況下,您應該返回一個URL,我發布的代碼只是如何編寫嵌套try / catch的參考示例。

將 User-Agent 添加到請求標頭解決了我的問題:

from urllib import request
from urllib.request import urlopen

url = 'https://www.example.com/abc.json'
req = request.Request(url)
req.add_header('User-Agent', 'abc-bot')
response = request.urlopen(req)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM