J'essaie donc de créer un script Python qui télécharge des 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 ne ressemble vraiment à ce dont j'ai besoin. Celui que j'ai trouvé le plus semblable se trouve ici ( http://bytes.com/topic/python/answers/850927-problem-using-urllib-download-images ). J'ai essayé d'utiliser ce code:
>>> import urllib
>>> image = urllib.URLopener()
>>> image.retrieve("http://www.gunnerkrigg.com//comics/00000001.jpg","00000001.jpg")
('00000001.jpg', <httplib.HTTPMessage instance at 0x1457a80>)
J'ai ensuite recherché sur mon ordinateur un fichier "00000001.jpg", mais je n'ai trouvé que l'image cachée de celui-ci. Je ne suis même pas sûr que le fichier ait été sauvegardé sur mon ordinateur. Une fois que j'ai compris comment télécharger le fichier, je pense savoir comment gérer le reste. Essentiellement, il suffit d'utiliser une boucle for et de scinder la chaîne au niveau du '00000000'. 'Jpg' et d'incrémenter le '00000000' jusqu'au plus grand nombre, ce que je devrais déterminer. Toutes les recommandations sur la meilleure façon de faire cela ou comment télécharger le fichier correctement?
Merci!
EDIT 15/06/10
Voici le script terminé, il enregistre les fichiers dans le répertoire de votre choix. Pour une raison quelconque, les fichiers n'étaient pas téléchargés et ils l'ont simplement fait. Toute suggestion sur la façon de le nettoyer serait très appréciée. Je cherche actuellement à découvrir de nombreuses bandes dessinées sur le site afin que je puisse obtenir uniquement la dernière, plutôt que de suspendre le programme après la création d'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
Utiliser urllib.urlretrieve :
import urllib
urllib.urlretrieve("http://www.gunnerkrigg.com//comics/00000001.jpg", "00000001.jpg")
import urllib
f = open('00000001.jpg','wb')
f.write(urllib.urlopen('http://www.gunnerkrigg.com//comics/00000001.jpg').read())
f.close()
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 ().
Pour Python 3, vous devrez importer import urllib.request
:
import urllib.request
urllib.request.urlretrieve(url, filename)
pour plus d'informations consultez le link
La version Python 3 de la 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()
J'ai trouvé ceci réponse et je le modifie de manière 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 ce fait, vous ne recevez jamais d’autres ressources ou exceptions lors du téléchargement.
Il est plus simple d'utiliser simplement .read()
pour lire la réponse partielle ou entière, puis de l'écrire dans un fichier que vous avez ouvert à un emplacement correct connu.
Peut-être avez-vous besoin de '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()
Si vous savez que les fichiers se trouvent dans le même répertoire dir
du site Web site
et ont le format suivant: nom_fichier_01.jpg, ..., nom_fichier_10.jpg, téléchargez-les 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()
Cela a fonctionné pour moi en utilisant Python 3.
Il obtient une liste des URL du 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!")
En plus de vous suggérer de lire attentivement la documentation de retrieve()
( http://docs.python.org/library/urllib.html#urllib.URLopener.retrieve ), je suggérerais même d'appeler read()
sur le contenu de la réponse. , puis enregistrez-le dans un fichier de votre choix plutôt que de le laisser dans le fichier temporaire créé par la récupération.
Tous les codes ci-dessus ne permettent pas de conserver le nom de l'image d'origine, qui est parfois requis. Cela vous aidera à enregistrer les images sur votre lecteur local, en préservant le nom de l'image d'origine.
IMAGE = URL.rsplit('/',1)[1]
urllib.urlretrieve(URL, IMAGE)
Essayez ceci pour plus de détails.
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;
Et ça:
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 __== '__main__':
main()
Une autre façon de faire est de passer par la bibliothèque fastai. Cela a fonctionné comme un charme pour moi. Je faisais face à un SSL: CERTIFICATE_VERIFY_FAILED Error
en utilisant urlretrieve
alors j'ai essayé.
url = 'https://www.linkdoesntexist.com/lennon.jpg'
fastai.core.download_url(url,'image1.jpg', show_progress=False)
Si vous avez besoin d'un support proxy, vous pouvez le faire:
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 )