2010-06-15 8 views
124

J'essaie donc de créer un script Python qui télécharge les webcomics et les place dans un dossier sur mon bureau. J'ai trouvé quelques programmes similaires ici qui font quelque chose de similaire, mais rien de tel que ce dont j'ai besoin. Celui que j'ai trouvé le plus similaire est ici (http://bytes.com/topic/python/answers/850927-problem-using-urllib-download-images). J'ai essayé en utilisant ce code:Télécharger une image via urllib et python

>>> import urllib 
>>> image = urllib.URLopener() 
>>> image.retrieve("http://www.gunnerkrigg.com//comics/00000001.jpg","00000001.jpg") 
('00000001.jpg', <httplib.HTTPMessage instance at 0x1457a80>) 

Je recherche alors mon ordinateur pour un fichier « 00000001.jpg », mais tout ce que je trouvais était l'image en cache de celui-ci. Je ne suis même pas sûr qu'il a enregistré le fichier sur mon ordinateur. Une fois que je comprends comment obtenir le fichier téléchargé, je pense que je sais comment gérer le reste. Pour l'essentiel, il suffit d'utiliser une boucle for et de diviser la chaîne au '00000000'. 'Jpg' et d'incrémenter le '00000000' jusqu'au plus grand nombre, ce que je devrais en quelque sorte déterminer. Des recommandations sur la meilleure façon de le faire ou comment télécharger le fichier correctement?

Merci!

EDIT 6/15/10

Voici le script terminé, il enregistre les fichiers dans un répertoire que vous choisissez. Pour une raison étrange, les fichiers ne téléchargeaient pas et ils ont juste fait. Toutes les suggestions sur la façon de le nettoyer serait très appréciée. Je travaille actuellement sur la façon de trouver de nombreuses bandes dessinées sur le site afin que je puisse obtenir le dernier, plutôt que de quitter le programme après un certain nombre d'exceptions.

import urllib 
import os 

comicCounter=len(os.listdir('/file'))+1 # reads the number of files in the folder to start downloading at the next comic 
errorCount=0 

def download_comic(url,comicName): 
    """ 
    download a comic in the form of 

    url = http://www.example.com 
    comicName = '00000000.jpg' 
    """ 
    image=urllib.URLopener() 
    image.retrieve(url,comicName) # download comicName at URL 

while comicCounter <= 1000: # not the most elegant solution 
    os.chdir('/file') # set where files download to 
     try: 
     if comicCounter < 10: # needed to break into 10^n segments because comic names are a set of zeros followed by a number 
      comicNumber=str('0000000'+str(comicCounter)) # string containing the eight digit comic number 
      comicName=str(comicNumber+".jpg") # string containing the file name 
      url=str("http://www.gunnerkrigg.com//comics/"+comicName) # creates the URL for the comic 
      comicCounter+=1 # increments the comic counter to go to the next comic, must be before the download in case the download raises an exception 
      download_comic(url,comicName) # uses the function defined above to download the comic 
      print url 
     if 10 <= comicCounter < 100: 
      comicNumber=str('000000'+str(comicCounter)) 
      comicName=str(comicNumber+".jpg") 
      url=str("http://www.gunnerkrigg.com//comics/"+comicName) 
      comicCounter+=1 
      download_comic(url,comicName) 
      print url 
     if 100 <= comicCounter < 1000: 
      comicNumber=str('00000'+str(comicCounter)) 
      comicName=str(comicNumber+".jpg") 
      url=str("http://www.gunnerkrigg.com//comics/"+comicName) 
      comicCounter+=1 
      download_comic(url,comicName) 
      print url 
     else: # quit the program if any number outside this range shows up 
      quit 
    except IOError: # urllib raises an IOError for a 404 error, when the comic doesn't exist 
     errorCount+=1 # add one to the error count 
     if errorCount>3: # if more than three errors occur during downloading, quit the program 
      break 
     else: 
      print str("comic"+ ' ' + str(comicCounter) + ' ' + "does not exist") # otherwise say that the certain comic number doesn't exist 
print "all comics are up to date" # prints if all comics are downloaded 
+0

Ok, je les ai tous à télécharger! Maintenant, je suis coincé avec une solution très inélégant pour déterminer combien de bandes dessinées sont en ligne ... Je suis essentiellement en cours d'exécution du programme à un nombre que je sais est sur le nombre de bandes dessinées et ensuite courir une exception la bande dessinée n'existe pas, et quand l'exception arrive plus de deux fois (puisque je ne pense pas que plus de deux bandes dessinées seront manquantes) elle quitte le programme, pensant qu'il n'y a plus rien à télécharger. Puisque je n'ai pas accès au site Web, y a-t-il un meilleur moyen de déterminer combien de fichiers il y a sur le site Web? Je posterai mon code dans une seconde. – Mike

+0

http://creativebe.com/icombiner/merge-jpg.html J'ai utilisé ce programme pour fusionner tous les fichiers .jpg en un seul PDF. Fonctionne génial, et c'est gratuit! – Mike

+4

Envisagez de publier votre solution en guise de réponse et de la supprimer de la question. Les messages de questions sont pour poser des questions, répondre aux messages pour les réponses :-) – BartoszKP

