我正在使用Python urllib2下载文件,如何检查文件大小?
如果文件太大...那就停止下载吗?我不想下载超过12MB的文件。
request = urllib2.Request(ep_url)
request.add_header('User-Agent',random.choice(agents))
thefile = urllib2.urlopen(request).read()
4 个回答
1
你可以先在一个HEAD请求中检查内容的长度,但要注意,这个头信息不一定会被设置。想了解更多,可以看看这个链接:如何在Python 2中发送HEAD HTTP请求?
7
你可以这样说:
maxlength= 12*1024*1024
thefile= urllib2.urlopen(request).read(maxlength+1)
if len(thefile)==maxlength+1:
raise ThrowToysOutOfPramException()
不过这样的话,你还是读取了12MB的多余数据。如果你想减少这种情况发生的可能性,可以检查一下HTTP的Content-Length头信息,如果有的话(可能没有)。但要做到这一点,你需要使用httplib,而不是更通用的urllib。
u= urlparse.urlparse(ep_url)
cn= httplib.HTTPConnection(u.netloc)
cn.request('GET', u.path, headers= {'User-Agent': ua})
r= cn.getresponse()
try:
l= int(r.getheader('Content-Length', '0'))
except ValueError:
l= 0
if l>maxlength:
raise IAmCrossException()
thefile= r.read(maxlength+1)
if len(thefile)==maxlength+1:
raise IAmStillCrossException()
如果你愿意,也可以在请求获取文件之前先检查一下文件的长度。这基本上和上面的方法一样,只是用的是'HEAD'
方法,而不是'GET'
。
20
其实没必要像 bobince 那样去使用 httplib。你可以直接用 urllib 来完成所有这些事情:
>>> import urllib2
>>> f = urllib2.urlopen("http://dalkescientific.com")
>>> f.headers.items()
[('content-length', '7535'), ('accept-ranges', 'bytes'), ('server', 'Apache/2.2.14'),
('last-modified', 'Sun, 09 Mar 2008 00:27:43 GMT'), ('connection', 'close'),
('etag', '"19fa87-1d6f-447f627da7dc0"'), ('date', 'Wed, 28 Oct 2009 19:59:10 GMT'),
('content-type', 'text/html')]
>>> f.headers["Content-Length"]
'7535'
>>>
如果你使用 httplib,那么你可能需要自己处理重定向、代理支持,以及其他 urllib2 为你做好的那些方便的功能。