9
votes

Je télécharge un fichier à l'aide de Python Urllib2. Comment vérifier la taille de la taille du fichier?

Et si c'est grand ... puis arrêtez-vous le téléchargement? Je ne veux pas télécharger des fichiers de plus de 12 Mo.

request = urllib2.Request(ep_url)
request.add_header('User-Agent',random.choice(agents))
thefile = urllib2.urlopen(request).read()


0 commentaires

4 Réponses :


1
votes

Vous pouvez d'abord vérifier la longueur du contenu dans une demande de tête, mais être prévenu, cet en-tête ne doit pas être défini - voir Comment envoyez-vous une demande HTTP Head à Python 2?


2 commentaires

Comment vérifier la longueur du contenu dans la demande de tête? Est-ce que ceci est considéré comme des en-têtes?


Faire une demande de tête est au mieux théorique si vous souhaitez utiliser Urllib / Urllib2. Ces modules ne supportent que les demandes d'obtention et de poste.



7
votes

Vous pourriez dire:

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()


1 commentaires

C'est une meilleure solution, car la longueur de contenu n'est pas fiable (quelqu'un peut la définir de manière incorrecte)



20
votes

Il n'y a pas besoin de Bobince a fait et tomber sur HTTPLIB. Vous pouvez faire tout cela avec Urllib directement:

>>> 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'
>>> 


0 commentaires

1
votes

Cela fonctionnera si l'en-tête de longueur de contenu est défini

import urllib2          
req = urllib2.urlopen("http://example.com/file.zip")
total_size = int(req.info().getheader('Content-Length'))


4 commentaires

vous n'avez pas besoin .strip () : 1. gettheader () renvoie déjà la version dénudée 2. int () ne se soucie pas de Espace dirigeant / traînant.


En outre, il n'y a pas de point à utiliser int (info () getheader ()) Si vous ne définissez pas la valeur par défaut: ValueError de int est moins approprié que keerror à partir de req.aders (Remarque: req.info () est req.aders )


@Gourneau - Cela fonctionnerait-il toujours si l'URL spécifiée est FTP: // URL?


@Pankajparashar Nope, "Longueur de contenu" est sorti de l'en-tête HTTP, alors fonctionne uniquement avec HTTP. Cela pourrait être ce dont vous avez besoin si vous avez besoin de Stackoverflow.com/a/5241914/56069