Répondre

6

Il est plus facile de simplement utiliser .read() pour lire la réponse partielle ou totale, puis l'écrire dans un fichier que vous avez ouvert dans un bon emplacement connu.

2

En plus de suggérer que vous lisez les documents pour retrieve() soigneusement (http://docs.python.org/library/urllib.html#urllib.URLopener.retrieve), je suggère d'appeler effectivement read() sur le contenu de la réponse, et l'enregistrement puis dans un fichier de votre choix plutôt que de le laisser dans le fichier temporaire récupérer crée.

64
import urllib 
f = open('00000001.jpg','wb') 
f.write(urllib.urlopen('http://www.gunnerkrigg.com//comics/00000001.jpg').read()) 
f.close() 
+0

Pourquoi pas urllib2? –

+0

Aucune raison. Mais l'urllib est assez bon. – DiGMi

180

En utilisant urllib.urlretrieve:

import urllib 
urllib.urlretrieve("http://www.gunnerkrigg.com//comics/00000001.jpg", "00000001.jpg") 
+0

Il semble couper l'extension de fichier pour moi quand il est passé en argument (l'extension est présente dans l'URL d'origine). Une idée pourquoi? – JeffThompson

+0

@JeffThompson, no. Est-ce que l'exemple (dans ma réponse) fonctionne pour vous (c'est pour moi avec Python 2.7.8)? Notez comment il spécifie explicitement l'extension pour le fichier local. –

+1

Le vôtre, oui. Je pense avoir supposé que si aucune extension de fichier n'était donnée, l'extension du fichier serait ajoutée. Cela avait du sens pour moi à l'époque, mais je pense maintenant que je comprends ce qui se passe. – JeffThompson

38

Juste pour l'enregistrement, en utilisant la bibliothèque de demandes.

import requests 
f = open('00000001.jpg','wb') 
f.write(requests.get('http://www.gunnerkrigg.com//comics/00000001.jpg').content) 
f.close() 

Bien qu'il devrait vérifier l'erreur requests.get().

+1

Même si cette solution n'utilise pas urllib, vous pouvez déjà utiliser la bibliothèque de requêtes déjà dans votre script python (c'était mon cas lors de la recherche de ceci) ainsi vous pourriez vouloir l'employer aussi bien pour obtenir vos images. –

+0

Merci d'avoir posté cette réponse au-dessus des autres. J'ai fini par avoir besoin d'en-têtes personnalisés pour que mon téléchargement fonctionne, et le pointeur vers la bibliothèque de requêtes a raccourci le processus de tout faire fonctionner pour moi considérablement. – kuzzooroo

+0

Impossible de faire fonctionner urllib dans python3. Les demandes n'ont eu aucun problème et c'est déjà chargé! Le meilleur choix que je pense. – user3023715

8

J'ai trouvé ce answer et je modifier que plus fiable

def download_photo(self, img_url, filename): 
    try: 
     image_on_web = urllib.urlopen(img_url) 
     if image_on_web.headers.maintype == 'image': 
      buf = image_on_web.read() 
      path = os.getcwd() + DOWNLOADED_IMAGE_PATH 
      file_path = "%s%s" % (path, filename) 
      downloaded_image = file(file_path, "wb") 
      downloaded_image.write(buf) 
      downloaded_image.close() 
      image_on_web.close() 
     else: 
      return False  
    except: 
     return False 
    return True 

De cela, vous ne recevez jamais d'autres ressources ou exceptions pendant le téléchargement.

+0

Vous devez supprimer le 'self' – Euphe

10

Python version 3 @ réponse de DiGMi:

from urllib import request 
f = open('00000001.jpg', 'wb') 
f.write(request.urlopen("http://www.gunnerkrigg.com/comics/00000001.jpg").read()) 
f.close() 
5

