More

    Automatyzacja z Pythonem – pobieranie kolekcji filmów z YouTube

    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.

    Mateusz Korczyński
    Fullstack Developer orbitujący głównie wokół Javy i Reacta. Posiada 5-letnie doświadczenie komercyjne od mikroprzedsiębiorstwa po korporacje. Jednak swoje miejsce na ziemi znalazł w software housie. Miesiąc bez poznania nowego frameworka jest dla niego miesiącem straconym, więc stara się ciągle trzymać rękę na pulsie.

    Latest articles

    Automatyzacja z Pythonem – pobieranie kolekcji filmów z YouTube

    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...

    Programowanie funkcyjne w JS

    Jeśli bierzesz udział w rozmowach rekrutacyjnych na stanowisko regular lub senior developera, to pewnie niejednokrotnie miałeś lub miałaś do czynienia z takimi...

    Własny plugin do Figmy w React.js

    Jeśli udało Ci się kiedykolwiek pracować z Figmą, istnieje spora szansa, że narzędzie przypadło Ci do gustu. Tak przynajmniej było w moim...

    Wykorzystanie Virtual DOM na przykładzie Reacta

    Virtual DOM to bardzo popularne rozwiązanie znane z Reacta. Co to dokładnie jest? W jaki sposób działa w Reactcie? O tym opowie...

    Leave a reply

    Please enter your comment!
    Please enter your name here

    Related articles

    X