Automatyzacja czynności, które są czasochłonne, to według mnie największa zaleta nauki programowania. Często zadania wymagające od nas klikania, czekania i przepisywania captchy mogą być zrealizowane znacznie szybciej i bez naszej obecności. Jestem właśnie po lekturze świetnej książki, którą z czystym sumieniem mogę wam polecić. Jest to “Automatyzacja nudnych zadań z Pythonem. Nauka programowania” autorstwa Al Sweigart. W niniejszej pozycji autor w czytelny sposób opisuje jak wykonać programy ułatwiające nam życie. Poza tym prezentuje też całą masę pomysłów na to, co możemy zautomatyzować.
W ostatnim czasie miałem do pobrania kilkadziesiąt filmików (głównie z YouTube). Zainspirowany książką, postanowiłem, że napiszę prosty skrypt, który omijając korzystanie z rozwiązań firm trzecich pozwoli mi na pobranie i odpowiednie nazwanie filmików.
Wyznaję zasadę używania odpowiedniego narzędzia do wykonywanej pracy. Dlatego ten skrypt będzie napisany przy użyciu Pythona. Na wstępie uprzedzam, że korzystam z niego tylko hobbystycznie, więc kod ma działać, a nie wyglądać.
Opis skryptu
Do realizacji tego zadania będziemy potrzebować zainstalowanego Pythona w wersji 3.6 oraz pip. Za pomocą tego drugiego pobierzemy następujące biblioteki: pytube ( ), pandas, requests, os.path. Przy użyciu kilkudziesięciu linii kodu pobierzemy dane z pliku .csv oraz wszystkie filmiki do jednego folderu, nazywając każdy z nich w odpowiedni sposób.
Schemat danych
Stworzyłem arkusz składający się z trzech kolumn: nazwy, linku i flagi czy jest to link do YouTube. Link do mojego przykładowego arkusza z granatami do Counter Strike Global Offensive znajduje się tutaj: https://gist.githubusercontent.com/korczynsk1/8f5af99f9cb87da129566f9cd5c324c6/raw/2811a5551a4687391eda9f64801ce7332a11d8c7/granada.csv.
To, co cenię w Pythonie to minimalizm. Tak będzie wyglądał kod do załadowania danych z pliku oraz iterowanie po wierszach z arkusza:
import pandas as pd
df = pd.read_csv('https://gist.githubusercontent.com/korczynsk1/8f5af99f9cb87da129566f9cd5c324c6/raw/2811a5551a4687391eda9f64801ce7332a11d8c7/granada.csv')
print(df)
for index, row in df.iterrows():
print(row['name'])
Pobieranie plików z sieci
Do filmów z sieci, udostępnionych bez żadnego dodatkowego kodowania, jak w przypadku filmów z YouTube’a, użyjemy biblioteki requests i zapiszemy je na dysku w odpowiednim folderze. Jako że mamy flagę określającą filmy spoza platformy YouTube, w ich przypadku wyciągniemy je zapytaniem GET i przy użyciu biblioteki os.path zapiszemy pobrany plik w folderze:
r = requests.get(row['link'], allow_redirects=True)
filePath = os.path.join(save_path, row['name']+'.mp4')
open(filePath, 'wb').write(r.content)
Pobieranie plików z YouTube’a
Nastąpił czas na ostatni, a zarazem najważniejszy element układanki, czyli wykorzystanie biblioteki pytube do pobrania plików z YouTube’a.
Dokładna dokumentacja biblioteki znajduje się tutaj: https://github.com/nficano/pytube. Sam zdecydowałem się na pobranie plików w formacie .mp4 z najwyższą możliwą jakością. Niestety, dostarczona funkcja get_highest_resolution() nie spełniła oczekiwań. Zamiast pobrania filmów w formacie 1080p i 60 klatkach, zrobiła to tylko w formacie 720p. Poniższy kod wybiera najwyższą dostępną rozdzielczość i pobiera film do określonej ścieżki.
from pytube import YouTube
if row['is youtube link']:
video = YouTube(row['link'])
clip = video.streams.filter(mime_type="video/mp4").order_by("itag").last()
clip.download(save_path, row['name'])
Oczywiście, występują sytuacje, w których pojawiają się błędy. Bez ich obsłużenia skrypt by się przerywał. W celu zapobiegania takim sytuacjom, dodałem obsługę, tych błędów, na które napotkałem.
from urllib.error import HTTPError
from pytube.exceptions import RegexMatchError
try:
if row['is youtube link']:
#
else:
#
except RegexMatchError:
print('cannot open: ' + row['link'] + '\n')
except HTTPError:
print('url 404: ' + row['link'] + '\n')
else:
print(row)
Podsumowanie
Za każdym razem, gdy zrealizuję takie zadania z Pythonem, jestem pod głębokim wrażeniem jak mało linii kodu jest potrzebne do jego wykonania. Dzisiaj poznaliśmy jak czytać dane z pliku .csv, pobierać dane z sieci oraz pobierać filmy z YouTube’a do określonego folderu. Mam nadzieję, że kod Wam się przyda. W razie pytań, albo żeby pochwalić się swoim kodem, zapraszam do komentowania. Kod skrypty znajduje się tutaj: https://gist.github.com/korczynsk1/0f6bf488407fb159d809ea06f00fd28a.