Peut-être que vous avez besoin 'User-Agent':

import urllib2 
opener = urllib2.build_opener() 
opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36')] 
response = opener.open('http://google.com') 
htmlData = response.read() 
f = open('file.txt','w') 
f.write(htmlData) 
f.close() 
+0

Je reçois une erreur 404. Aucune suggestion? – Yebach

+0

Peut-être que page non disponible? – Alexander

2

Tous les codes ci-dessus, ne permettent pas de conserver l'original nom de l'image, ce qui est parfois nécessaire. Cela vous aidera à enregistrer les images sur votre disque local, en préservant l'original nom de l'image

IMAGE = URL.rsplit('/',1)[1] 
    urllib.urlretrieve(URL, IMAGE) 

Try this pour plus de détails.

-1

Qu'en est-ce:

import urllib, os 

def from_url(url, filename = None): 
    '''Store the url content to filename''' 
    if not filename: 
     filename = os.path.basename(os.path.realpath(url)) 

    req = urllib.request.Request(url) 
    try: 
     response = urllib.request.urlopen(req) 
    except urllib.error.URLError as e: 
     if hasattr(e, 'reason'): 
      print('Fail in reaching the server -> ', e.reason) 
      return False 
     elif hasattr(e, 'code'): 
      print('The server couldn\'t fulfill the request -> ', e.code) 
      return False 
    else: 
     with open(filename, 'wb') as fo: 
      fo.write(response.read()) 
      print('Url saved as %s' % filename) 
     return True 

## 

def main(): 
    test_url = 'http://cdn.sstatic.net/stackoverflow/img/favicon.ico' 

    from_url(test_url) 

if __name__ == '__main__': 
    main() 
3

Si vous savez que les fichiers sont situés dans le même répertoire dir du site site et ont le format suivant: filename_01.jpg, ..., puis filename_10.jpg télécharger tous:

import requests 

for x in range(1, 10): 
    str1 = 'filename_%2.2d.jpg' % (x) 
    str2 = 'http://site/dir/filename_%2.2d.jpg' % (x) 

    f = open(str1, 'wb') 
    f.write(requests.get(str2).content) 
    f.close() 
0

Une solution plus simple peut être (python 3):

import urllib.request 
import os 
os.chdir("D:\\comic") #your path 
i=1; 
s="00000000" 
while i<1000: 
    try: 
     urllib.request.urlretrieve("http://www.gunnerkrigg.com//comics/"+ s[:8-len(str(i))]+ str(i)+".jpg",str(i)+".jpg") 
    except: 
     print("not possible" + str(i)) 
    i+=1; 
4

Pour Python 3 vous devez importer import urllib.request:

import urllib.request 

urllib.request.urlretrieve(url, filename) 

pour plus d'informations consultez la link

0

Cela a fonctionné pour moi en utilisant python 3.

Il obtient une liste d'URL de la fichier csv et commence à les télécharger dans un dossier. Dans le cas où le contenu ou l'image n'existe pas, il prend cette exception et continue de faire sa magie.

import urllib.request 
import csv 
import os 

errorCount=0 

file_list = "/Users/$USER/Desktop/YOUR-FILE-TO-DOWNLOAD-IMAGES/image_{0}.jpg" 

# CSV file must separate by commas 
# urls.csv is set to your current working directory make sure your cd into or add the corresponding path 
with open ('urls.csv') as images: 
    images = csv.reader(images) 
    img_count = 1 
    print("Please Wait.. it will take some time") 
    for image in images: 
     try: 
      urllib.request.urlretrieve(image[0], 
      file_list.format(img_count)) 
      img_count += 1 
     except IOError: 
      errorCount+=1 
      # Stop in case you reach 100 errors downloading images 
      if errorCount>100: 
       break 
      else: 
       print ("File does not exist") 

print ("Done!") 
0

Si vous avez besoin d'aide proxy que vous pouvez faire ceci:

if needProxy == False: 
    returnCode, urlReturnResponse = urllib.urlretrieve(myUrl, fullJpegPathAndName) 
    else: 
    proxy_support = urllib2.ProxyHandler({"https":myHttpProxyAddress}) 
    opener = urllib2.build_opener(proxy_support) 
    urllib2.install_opener(opener) 
    urlReader = urllib2.urlopen(myUrl).read() 
    with open(fullJpegPathAndName, "w") as f: 
     f.write(urlReader) 
Questions connexes