如何知道urllib.urlretrieve是否成功?

btw*_*tw0 53 python networking urllib

urllib.urlretrieve即使远程http服务器上不存在该文件,它也会以静默方式返回,它只是将html页面保存到指定文件中.例如:

urllib.urlretrieve('http://google.com/abc.jpg', 'abc.jpg')
Run Code Online (Sandbox Code Playgroud)

只是默默地返回,即使google.com服务器上不存在abc.jpg,生成abc.jpg的也不是有效的jpg文件,它实际上是一个html页面.我想返回的头文件(一个httplib.HTTPMessage实例)可以用来实际判断检索是否成功,但我找不到任何文档httplib.HTTPMessage.

任何人都可以提供有关此问题的一些信息吗?

Ale*_*dev 26

urllib2如果可能,请考虑使用.它比它更先进,更易于使用urllib.

您可以轻松检测到任何HTTP错误:

>>> import urllib2
>>> resp = urllib2.urlopen("http://google.com/abc.jpg")
Traceback (most recent call last):
<<MANY LINES SKIPPED>>
urllib2.HTTPError: HTTP Error 404: Not Found
Run Code Online (Sandbox Code Playgroud)

resp实际上是一个HTTPResponse对象,你可以做很多有用的事情:

>>> resp = urllib2.urlopen("http://google.com/")
>>> resp.code
200
>>> resp.headers["content-type"]
'text/html; charset=windows-1251'
>>> resp.read()
"<<ACTUAL HTML>>"
Run Code Online (Sandbox Code Playgroud)

  • urllib2可以提供urlretrieve的缓存行为吗?或者我们必须重新实现它? (6认同)

Cee*_*man 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
Run Code Online (Sandbox Code Playgroud)


PyN*_*bie 5

根据文档是未记录的

要访问该消息,您似乎执行了以下操作:

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

b 是消息实例

自从我了解了 Python 后,在我输入时使用 Python 的自省能力总是很有用的

dir(b) 
Run Code Online (Sandbox Code Playgroud)

我看到很多方法或功能可以玩

然后我开始用 b 做事

例如

b.items()
Run Code Online (Sandbox Code Playgroud)

列出了很多有趣的东西,我怀疑玩弄这些东西会让你得到你想要操纵的属性。

对不起,这是一个初学者的答案,但我正在努力掌握如何使用内省能力来提高我的学习能力,而您的问题刚刚出现。

好吧,我尝试了与此相关的一些有趣的事情-我想知道是否可以自动从不需要参数的目录中显示的每个内容中获取输出,所以我写道:

needparam=[]
for each in dir(b):
    x='b.'+each+'()'
    try:
        eval(x)
        print x
    except:
        needparam.append(x)
Run Code Online (Sandbox Code Playgroud)