Wget mit suprocess in python um passwortgeschützte Dateien runterzuladen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Neuron23
User
Beiträge: 8
Registriert: Mittwoch 19. Juli 2017, 13:32

Code: Alles auswählen

import os
import numpy as np
import wget
from subprocess import Popen,PIPE

url =  'http://dcapswoz.ict.usc.edu/wwwdaicwoz/util.zip'

def wget_url(url):
    print ('Beginning file download with wget module')
    args = ['wget', '--http-user=User', '--http-passwd=PasssWord', "%s" %url]
    Popen(args,shell = True,stdout = PIPE,stderr = PIPE)
a = wget_url(url)
stdout,stderr = a.communicate()
print(stdout)
print(stderr)/code]

Ich versuche aus einer Datenbank zip Archive runterzuladen
Ich benutze Windows 10 und python 3
Wget habe ich installiert und auch Umgebungsvariable gesetzt . Wenn ich den Befehl einfach direkt in die commandprompt eingebe funktioniert er auch und läd das archiv.
Mein Ziel ist allerdings, die insgesamt 180 Dateien nacheinander runterzuladen und direkt zu entpacken. Sie sind fortlaufend durchnummeriert.
Wenn ich das Skript so laufen lasse, bekomme ich ein NoneType object zurück
Ich bin für jede Hilfe dankbar. Die 2 Sonderzeichen $ und Unterstrich kommen im Passwort vor
Denn ein einzelner download dauert ca 15 min und die archive sind zwischen 500-900 MB groß
Bin für jeden Rat dankbar
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Neuron23: Was macht denn ``import wget``? Das wird im Code dann ja nicht weiter verwendet.

Natürlich bekommst Du ein `None` von der Funktion zurück, denn Du gibst da ja nichts anderes *explizit* zurück. Du hast da ein ``return`` vergessen.

``shell=True`` sollte da nicht stehen. Das verwendet man nur wenn man tatsächlich eine Shell braucht und da irgend etwas von verwendet. In Deinem Fall nicht nötig.

``"%s" %url`` ist unsinnig. Das macht aus der Zeichenkette `url` eine Zeichenkette mit dem gleichen Inhalt wie `url`, bewirkt also unter dem Strich genau gar nichts.

Konstanten schreibt man in Python KOMPLETT_GROSS. Alles andere klein_mit_unterstrichen, ausgenommen Klassen (MixedCase).

Auf Modulebene sollte nur Code stehen, der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

`a` ist kein guter Name weil der nichts über die Bedeutung des Wertes aussagt.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Neuron23
User
Beiträge: 8
Registriert: Mittwoch 19. Juli 2017, 13:32

@ _blackjack_
Danke für deine schnelle Antwort
Sorry dass der Code messy ist, aber ich habe zuviel dran rumprobiert
Ich habe den Code jetzt modifiziert

Code: Alles auswählen

import os
from subprocess import Popen,PIPE

url =  'http://dcapswoz.ict.usc.edu/wwwdaicwoz/util.zip'

def wget_url(url):
    print ('Beginning file download with wget module')
    args = ['wget', '--http-user=User', '--http-passwd=Password ', url]


    return Popen(args,stdout = PIPE,stderr = PIPE)
		
out = wget_url(url)
stdout,stderr = out.communicate()
print(stdout)
print(stderr)
Allerdings bekomme ich jetzt folgende Fehlermeldung
super(SubprocessPopen, self).__init__(*args, **kwargs)

File "C:\Users\Neuron23\Anaconda31\lib\subprocess.py", line 769, in __init__
restore_signals, start_new_session)

File "C:\Users\Neuron23\Anaconda31\lib\subprocess.py", line 1172, in _execute_child
startupinfo)

FileNotFoundError: [WinError 2] Das System kann die angegebene Datei nicht finden

Wenn ich den Befehl direkt über die command prompt aufrufe funktioniert es
Da nutze ich folgende Syntax
wget --http-user= User --http-passwd = password "http://....."
In dieser weise funktioniert es
Ich benutze spyder als editor
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Neuron23: Das bedeutet das ``wget`` für den Prozess offenbar nicht im Suchpfad für Programme liegt. Das ist dann ein Problem das Du auf der Ebene des Betriebssystems lösen musst. Kann vielleicht sein das seit dem Ändern von %PATH% nur neu gestartete Programme diese Änderung auch mitbekommen. Hast Du Spyder seit dem mal beendet und neu gestartet?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Neuron23
User
Beiträge: 8
Registriert: Mittwoch 19. Juli 2017, 13:32

Ja, den Editor neustarten hat geholfen. Dankeschön für deine Hilfe:)
Kann ich out jetzt eigentlich auch zB Funktionen des zip modules übergeben, um so die heruntergeladene Datei gleich zu entpacken?
Wenn man zB out = wget.download() verwenden würde, würde das so funktionieren.
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Neuron23: Sollte funktionieren. Warum probierst Du es nicht einfach aus? Und wenn Du das `wget`-Modul nutzt, hättest Du Dir die Installation von dem externen Kommandozeilenprogramm ``wget`` sparen können. Die haben bis auf den Namen nichts miteinander zu tun.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
randomuser
User
Beiträge: 9
Registriert: Donnerstag 21. Februar 2019, 09:58

Warum nicht mit urrlib?

Code: Alles auswählen

#runterladen 

import urllib
urllib.urlretrieve ("http://www.example.com/file/file.zip", "target_file.zip")
Passwort und User lassen sich damit auch verwenden. Siehe:
https://stackoverflow.com/questions/442 ... entication

Also einen Opener mit Authentication.
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Dann würde ich ja eher `requests` vorschlagen. Das hat eine schönere API als `urllib` und ist deutlich verbreiteter als `wget`.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
randomuser
User
Beiträge: 9
Registriert: Donnerstag 21. Februar 2019, 09:58

Gerne auch requests.. sehe nur kein Grund wget als subprocess aus Python zu starten wenn es doch mit Bordmitteln geht. Es mag Gründe haben.. ist mir nur nicht ersichtlich. Sogar das entpacken könnte sich automatisieren lassen.
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@randomuser: Das `wget`-Modul startet *nicht* ``wget`` als Prozess. Das ist ein reines Python-Modul das `urllib` verwendet.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
randomuser
User
Beiträge: 9
Registriert: Donnerstag 21. Februar 2019, 09:58

__blackjack__ hat geschrieben: Freitag 22. Februar 2019, 14:10 @randomuser: Das `wget`-Modul startet *nicht* ``wget`` als Prozess. Das ist ein reines Python-Modul das `urllib` verwendet.
Verstehe.. Ich bezog mich auf den ersten Beitrag vom Thread-starter. Da startet er/sie wget als externen Prozess über Popen (aus dem subprocess modul).
Antworten