Форум сайта python.su
Добрый день. Нужна помощь!
Нужно выкачать большую картинку с сайта, на сайте она хранится в виде плиток 256*256 пикс
Нашел под эту задачу готовый скрипт, он работает, но есть проблема, точнее 2
1 сайт периодически на запрос выдает ошибку и скрипт останавливается.
это самая главная проблема, так как приходится руками перезапускать
Traceback (most recent call last): File "C:\gigapandown\gigapanDownloader.py", line 95, in <module> h = urlopen(url) File "C:\Python27\lib\urllib.py", line 87, in urlopen return opener.open(url) File "C:\Python27\lib\urllib.py", line 213, in open return getattr(self, name)(url) File "C:\Python27\lib\urllib.py", line 350, in open_http h.endheaders(data) File "C:\Python27\lib\httplib.py", line 1038, in endheaders self._send_output(message_body) File "C:\Python27\lib\httplib.py", line 882, in _send_output self.send(msg) File "C:\Python27\lib\httplib.py", line 844, in send self.connect() File "C:\Python27\lib\httplib.py", line 821, in connect self.timeout, self.source_address) File "C:\Python27\lib\socket.py", line 557, in create_connection for res in getaddrinfo(host, port, 0, SOCK_STREAM): IOError: [Errno socket error] [Errno 11001] getaddrinfo failed
#loop around to get every tile for j in xrange(ht): for i in xrange(wt): filename = "%04d-%04d.jpg"%(j,i) pathfilename = str(photo_id)+"/"+filename if not os.path.exists(pathfilename) : url = "%s/get_ge_tile/%d/%d/%d/%d"%(base,photo_id, level,j,i) progress = (j)*wt+i+1 print '('+str(progress)+'/'+str(wt*ht)+') Downloading '+str(url)+' as '+str(filename) h = urlopen(url) if 200 == h.code : fout = open(pathfilename,"wb") fout.write(h.read()) fout.close() else: print '('+str(progress)+'/'+str(wt*ht)+') Downloading error '+str(url)+' http code '+str(h.code) ++errors
Офлайн
Во-первых, это к Data Mining никакого отношения не имеет. Data Mining - это добывание данных из данных. Это когда у тебя есть какие-то данные и из них на основе гипотез с помощью математической статистики добывают какие-то новые данные.
Во-вторых, написание программы начинается не с написания чего-то там и дальнейшего понимания по этому написанному, а что же, собственно, пишется. Сначала нужно задачу описать без всякого кода словами от начала и до конца, не оставляя никаких неясностей. В начале у тебя что-то конкретное дано. В конце у тебя что-то конкретное получено. И только после того, как это словесное описание готово, можно приступать к его дальнейшей реализации, которая тоже не сразу в виде кода происходит. Сначала рисуется блок-схема (сейчас можно использовать UML-диаграммы для этого), потом блок-схема оптимизируется, потом в результате этой оптимизации оптимизируется словесное описание, полученное на предыдущем этапе разработки, и снова строится блок-схема по этому оптимизированному словесному описанию. Когда словесное описание оптимально и когда блок-схема оптимальна, пишется псевдокод по этой блок-схеме. Потом псевдокод оптимизируется, а за ним, возможно, оптимизируется блок-схема, а за ней, возможно, оптимизируется словесное описание и потом всё повторяется. Это такой итеративный процесс, когда ты всё время оптимизируешь и возвращаешься в начало. Так у тебя постепенно всё улучшается и всё уточняется до самых мелких деталей. И вот когда вся эта цепочка получена и в ней всё оптимально, тогда ты и пишешь уже конечный код по этому псевдокоду. А там уже остаётся только записать код. После того, как код будет записан, с ним надо будет дальше работать - обслуживать его. Соответственно, там и комментарии должны быть, и юнит-тесты должны быть, и репозиторий должен быть, и установщик программы должен быть, и документация должна быть как по установке программы, так и по самой программе. И эта документация должна быть понятна абсолютно незнакомому с этой программой человеку.
Вот что такое программирование.
А вот это твоё “в свое время в универе все писал на делфи” не значит ничего, потому что всего этого - всего того, что нужно знать, - ты не знаешь.
В-третьих, опиши всё для нас на словах и выложи свои кодовые наработки, чтобы мы могли из твоего описания и твоего кода просто понять, что тебе нужно сделать, какую задачу ты решаешь, потому что вот это “Нужно выкачать большую картинку с сайта, на сайте она хранится в виде плиток 256*256 пикс” - это не описание, а это ни пойми что. 100500 способов есть выкачивания и 100500 способов есть хранения и какие из них подходят под твой случай из этого описания никак не определишь.
Офлайн
py.user.next
есть выкачивания и 100500 способов есть хранения и какие из них подходят под твой случай из этого описания никак не определишь.
from xml.dom.minidom import * from urllib2 import * from urllib import * import sys,os,math,subprocess outputformat="psb" #psb or tif imagemagick="/usr/bin/montage" #Linux path to Imagemagick if os.name == "nt": imagemagick="C:\\Program Files\\ImageMagick-6.9.9-Q16\\montage.exe" #Windows path to Imagemagick def getText(nodelist): rc = "" for node in nodelist: if node.nodeType == node.TEXT_NODE: rc = rc + node.data return rc def find_element_value(e,name): nodelist = [e] while len(nodelist) > 0 : node = nodelist.pop() if node.nodeType == node.ELEMENT_NODE and node.localName == name: return getText(node.childNodes) else: nodelist += node.childNodes return None #main photo_id = int(sys.argv[1]) if not os.path.exists(str(photo_id)): os.makedirs(str(photo_id)) base = "http://www.gigapan.org" # read the kml file h = urlopen(base+"/gigapans/%d.kml"%(photo_id)) photo_kml=h.read() # find the width and height, level dom = parseString(photo_kml) maxheight=int(find_element_value(dom.documentElement, "maxHeight")) maxwidth=int(find_element_value(dom.documentElement, "maxWidth")) tile_size=int(find_element_value(dom.documentElement, "tileSize")) maxlevel = max(math.ceil(maxwidth/tile_size), math.ceil(maxheight/tile_size)) maxlevel = int(math.ceil(math.log(maxlevel)/math.log(2.0))) maxwt = int(math.ceil(maxwidth/tile_size))+1 maxht = int(math.ceil(maxheight/tile_size))+1 # find the width, height, tile number and level to use level = int(sys.argv[2]) if level == 0: level = maxlevel width = int(maxwidth / (2 ** (maxlevel-level)))+1 height = int(maxheight / (2 ** (maxlevel-level)))+1 wt = int(math.ceil(width/tile_size))+1 ht = int(math.ceil(height/tile_size))+1 # print the variables print '+----------------------------' print '| Max size: '+str(maxwidth)+'x'+str(maxheight)+'px' print '| Max number of tiles: '+str(maxwt)+'x'+str(maxht)+' tiles = '+str(wt*ht)+' tiles' print '| Max level: '+str(maxlevel) print '| Tile size: '+str(tile_size) print '+----------------------------' print '| Image to download:' print '| Size: '+str(width)+'x'+str(height)+'px' print '| Number of tiles: '+str(wt)+'x'+str(ht)+' tiles = '+str(wt*ht)+' tiles' print '| Level: '+str(level) print '+----------------------------' print print 'Starting download...' errors = 0 #loop around to get every tile for j in xrange(ht): for i in xrange(wt): filename = "%04d-%04d.jpg"%(j,i) pathfilename = str(photo_id)+"/"+filename if not os.path.exists(pathfilename) : url = "%s/get_ge_tile/%d/%d/%d/%d"%(base,photo_id, level,j,i) progress = (j)*wt+i+1 print '('+str(progress)+'/'+str(wt*ht)+') Downloading '+str(url)+' as '+str(filename) h = urlopen(url) if 200 == h.code : fout = open(pathfilename,"wb") fout.write(h.read()) fout.close() else: print '('+str(progress)+'/'+str(wt*ht)+') Downloading error '+str(url)+' http code '+str(h.code) ++errors
Офлайн
PoziНа сайте оно хранится. Соответственно, для закачивания с сайта, нужно сначала понять, где оно хранится, как оно хранится и как это скачать, потому что скачать тоже можно не всегда (может запросить какие-то пользовательские данные).
проблема не в хранении…. про хранение я даже слова не написал
PoziВот это просто смешно. Ошибки тут синтаксической нет только потому, что это две унарных операции плюс++errors
>>> errors = 1 >>> ++errors 1 >>> +(+(errors)) 1 >>>
PoziЭто ты задачу описал. А выполнение этой задачи ты не описал словами.
объяснить на словах? так я же вроде уже
есть картинка из плиток, допустим 1000*500 плиток = 500 000 плиток, по сути это как парсинг карт гугл или яндекса,
тоже самое, карта состоит из плиток, их нужно выкачать все
PoziВот теперь подробно расписывай по шагам, как ты это делаешь. Куда подключаешься, как оно там хранится, как ты его оттуда скачиваешь (каким способом, нужны ли для скачивания креденшенелы (там печенье или что) или оно всем даёт скачивать анонимно), куда оно сохраняется после скачивания, какой результат на экран выводится во время скачивания и после скачивания и что там должно писаться в этом результате. Вот это всё на словах описывай от начала до конца. Когда оно будет готово, тогда и будешь пробовать код писать по этому словесному описанию. Хотя нужно сначала построить блок-схему, а потом псевдокод написать. Вот это разработка.
объяснить на словах? так я же вроде уже
есть картинка из плиток, допустим 1000*500 плиток = 500 000 плиток, по сути это как парсинг карт гугл или яндекса,
тоже самое, карта состоит из плиток, их нужно выкачать все
Отредактировано py.user.next (Окт. 7, 2022 00:57:33)
Офлайн
поковырялся я в скрипте еще немного
и нашел пару ошибок
далее после закачки идет уже склейка картинок, она работает
if errors == 0: print "Stitching... " for j in xrange(ht): lineNo = "%04d"%(j) print 'creating line '+ str(lineNo) subprocess.call('"'+imagemagick+'" -depth 8 '+ '-geometry 256x256+0+0 ' + '-mode concatenate ' + '-tile '+ str(wt)+'x ' + str(photo_id)+'/'+str(lineNo)+'-*.jpg ' + str(photo_id)+'/line-'+ str(lineNo) +'.jpg', shell=True) wline = wt * 256 print 'creating output file ' subprocess.call('"'+imagemagick+'" -depth 8 '+ '-geometry '+str(wline)+'x256+0+0 ' + '-mode concatenate ' + '-tile x'+ str(ht)+' ' + str(photo_id)+'/line-*.jpg ' + str(photo_id)+'.'+outputformat, shell=True) print "OK"
subprocess.call('"'+imagemagick+'" -define registry:temporary-path=E:\tmp -depth 8 '+
py.user.next
Результат твоего Delphi - это вот эта мешанина, которую ты написал на данный момент. Всего десять строчек и уже не работает нифига.
Отредактировано Pozi (Окт. 8, 2022 12:22:58)
Офлайн
Poziповторяю ещё раз
повторяю еще раз
КОД НЕ МОЙ, Я НАШЕЛ ГОТОВЫЙ СКРИПТ И ПЫТАЮСЬ ЕГО ИСПРАВИТЬ
и скрипт работает, просто имеет недостатки
Отредактировано py.user.next (Окт. 8, 2022 22:23:46)
Офлайн
Pozi
Я НАШЕЛ ГОТОВЫЙ СКРИПТ И ПЫТАЮСЬ ЕГО ИСПРАВИТЬ
Install Python 2.X (3.X is not supported)
Poziтак там же написано
во первый непонятно почему автор скрипта выбрал jpg
Select outputformat in gigapanDownloader.py - psb for large gigapans (default) or tif.
PoziРасскажите что исправили?
и скрипт работает, просто имеет недостатки
Офлайн