Descarga de archivos en python

microhelix

Estoy intentando bajarme un listado de archivos y no soy capaz a acertar.

Lo que probé fue tirar de un for e ir saltando línea a línea e intentar manipular la línea de alguna forma para obtener la URI, pero como no fui capaz, hice que me imprimiese los resultados del bucle para ver qué pasa y me echa 2700+ líneas de cifras arbitrarias que van del 0 a los varios centenares.

¿Debería tirar de alguna librería para analizar el html?

cabron

Parece que los nombres no siguen ningún patrón, así que no te quedaría otra que extraer todos los tags anchor del html.

Yo he utilizado beatiful soup para hacer algo parecido, échale un ojo.

microhelix

Sí, estaba pensando en tirar de beautifulsoup pero lo que no entiendo es por qué me da ese output y quería saber si alguien podría decirme el porqué.

import urllib.request as urlr
import shutil

if something:
    with urlr.urlopen(hdatauri) as handle:
        for file in handle.read():
            name=""
            print(file)
            if targetc in name:
                urlr.urlopen(name)
                shutil.copyfileobj(name, open(csvpath+"/name", 'wb'))

Estaba intentando manipular la URI para descargar el csv comprimido y, al ver que era tipo int lo que leía python, deshice el parser y puse el print(file) para ver qué era lo que iteraba.

¿Tiene que ver algo con cómo interpreta el html?

Aquí el resultado del print:

Deoxys

Primero consigue la lista de archivos (Con un script o con copia-pega) y sepáralos por líneas.

Y luego con un for:

urlbase='http://api.bitcoincharts.com/v1/csv/'
for i.strip() in file: subprocess.call(['wget',urlbase+i])

Y ya.

Edit: No consigo que lo de dentro del code se vea bien, pero creo que se intuye la idea.

Edit: Viendo el codigo de la web no necesitas ni beautifulsoup. Te bajas el contenido de la web (urllib2 a lo cutre):

urls=[]
for line in code:
  if line.startswith("<a href="): urls.append(line.split('"')[1])

Y luego iteras sobre las URLs con lo anterior.

Edit2: Venga va, voy a intentar lucirme:

url='http://api.bitcoincharts.com/v1/csv/'
urls=[i.split('"')[1] for i in urllib2.read(url) if i.startswith("<a href=")]
for i in urls: subprocess.call(['wget',url+i])

3 líneas, lo puedes hacer en la consola o en ipython directamente.

1 1 respuesta
Wasd

No se si es lo que pides...

http://pastebin.com/tMaiQmDq

Alv15

Yo te recomiendo usar wget, que puedes implementarlo en Python descargando el package: https://pypi.python.org/pypi/wget
Es mucho más fácil y requiere menos líneas de código.

microhelix

Gracias, le echaré un vistazo a esto.

Kaiserlau

Como #4 lo ideal xD como tengo la plantilla echa han sido 2mins

spoiler
1 respuesta
Deoxys

#8 ¿Por qué a ti se te ve bien el code y a mí no? ¿Es porque soy negro? :< Lo voy a intentar otra vez a ver

url='http://api.bitcoincharts.com/v1/csv/'
urls=[i.split('"')[1] for i in urllib2.read(url) if i.startswith("<a href=")]
for i in urls: subprocess.call(['wget',url+i])
#Me cago en la leche Merche.
1 respuesta
Kaiserlau

#9 yo he pegado desde el editor del idle, la verdad sq pensaba q no funcionaria xD

pd: lo mio es python 2.7

Usuarios habituales

  • Kaiserlau
  • Deoxys
  • microhelix
  • Alv15
  • Wasd
  • cabron