Mam małe narzędzie, którego używam do pobierania pliku MP3 ze strony internetowej zgodnie z harmonogramem, a następnie buduję / aktualizuje plik XML podcastu, który dodałem do iTunes.
Przetwarzanie tekstu, które tworzy / aktualizuje plik XML, jest napisane w języku Python. Jednak używam wget wewnątrz .bat
pliku Windows , aby pobrać rzeczywisty plik MP3. Wolałbym mieć całe narzędzie napisane w Pythonie.
Z trudem znalazłem sposób na pobranie pliku w Pythonie, dlatego też zdecydowałem się go użyć wget
.
Jak mogę pobrać plik za pomocą Pythona?
wget
. Między innymiwget
(1) zachowuje znaczniki czasu (2) automatycznie określa nazwę pliku z adresu URL, dołącza.1
(itp.), Jeśli plik już istnieje (3), ma wiele innych opcji, z których niektóre możesz umieścić w swoim.wgetrc
. Jeśli chcesz którekolwiek z nich, musisz je zaimplementować w Pythonie, ale łatwiej jest wywołać jewget
z Pythona.import urllib.request; s = urllib.request.urlopen('http://example.com/').read().decode()
Odpowiedzi:
W Pythonie 2 użyj urllib2, który jest dostarczany ze standardową biblioteką.
Jest to najbardziej podstawowy sposób korzystania z biblioteki, pomijając obsługę błędów. Możesz także wykonywać bardziej złożone czynności, takie jak zmiana nagłówków. Dokumentację można znaleźć tutaj.
źródło
urllib2.quote
Jeszcze jedno, używając
urlretrieve
:(do użytku w Python 3+
import urllib.request
iurllib.request.urlretrieve
)Jeszcze jeden, z „paskiem postępu”
źródło
if not os.path.isfile(file_name):
aby uniknąć nadpisywania podcastów! przydatne, gdy jest uruchamiany jako kronika z adresami URL znajdującymi się w pliku .htmlW 2012 r. Użyj biblioteki żądań python
Możesz pobiec,
pip install requests
aby go zdobyć.Żądania mają wiele zalet w porównaniu z alternatywami, ponieważ interfejs API jest znacznie prostszy. Jest to szczególnie prawdziwe, jeśli musisz dokonać uwierzytelnienia. Urllib i urllib2 są w tym przypadku dość nieintuicyjne i bolesne.
30.12.2015
Ludzie wyrazili podziw dla paska postępu. Jasne, na pewno. Obecnie dostępnych jest kilka gotowych rozwiązań, w tym
tqdm
:Zasadniczo jest to implementacja @kvance opisana 30 miesięcy temu.
źródło
r.text
Dla treści tekstowej lub Unicode. Zwrócono jako Unicode.r.content
: W przypadku treści binarnych. Zwrócone jako bajty. Przeczytaj o tym tutaj: docs.python-requests.org/en/latest/user/quickstartPlik
wb
inopen('test.mp3','wb')
otwiera plik (i usuwa każdy istniejący plik) w trybie binarnym, dzięki czemu można zapisywać z nim dane zamiast samego tekstu.źródło
file.read
który jest liczbą bajtów do odczytania. Zobacz: gist.github.com/hughdbrown/c145b8385a2afa6570e2shutil.copyfileobj(mp3file, output)
zamiast tego.Python 3
urllib.request.urlopen
urllib.request.urlretrieve
Uwaga: zgodnie z dokumentacją
urllib.request.urlretrieve
jest „starszym interfejsem” i „może stać się przestarzały w przyszłości” (dzięki gerrit )Python 2
urllib2.urlopen
(dzięki Corey )urllib.urlretrieve
(dzięki PabloG )źródło
urllib.request.urlretrieve
powyższe, przeniesie Cię do tego dokładnego linku. Twoje zdrowie!urllib.request.urlretrieve
jest udokumentowany jako „starszy interfejs” i „może stać się przestarzały w przyszłości”.użyj modułu wget:
źródło
Ulepszona wersja kodu PabloG dla Pythona 2/3:
źródło
Prosty, ale
Python 2 & Python 3
kompatybilny sposób pochodzi zsix
biblioteki:źródło
źródło
W tym celu napisałem bibliotekę wget w czystym języku Python. Jest
urlretrieve
wyposażony w te funkcje od wersji 2.0.źródło
-o
na,-O
aby uniknąć nieporozumień, tak jak jest to w GNU wget. Lub przynajmniej obie opcje powinny być prawidłowe.wget.py
prawdziwej zamiany w miejscuwget
.-o
Już zachowuje się inaczej - jest to zgodne zcurl
tym sposób. Czy informacja w dokumentacji pomogłaby rozwiązać problem? Czy jest to niezbędna cecha narzędzia o takiej nazwie, aby było kompatybilne z wierszem poleceń?Oto najczęściej używane wezwania do pobierania plików w Pythonie:
urllib.urlretrieve ('url_to_file', file_name)
urllib2.urlopen('url_to_file')
requests.get(url)
wget.download('url', file_name)
Uwaga:
urlopen
aurlretrieve
okaże się wykonać stosunkowo źle z pobieraniem dużych plików (rozmiar> 500 MB).requests.get
przechowuje plik w pamięci do momentu zakończenia pobierania.źródło
Zgadzam się z Coreyem, urllib2 jest bardziej kompletny niż urllib i prawdopodobnie powinien być modułem używanym, jeśli chcesz robić bardziej złożone rzeczy, ale aby uzupełnić odpowiedzi, urllib jest prostszym modułem, jeśli potrzebujesz tylko podstaw:
Będzie działać dobrze. Lub, jeśli nie chcesz zajmować się obiektem „response”, możesz bezpośrednio wywołać read () :
źródło
W python3 możesz używać bibliotek urllib3 i shutil. Pobierz je przy użyciu pip lub pip3 (w zależności od tego, czy python3 jest domyślny, czy nie)
Następnie uruchom ten kod
Pamiętaj, że pobierasz,
urllib3
ale używaszurllib
koduźródło
Możesz również uzyskać informację zwrotną o postępach za pomocą urlretrieve:
źródło
Jeśli masz zainstalowany wget, możesz użyć równoległego synchronizacji.
pip install równoległa_synchronizacja
Dokument: https://pythonhosted.org/parallel_sync/pages/examples.html
To jest dość potężne. Może pobierać pliki równolegle, próbować w razie awarii, a nawet pobierać pliki na zdalnym komputerze.
źródło
Jeśli prędkość ma dla ciebie znaczenie, zrobiłem mały test wydajności dla modułów
urllib
iwget
, i odnośniewget
Próbowałem raz pasku stanu, a raz bez. Wziąłem trzy różne pliki 500 MB do przetestowania (różne pliki - aby wyeliminować ryzyko buforowania pod maską). Testowany na maszynie debian z python2.Po pierwsze, są to wyniki (są podobne w różnych seriach):
Sposób, w jaki przeprowadziłem test, to użycie dekoratora „profilowego”. To jest pełny kod:
urllib
wydaje się być najszybszyźródło
Ze względu na kompletność można również wywołać dowolny program do pobierania plików za pomocą
subprocess
pakietu. Programy dedykowane do pobierania plików są bardziej wydajne niż funkcje Pythonaurlretrieve
. Na przykład,wget
może pobierać katalogi rekurencyjnie (-R
), radzić sobie z FTP, przekierowaniami, serwerami proxy HTTP, może unikać ponownego pobierania istniejących plików (-nc
) iaria2
może pobierać wiele połączeń, co może potencjalnie przyspieszyć pobieranie.W Jupyter Notebook można również wywoływać programy bezpośrednio za pomocą
!
składni:źródło
Kod źródłowy może być:
źródło
Możesz używać PycURL na Pythonie 2 i 3.
źródło
Napisałem następujące, które działają w waniliowym Pythonie 2 lub Pythonie 3.
Uwagi:
źródło
To może być trochę późno, ale widziałem kod pabloG i nie mogłem się powstrzymać od dodania systemu os.system ('cls'), aby wyglądał NIESAMOWICIE! Sprawdź to :
Jeśli działasz w środowisku innym niż Windows, będziesz musiał użyć czegoś innego niż „cls”. W systemach MAC OS X i Linux powinno być „czyste”.
źródło
cls
nie robi nic na moim OS X ani na moim serwerze Ubuntu. Pewne wyjaśnienie może być dobre.clear
Linuksa, a nawet lepiej zastąpić linię drukowania zamiast wyczyścić całą linię poleceń.os.system()
), która uruchamia podproces w celu wyczyszczenia ekranu za pomocą polecenia specyficznego dla platformy (cls
). Jak to ma jakieś pozytywne opinie? Zupełnie bezwartościowa „odpowiedź” IMHO.urlretrieve i requests.get są proste, ale w rzeczywistości nie. Pobrałem dane dla kilku witryn, w tym tekst i obrazy, powyższe dwa prawdopodobnie rozwiązują większość zadań. ale dla bardziej uniwersalnego rozwiązania sugeruję skorzystanie z urlopu. Ponieważ jest zawarty w standardowej bibliotece Python 3, Twój kod może działać na dowolnej maszynie, na której działa Python 3 bez wstępnej instalacji pakietu witryny
Ta odpowiedź stanowi rozwiązanie dla HTTP 403 Zabronione podczas pobierania pliku przez HTTP za pomocą Pythona. Próbowałem tylko żądań i modułów urllib, drugi moduł może zapewnić coś lepszego, ale tego właśnie użyłem do rozwiązania większości problemów.
źródło
Późna odpowiedź, ale
python>=3.6
możesz użyć:Zainstaluj za
dload
pomocą:źródło
Chciałem pobrać wszystkie pliki ze strony internetowej. Próbowałem,
wget
ale nie udało się, więc zdecydowałem się na trasę w języku Python i znalazłem ten wątek.Po przeczytaniu napisałem małą aplikację z linii poleceń
soupget
, rozwijając doskonałe odpowiedzi PabloG i Stana oraz dodając kilka przydatnych opcji.Korzysta z BeatifulSoup aby zebrać wszystkie adresy URL strony, a następnie pobrać te z pożądanymi rozszerzeniami. Wreszcie może pobierać wiele plików równolegle.
Oto on:
Przykładem jego użycia jest:
I prawdziwy przykład, jeśli chcesz zobaczyć to w akcji:
źródło