55

urllib.urlretrieveファイルがリモート http サーバーに存在しない場合でも、サイレントに戻ります。指定されたファイルに html ページを保存するだけです。例えば:

urllib.urlretrieve('http://google.com/abc.jpg', 'abc.jpg')

abc.jpg が google.com サーバーに存在しなくても、生成されabc.jpgたファイルは有効な jpg ファイルではなく、実際には html ページです。返されたヘッダー (httplib.HTTPMessage インスタンス) を使用して、取得が成功したかどうかを実際に判断できると思いますが、httplib.HTTPMessage.

誰でもこの問題に関する情報を提供できますか?

4

8 に答える 8

7

私はそれを単純に保ちます:

# Simple downloading with progress indicator, by Cees Timmerman, 16mar12.

import urllib2

remote = r"http://some.big.file"
local = r"c:\downloads\bigfile.dat"

u = urllib2.urlopen(remote)
h = u.info()
totalSize = int(h["Content-Length"])

print "Downloading %s bytes..." % totalSize,
fp = open(local, 'wb')

blockSize = 8192 #100000 # urllib.urlretrieve uses 8192
count = 0
while True:
    chunk = u.read(blockSize)
    if not chunk: break
    fp.write(chunk)
    count += 1
    if totalSize > 0:
        percent = int(count * blockSize * 100 / totalSize)
        if percent > 100: percent = 100
        print "%2d%%" % percent,
        if percent < 100:
            print "\b\b\b\b\b",  # Erase "NN% "
        else:
            print "Done."

fp.flush()
fp.close()
if not totalSize:
    print
于 2012-03-16T16:02:06.667 に答える
5

ドキュメントによると、ドキュメント化されていません

メッセージにアクセスするには、次のようにします。

a, b=urllib.urlretrieve('http://google.com/abc.jpg', r'c:\abc.jpg')

b はメッセージ インスタンスです。

私は Python を学習したので、入力時に Python の内省的な機能を使用すると常に便利です。

dir(b) 

操作できるメソッドや関数がたくさんあります

そして、私はbで物事を始めました

例えば

b.items()

興味深いものがたくさんリストされています。これらをいじってみると、操作したい属性を取得できると思います。

申し訳ありませんが、これは非常に初心者の回答ですが、内省能力を使用して学習を改善する方法を習得しようとしていますが、あなたの質問がポップアップしました。

これに関連して興味深いことを試してみました。ディレクトリに表示された、パラメータを必要としないもののそれぞれから出力を自動的に取得できるかどうか疑問に思っていたので、次のように書きました。

needparam=[]
for each in dir(b):
    x='b.'+each+'()'
    try:
        eval(x)
        print x
    except:
        needparam.append(x)
于 2009-06-12T17:21:43.040 に答える
2

新しい URLopener (FancyURLopener から継承) を作成し、任意の方法で例外をスローしたり、エラーを処理したりできます。残念ながら、FancyURLopener は 404 やその他のエラーを無視します。この質問を参照してください:

urllib.urlretrieve で 404 エラーをキャッチする方法

于 2010-01-02T22:36:30.440 に答える
1

urllib /urllib2 よりも多くのプロトコルをサポートすることで、他の人に役立つことを願っていますretrievepycurl

import tempfile
import pycurl
import os

def get_filename_parts_from_url(url):
    fullname = url.split('/')[-1].split('#')[0].split('?')[0]
    t = list(os.path.splitext(fullname))
    if t[1]:
        t[1] = t[1][1:]
    return t

def retrieve(url, filename=None):
    if not filename:
        garbage, suffix = get_filename_parts_from_url(url)
        f = tempfile.NamedTemporaryFile(suffix = '.' + suffix, delete=False)
        filename = f.name
    else:
        f = open(filename, 'wb')
    c = pycurl.Curl()
    c.setopt(pycurl.URL, str(url))
    c.setopt(pycurl.WRITEFUNCTION, f.write)
    try:
        c.perform()
    except:
        filename = None
    finally:
        c.close()
        f.close()
    return filename
于 2009-06-13T09:18:53.347 に答える
0
class MyURLopener(urllib.FancyURLopener):
    http_error_default = urllib.URLopener.http_error_default

url = "http://page404.com"
filename = "download.txt"
def reporthook(blockcount, blocksize, totalsize):
    pass
    ...

try:
    (f,headers)=MyURLopener().retrieve(url, filename, reporthook)
except Exception, e:
    print e
于 2016-03-03T08:53:22.173 に答える
0

:) StackOverflow に関する私の最初の投稿は、何年も潜んでいました。:)

残念ながら dir(urllib.urlretrieve) には有用な情報が不足しています。したがって、これまでのこのスレッドから、次のように書いてみました。

a,b = urllib.urlretrieve(imgURL, saveTo)
print "A:", a
print "B:", b

これを生成した:

A: /home/myuser/targetfile.gif
B: Accept-Ranges: bytes
Access-Control-Allow-Origin: *
Cache-Control: max-age=604800
Content-Type: image/gif
Date: Mon, 07 Mar 2016 23:37:34 GMT
Etag: "4e1a5d9cc0857184df682518b9b0da33"
Last-Modified: Sun, 06 Mar 2016 21:16:48 GMT
Server: ECS (hnd/057A)
Timing-Allow-Origin: *
X-Cache: HIT
Content-Length: 27027
Connection: close

確認できると思います:

if b.Content-Length > 0:

私の次のステップは、取得が失敗するシナリオをテストすることです...

于 2016-03-07T23:44:29.610 に答える