2016-12-05 1 views
0

Il y a un lien avec une image gif, mais urllib2 ne peut pas le télécharger.urllib2.urlopen ne peut pas obtenir l'image, mais le navigateur peut

import urllib.request as urllib2 
uri = 'http://ums.adtechjp.com/mapuser?providerid=1074;userid=AapfqIzytwl7ks8AA_qiU_BNUs8AAAFYqnZh4Q' 
try: 
    req = urllib2.Request(uri, headers={ 'User-Agent': 'Mozilla/5.0' }) 
    file = urllib2.urlopen(req) 
except urllib2.HTTPError as err: 
    print('HTTP error!!!') 
    file = err 
    print(err.code) 
except urllib2.URLError as err: 
    print('URL error!!!') 
    print(err.reason) 
    return 

data = file.read(1024) 
print(data) 

Une fois le script terminé, les données restent vides. Pourquoi cela arrive-t-il? Il n'y a pas de HTTPError, je peux voir dans la console du navigateur qu'il y a un gif valide et le statut de HTTP est 200 OK. Je vous remercie.

Répondre

1

Vous devriez vérifier tous les en-têtes que le navigateur envoie au serveur.

Cette page a besoin de deux têtes: User-Agent et Cookie

Si vous utilisez DevTools dans Chrome ou Firefox vous verrez que normalement navigateur (si elle n'a pas encore aucun cookie) reçoit la première réponse avec cookie et 302 Moved Temporarily qui redirige vers la même URL mais avec cookie et puis il reçoit l'image.

Vous pouvez essayer mon cookie et peut-être qu'il reçoit une image. Bu normalement, vous devez faire deux demandes - d'abord pour obtenir cookie et deuxième (avec cookie) pour obtenir l'image.

import urllib.request as urllib2 

uri = 'http://ums.adtechjp.com/mapuser?providerid=1074;userid=AapfqIzytwl7ks8AA_qiU_BNUs8AAAFYqnZh4Q' 

headers = { 
    'User-Agent': 'Mozilla/5.0', 
    'Cookie': 'JEB2=583077046E650E2495131DE8FD2F1371', 
} 

try: 
    req = urllib2.Request(uri, headers=headers) 
    f = urllib2.urlopen(req) 
except urllib2.HTTPError as err: 
    print('HTTP error!!!') 
    f = err 
    print(err.code) 
except urllib2.URLError as err: 
    print('URL error!!!') 
    print(err.reason) 

data = f.read(1024) 
print(data) 

Si vous utilisez le module requests il fera tout automatiquement et vous ne avez besoin de deux demandes.

import requests 

uri = 'http://ums.adtechjp.com/mapuser?providerid=1074;userid=AapfqIzytwl7ks8AA_qiU_BNUs8AAAFYqnZh4Q' 

headers = { 
    'User-Agent': 'Mozilla/5.0', 
} 

r = requests.get(uri, headers=headers) 

print(r.content) 
+0

Puis-je obtenir des cookies via ce site? Il semble que urllib2.urlopen (req) ne peut pas recevoir de cookies? –

+1

avec 'urllib.request' vous devrez utiliser la classe' CookieJar' mais cela demande plus de travail - donc j'utilise toujours le module 'requests'. – furas