Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 30, 2013 19:37:45

funnyman
Зарегистрирован: 2012-07-10
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

Странное поведение urlretrieve в цикле со списком

собственно сабж, а вот код:

# -*- coding: utf-8 -*-
#!/usr/bin/env python

import urllib2
import sys, re, os, argparse
from urllib import urlretrieve

parser = argparse.ArgumentParser(description='audioposk.com music downloader')
parser.add_argument("-artist", type=str, help='example: the-offspring or papa-roach, rammstein. \
Script download all tracks from first page')
args = parser.parse_args()

def progressBar(count, blockSize, totalSize):
percent = int(count*blockSize*100/totalSize)
sys.stdout.write("%2d%%" % percent)
sys.stdout.write("\b\b\b")
sys.stdout.flush()

def getTrack(fullPath, goodName):
sys.stdout.write(goodName + '...')
urlretrieve(fullPath, goodName, reporthook=progressBar)
print "\n"

def downloadTrack(artist):
tracks_url = 'http://www.audiopoisk.com/artist/'+artist+'/'
html = urllib2.urlopen(tracks_url).read()
regex = re.compile(r'/files/'+artist+r'/.+\.mp3')
tracks = set(regex.findall(html))
for track in tracks:
fullPath = 'http://www.audiopoisk.com' + track
goodName = urllib2.urlopen(fullPath).info().get('Content-Disposition')[22:-1]
goodName = goodName.replace(' (audiopoisk.com)', '')
getTrack(fullPath, goodName)
#urlretrieve(fullPath, goodName)

if __name__ == '__main__':
downloadTrack(args.artist)

в функции downloadTrack если закоментить вызов getTrack, и раскоментить вызов urlretrieve и вставить перед этим вызовом print goodName то скрипт при выполнении напечатает все +100500 названий треков найденных на странице, и скачает только последний. В то время как если urlretrieve вынести в отдельную функцию, будет все норм, каждый трек будет скачан.

p.s. что то пустые строки между методами не остаются при вставке кода с тегом python

Отредактировано funnyman (Июнь 30, 2013 19:44:54)

Офлайн

#2 Июль 1, 2013 09:02:47

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Странное поведение urlretrieve в цикле со списком

В функции getTrack вы используется urlretrive с reporthook арументом, а в функции downloadTrack вы используете urlretrive без аргумента retportooh, возможно, причина в этом.

Офлайн

#3 Июль 1, 2013 10:36:34

funnyman
Зарегистрирован: 2012-07-10
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

Странное поведение urlretrieve в цикле со списком

Переделал код

def downloadTrack(artist):
tracks_url = 'http://www.audiopoisk.com/artist/'+artist+'/'
html = urllib2.urlopen(tracks_url).read()
regex = re.compile(r'/files/'+artist+r'/.+\.mp3')
tracks = set(regex.findall(html))
for track in tracks:
fullPath = 'http://www.audiopoisk.com' + track
goodName = urllib2.urlopen(fullPath).info().get('Content-Disposition')[22:-1]
goodName = goodName.replace(' (audiopoisk.com)', '')
#getTrack(fullPath, goodName)
print tracks
sys.stdout.write(goodName + '...')
urlretrieve(fullPath, goodName, reporthook=progressBar)

если передать скрипту параметр например rammstein то скрипт по сути должен печатать содержимое множества tracks при каждой итерации.. НО, скачивать начинает самый последний трек в множестве.. Распокавал множество в список, та же история.. добавил reporthook, код работает так же.. Как цикл может зависить от вызова этой фунции, пусть бы даже urlretrive не скачивала треки, а качала только последний, но тогда бы сожержимое множества/списка печаталось много раз вплоть до скачивания последнего трека. При присутсвии urlretrieve цикл сразу переходи к последнему элементу списка. независимо от параметров передоваемых urlretrieve.

С английским у меня плохо, может кто нибудь может задать вопрос на stackoverflow?

Отредактировано funnyman (Июль 1, 2013 10:38:17)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version