2

次のコードを使用してリダイレクトを解決し、リンクの最終 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 ブロックに例外があるとどうなるでしょうか。

4

3 に答える 3

4

再試行する前に、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

于 2015-07-29T18:14:22.873 に答える
1

これは例外を処理するための優れた方法ですが、特定の Web サイトの要求の間に適切な時間、常にスリープしていることを確認する必要があります (たとえば、twitter は 1 分あたりの要求の量を制限し、この量を明確に示しています)。 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 が指摘するように、2 番目のエラー ケースでは URL を返す必要があります。投稿したコードは、入れ子になった try/catch の記述方法の単なる参考例です。

于 2015-07-29T17:29:17.647 に答える
0

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)
于 2021-09-14T00:32:09.457 に答える