2

ニュース記事をスクレイピングし、urllib2 を使用しています。リダイレクトを自動的に処理し、geturl() を使用して応答から解決された URL を取得できます。

しかし、解決された URL が特定のリストにある場合は、リクエストを停止して、ページのダウンロードに時間と帯域幅を費やさないようにしたいと考えています。

これらの質問のいずれかに対する回答で十分です

ページをダウンロードしますかurllib.opener.open()、それとも に電話したときにダウンロードしますresponse.read()か?

urllib2リダイレクトを解決するためだけに依頼する方法はありますか?

4

1 に答える 1

1

いくつかの簡単で汚い実験の後、私はあなたの質問に対する部分的な答えを見つけたと言えると思います. どちらもデフォルトで同じように動作しますopener.open()urlopen()関数を介してしか出力を読み取ることができない場合でも、リダイレクト先のページをダウンロードしますread()

ただし、 に渡される独自のハンドラを使用して、これらのデフォルトをオーバーライドできますbuild_opener()。たとえば、一部の URL へのリダイレクトを失敗させるには、HTTPRedirectHandlerをサブクラス化することで、これと同様のことを行うことができます。

class MyRedirectHandler(urllib2.HTTPRedirectHandler):
    def http_error_302(self, req, fp, code, msg, hdrs):
        if fp.geturl().startswith('http://www.facebook.com/'):
            # This will raise an exception similar to this:
            # urllib2.HTTPError: HTTP Error 302: FOUND
            return None
        else:
            # Let the default handling occur
            return super(MyRedirectHandler, self).http_error_302(req, fp, code, msg, hdrs)

次のように使用します。

opener = urllib2.build_handler(MyRedirectHandler)
try:
    fp = opener.open(url)
except urllib2.HTTPError:
    content = None
    print 'This URL is not allowed or something'
else:
    content = fp.read()

もちろん、その例外をキャッチするには、呼び出しブロックを try/except ブロックに含める必要があります。これを克服し、ハンドリングをより良くする方法があるのではないかと思いますが、よくわかりません。

とにかく、詳細についてはこちらのドキュメントを確認してください。

それが役に立てば幸い。

編集

redirect_request実際には、 (302 だけでなく) 他のリダイレクト コードもカバーするものをオーバーライドしたい場合があります。thisによると、それが進むべき道です。

于 2012-09-18T20:31:57.700 に答える