Как программно загрузить видео m3u8, на которое ссылается большой двоичный объект в Python?

Обратите внимание, что этот вопрос отличается от Как мы загружаем видео с URL-адресом большого двоичного объекта [ закрытый], поскольку он не требует взаимодействия человека с браузером.

У меня есть следующая проблема:

  • У меня есть список URL-адресов. Они указывают на HTML-страницы, имеющие одинаковую базовую структуру.
  • В середине страницы есть изображение; при нажатии загружается плеер.
  • Плеер как блоб ссылается на плейлист m3u8, хотя это не видно в самом HTML (он виден на вкладке «Сеть» в Chrome).
  • Плеер транслирует короткое видео.

Что я должен сделать:

  • Программно получить доступ к различным URL-адресам. Получите HTML и нажмите на проигрыватель изображений.
  • Получите ссылку на большой двоичный объект и используйте ее, чтобы получить список воспроизведения m3u8.
  • Скачать стрим в виде видео (бонусные баллы за скачивание в формате gif).

Обратите внимание, что решение не требует взаимодействия человека с браузером. С точки зрения API вход должен быть списком URL-адресов, а вывод — списком видео/гифок.

Пример страницы можно найти здесь на случай, если вы захотите протестировать свое решение.

Насколько я понимаю, я могу использовать Selene, чтобы получить HTML и щелкнуть изображение, чтобы запустить проигрыватель. Однако я понятия не имею, как обработать блоб, чтобы получить m3u8, а затем использовать его для реального видео.


person Edgar Derby    schedule 18.03.2021    source источник


Ответы (1)


При небольшом копании вам не нужно нажимать какие-либо кнопки. Когда вы нажимаете кнопки, он вызывает файл master.m3u8. Используя инструменты разработчика, вы можете собрать запрошенный URL-адрес. Дело в том, что первый файл не содержит ссылок на настоящее видео. Вы собираете воедино еще один запрос, чтобы получить окончательный файл m3u8. Оттуда вы можете использовать другие ссылки SO для загрузки видео. Он сегментирован, поэтому его не просто скачать. Вы можете раскомментировать операторы печати ниже, чтобы увидеть, что содержит каждый файл m3u8. Это также будет перебирать страницы

 import re
 for i in range(6119, 6121):
    url = 'https://www2.nhk.or.jp/signlanguage/sp/enquete.cgi?dno={}'.format(str(i))
    page = requests.get(url)
    soup = BeautifulSoup(page.text, 'html.parser')
    print(soup.find(onclick=re.compile('signlanguage/movie'))) # locate the div that has the data we need

    video_id = soup.find(onclick=re.compile('signlanguage/movie')).get('onclick').split(',')[1].replace("'","")
    m3u8_url = 'https://nhks-vh.akamaihd.net/i/signlanguage/movie/v4/{}/{}.mp4/master.m3u8'.format(video_id[-1], video_id)
    # this m3u8 file doesn't contain download links, the next one does; so download and save that one
    r = requests.get(m3u8_url)
    # print(r.text)
 
    m3u8_url_2 = r.text.split('\n')[2] # get first link; high bandwidth
    r2 = requests.get(m3u8_url_2)
    # print(r2.text)
        
    # there are other ways to download the file, i'm just creating a new one with the data read and writing to a file
    fn = video_id + '.m3u8'
    with open(fn, 'w+') as f:
        f.write(r2.text)
        f.close()
person Jonathan Leon    schedule 18.03.2021