Tworzę program, który pobierze plik .jar (java) z serwera WWW, czytając adres URL podany w pliku .jad tej samej gry / aplikacji. Używam Python 3.2.1
Udało mi się wyodrębnić adres URL pliku JAR z pliku JAD (każdy plik JAD zawiera adres URL do pliku JAR), ale jak można sobie wyobrazić, wyodrębniona wartość to ciąg typu ().
Oto odpowiednia funkcja:
def downloadFile(URL=None):
import httplib2
h = httplib2.Http(".cache")
resp, content = h.request(URL, "GET")
return content
downloadFile(URL_from_file)
Jednak zawsze pojawia się błąd informujący, że typ w powyższej funkcji musi być bajtami, a nie ciągiem. Próbowałem użyć URL.encode ('utf-8'), a także bajtów (URL, kodowanie = 'utf-8'), ale zawsze otrzymywałbym ten sam lub podobny błąd.
Więc w zasadzie moje pytanie brzmi: jak pobrać plik z serwera, gdy adres URL jest przechowywany w typie ciągu?
python
python-3.x
Bo Milanovich
źródło
źródło
Odpowiedzi:
Jeśli chcesz uzyskać zawartość strony internetowej w zmiennej, wystarczy
read
odpowiedźurllib.request.urlopen
:Najłatwiejszym sposobem pobrania i zapisania pliku jest użycie
urllib.request.urlretrieve
funkcji:Pamiętaj jednak, że
urlretrieve
jest to uważane za dziedzictwo i może stać się przestarzałe (choć nie jestem pewien, dlaczego).Zatem najbardziej poprawnym sposobem jest użycie
urllib.request.urlopen
funkcji do zwrócenia obiektu podobnego do pliku, który reprezentuje odpowiedź HTTP i skopiowanie go do prawdziwego pliku za pomocąshutil.copyfileobj
.Jeśli wydaje się to zbyt skomplikowane, możesz uprościć i zapisać cały plik do pobrania w
bytes
obiekcie, a następnie zapisać go w pliku. Ale działa to dobrze tylko w przypadku małych plików.Możliwe jest wyodrębnianie
.gz
(i być może innych formatów) skompresowanych danych w locie, ale taka operacja prawdopodobnie wymaga, aby serwer HTTP obsługiwał losowy dostęp do pliku.źródło
response.info().get_param('charset', 'utf-8')
zamiastutf-8
kodowania naContent-Type
outfile.write(data)
działa dobrze tylko w przypadku małych plików?Korzystam z
requests
pakietu, gdy chcę coś związanego z żądaniami HTTP, ponieważ jego interfejs API jest bardzo łatwy do uruchomienia od:najpierw zainstaluj
requests
następnie kod:
źródło
Mam nadzieję, że dobrze zrozumiałem pytanie: jak pobrać plik z serwera, gdy adres URL jest zapisany jako ciąg?
Pobieram pliki i zapisuję je lokalnie za pomocą poniższego kodu:
źródło
Tutaj możemy użyć starszego interfejsu urllib w Python3:
Następujące funkcje i klasy są przeniesione z urllib modułu Python 2 (w przeciwieństwie do urllib2). W pewnym momencie mogą stać się przestarzałe.
Przykład (kod 2-liniowy) :
źródło
Możesz do tego użyć wget, popularnego narzędzia do pobierania powłoki. https://pypi.python.org/pypi/wget To będzie najprostsza metoda, ponieważ nie trzeba otwierać pliku docelowego. Oto przykład.
źródło
Tak, zdecydowanie żądania to świetny pakiet do użycia w czymś związanym z żądaniami HTTP. ale musimy uważać na typ kodowania przychodzących danych, a poniżej znajduje się przykład wyjaśniający różnicę
źródło
Motywacja
Czasami chcemy uzyskać zdjęcie, ale nie musimy pobierać go do prawdziwych plików,
tzn. pobierz dane i zachowaj je w pamięci.
Na przykład, jeśli korzystam z metody uczenia maszynowego, wytrenuj model, który rozpozna obraz z numerem (kod kreskowy).
Gdy przeglądam niektóre witryny internetowe z tymi obrazami, dzięki czemu mogę rozpoznać model,
i nie chcę zapisywać tych zdjęć na moim dysku,
możesz wypróbować poniższą metodę, która pomoże ci zachować dane w pamięci.
Zwrotnica
w zasadzie jest jak @Ranvijay Kumar
Przykład
źródło
źródło