Ответ 1
Использование urllib.urlretrieve:
import urllib
urllib.urlretrieve("http://www.gunnerkrigg.com//comics/00000001.jpg", "00000001.jpg")
Итак, я пытаюсь создать Python script, который загружает webcomics и помещает их в папку на моем рабочем столе. Я нашел несколько подобных программ здесь, которые делают что-то подобное, но ничего подобного мне не нужно. Тот, который я нашел наиболее похожим, здесь (http://bytes.com/topic/python/answers/850927-problem-using-urllib-download-images). Я пробовал использовать этот код:
>>> import urllib
>>> image = urllib.URLopener()
>>> image.retrieve("http://www.gunnerkrigg.com//comics/00000001.jpg","00000001.jpg")
('00000001.jpg', <httplib.HTTPMessage instance at 0x1457a80>)
Затем я обыскал свой компьютер для файла "00000001.jpg", но все, что я нашел, было его кэшированной картиной. Я даже не уверен, что он сохранил файл на моем компьютере. Как только я понял, как загрузить файл, я думаю, что знаю, как справиться с остальными. По сути, просто используйте цикл for и разделите строку на "00000000". "Jpg" и увеличьте "00000000" до самого большого числа, которое мне нужно было бы как-то определить. Любые рекомендации о том, как это сделать или как правильно загрузить файл?
Спасибо!
РЕДАКТИРОВАТЬ 6/15/10
Вот завершенный script, он сохраняет файлы в любой выбранный вами каталог. По какой-то нечетной причине файлы не загружались, и они просто делали. Любые предложения о том, как его очистить, будут высоко оценены. В настоящее время я работаю над тем, как найти много комиксов на сайте, чтобы я мог получить только последнюю версию, вместо того, чтобы закрыть программу после того, как появилось определенное количество исключений.
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
Использование 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()
Только для записи, используя библиотеку запросов.
import requests
f = open('00000001.jpg','wb')
f.write(requests.get('http://www.gunnerkrigg.com//comics/00000001.jpg').content)
f.close()
Хотя он должен проверять ошибку request.get().
Для Python 3 вам нужно импортировать import urllib.request
:
import urllib.request
urllib.request.urlretrieve(url, filename)
для получения дополнительной информации проверьте ссылку
Python 3 версия ответа @DiGMi:
from urllib import request
f = open('00000001.jpg', 'wb')
f.write(request.urlopen("http://www.gunnerkrigg.com/comics/00000001.jpg").read())
f.close()
Я нашел этот ответ, и я редактирую это более надежным способом.
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
Из этого вы никогда не получаете никаких других ресурсов или исключений при загрузке.
Проще всего использовать .read()
для чтения частичного или полного ответа, а затем записать его в файл, который вы открыли в известном хорошем месте.
Возможно, вам нужен "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()
Если вы знаете, что файлы находятся в одном каталоге dir
веб-сайта site
и имеют следующий формат: filename_01.jpg,..., filename_10.jpg, тогда загрузите все из них:
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()
Помимо предложения внимательно прочитать документы для retrieve()
(http://docs.python.org/library/urllib.html#urllib.URLopener.retrieve), я бы предложил на самом деле позвонить read()
on содержимое ответа, а затем сохраняя его в выбранном вами файле, а не оставляя его во временном файле, который извлекает, создает.
Все приведенные выше коды не позволяют сохранить исходное имя изображения, которое иногда требуется. Это поможет сохранить изображения на локальном диске, сохранив исходное имя изображения
IMAGE = URL.rsplit('/',1)[1]
urllib.urlretrieve(URL, IMAGE)
Попробуйте для получения более подробной информации.
Это работало для меня, используя Python 3.
Он получает список URL-адресов из CSV файла и начинает загружать их в папку. Если контент или изображение не существует, он принимает это исключение и продолжает творить чудеса.
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!")
Более простым решением может быть (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;
Как насчет этого:
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()
Если вам нужна поддержка прокси, вы можете сделать это:
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 )
Еще один способ сделать это через библиотеку fastai. Это сработало как обаяние для меня. Я столкнулся с SSL: CERTIFICATE_VERIFY_FAILED Error
при использовании urlretrieve
поэтому я попытался это сделать.
url = 'https://www.linkdoesntexist.com/lennon.jpg'
fastai.core.download_url(url,'image1.jpg', show_progress=False)