2

特定の URL について、Python を使用して最終ページ (HEAD リクエストなど) をダウンロードせずに、HTTP リダイレクト後に最終的なインターネットの場所を検出するにはどうすればよいですか。大量ダウンローダーを作成しようとしています。ダウンロード メカニズムは、ダウンロードする前にページのインターネット上の場所を知る必要があります。

編集

私はこれをやったので、これが他の人に役立つことを願っています。私はまだ他の方法を受け入れています。

import urlparse
import httplib

def getFinalUrl(url):
    "Navigates Through redirections to get final url."
    parsed = urlparse.urlparse(url)
    conn = httplib.HTTPConnection(parsed.netloc)
    conn.request("HEAD",parsed.path)
    response = conn.getresponse()
    if str(response.status).startswith("3"):
        new_location = [v for k,v in response.getheaders() if k == "location"][0]
        return getFinalUrl(new_location)
    return url
4

3 に答える 3

1

requests ライブラリを使用することを強くお勧めします。それは適切にコーディングされ、積極的に維持されています。リクエストは、プリフェッチ/など、必要なものを何でも作成できます

Requests のドキュメントhttp://docs.python-requests.org/en/latest/user/advanced/から:

デフォルトでは、リクエストを行うと、レスポンスの本文がすぐにダウンロードされます。prefetch パラメータを使用して Response.content 属性にアクセスするまで、この動作をオーバーライドして、レスポンス本文のダウンロードを遅らせることができます。

tarball_url = 'https://github.com/kennethreitz/requests/tarball/master'
r = requests.get(tarball_url, prefetch=False)

この時点では、応答ヘッダーのみがダウンロードされ、接続は開いたままなので、コンテンツの取得を条件付きにすることができます。

if int(r.headers['content-length']) < TOO_LONG:
  content = r.content
  ...

Response.iter_contentおよび Response.iter_lines メソッドを使用するか、基になる urllib3 から読み取ることurllib3.HTTPResponseで、ワークフローをさらに制御できます。Response.raw

于 2012-09-19T10:04:34.090 に答える
0

httplibHEADリクエストの送信に使用できます。

于 2011-09-20T11:42:03.587 に答える
0

python-requestsを見ることもできます。これは、おそらく厄介なhttplib2. ( Why Not httplib2を参照)

これにはhead()メソッドもあります。

于 2011-09-20T12:08:40.607 に答える