Как сканировать фильм с помощью Python?Python

Программы на Python
Ответить
Anonymous
 Как сканировать фильм с помощью Python?

Сообщение Anonymous »

Я пытаюсь загрузить фильм под названием «Шимен», который был представлен на 60-й церемонии вручения премии Golden Horse Awards. Я обнаружил ссылку на потоковую передачу:
https://www.fofoyy.com/dianying/96937
Мне не удалось найти источник видео внутри исходный код страницы, но я обнаружил два файла M3U8 в сетевых запросах, когда проверял страницу с помощью F12. Объединив их, я получил конечный URL-адрес, к которому мне нужен доступ:
https://v8.longshengtea.com/yyv8/202310 ... /hls/index .m3u8
Используя библиотеку запросов для инициирования запроса GET, я получил файлы, завершающиеся расширением .jpeg. Я попытался интерпретировать их и записать в файлы с расширением .ts, и некоторые видео можно воспроизводить.
У меня есть две стратегии:
  • Используйте цикл for для запроса каждого URL-адреса в файле M3U8.
Во-первых, это слишком медленно.
Во-вторых, некоторые успешны, а другие нет.
  • Реализуйте aiohttp для асинхронного запроса с сопрограммами.
Во-первых, это быстрее.
Во-вторых, все запросы безуспешны.
Сможет ли кто-нибудь из опытных людей мне в этом помочь? Я чрезвычайно благодарен!
mycode:
import asyncio
import aiohttp
import aiofiles
import os
import re

async def get_urls_from_m3u8(m3u8_url):
async with aiohttp.ClientSession() as session:
async with session.get(m3u8_url) as response:
if response.status == 200:
content = await response.text()
urls = re.findall(r'https?://[^\s]+\.jpeg', content)
return urls
else:
print(f"Failed to fetch M3U8 file, status code: {response.status}")
return []

async def download_image(url, directory, max_retries=3):
for attempt in range(max_retries + 1):
try:
async with aiohttp.ClientSession() as session:
async with session.get(url, timeout=30) as response:
if response.status == 200:
ts_filename = re.search(r'\d+', url.split("/")[-1]).group()
ts_filepath = os.path.join(directory, ts_filename)

async with aiofiles.open(ts_filepath, 'wb') as ts_file:
# 使用块读取的方法
while True:
chunk = await response.content.read(1024) # 每次读取1KB
if not chunk:
break
await ts_file.write(chunk)

print(f"Successfully saved {ts_filename}")
return True
else:
print(f"Failed to download {url}, status code: {response.status}")
return False
except Exception as e:
if attempt < max_retries:
print(f"Attempt {attempt + 1} failed. Retrying...")
else:
print(f"Error downloading {url}: {e}")
return False

async def main():
directory = "downloaded_files_ts"
if not os.path.exists(directory):
os.makedirs(directory)

m3u8_url = 'https://v8.longshengtea.com/yyv8/202310 ... index.m3u8'
urls = await get_urls_from_m3u8(m3u8_url)

tasks = [download_image(url, directory) for url in urls]
await asyncio.gather(*tasks)

if __name__ == '__main__':
asyncio.run(main())


Подробнее здесь: https://stackoverflow.com/questions/790 ... -by-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»