Python urllib2を使用してファイルをダウンロードしています。ファイルサイズがどのくらい大きいかを確認するにはどうすればよいですか?
質問
それが大きい場合は...ダウンロードを停止しますか? 12MBを超えるファイルをダウンロードしたくない。
request = urllib2.Request(ep_url)
request.add_header('User-Agent',random.choice(agents))
thefile = urllib2.urlopen(request).read()
解決
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が行うその他の便利な機能を実装する必要があります。
他のヒント
あなたは言うことができます:
maxlength= 12*1024*1024
thefile= urllib2.urlopen(request).read(maxlength+1)
if len(thefile)==maxlength+1:
raise ThrowToysOutOfPramException()
しかし、もちろんあなたはまだ12MBの不要なデータを読んでいます。この発生のリスクを最小限に抑えたい場合は、HTTP Content-Lengthヘッダーがある場合はそれを確認できます(そうでない場合があります)。ただし、それを行うには、より一般的なurllibではなく、 httplib にドロップダウンする必要があります。
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()
ファイルの取得を要求する前に、必要に応じて長さを確認できます。これは基本的に上記と同じです。ただし、 'GET'
の代わりに 'HEAD'
メソッドを使用します。
HEADリクエストで最初にcontent-lengthを確認できますが、このヘッダーを設定する必要はありません- Python 2でHEAD HTTPリクエストを送信するにはどうすればよいですか
これは、Content-Lengthヘッダーが設定されている場合に機能します
import urllib2
req = urllib2.urlopen("http://example.com/file.zip")
total_size = int(req.info().getheader('Content-Length'))
所属していません StackOverflow