Найти - Пользователи
Полная версия: Странное поведение urlretrieve в цикле со списком
Начало » Python для экспертов » Странное поведение urlretrieve в цикле со списком
1
funnyman
собственно сабж, а вот код:

# -*- 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
lorien
В функции getTrack вы используется urlretrive с reporthook арументом, а в функции downloadTrack вы используете urlretrive без аргумента retportooh, возможно, причина в этом.
funnyman
Переделал код

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?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB