@m1kz

Нужно получить ссылку сайта после запроса, но как?

Есть сайт с любым сериалом (пример этот https://rezka.ag/series/thriller/9364-mister-robot... ). Нужно в питоне написать код, который нажимает кнопку на сайте или отправляет запрос, которая меняет серию, после чего узнать ссылку получившегося сайта. Но я не знаю как нажимать на кнопки или делать для этого запросы.
  • Вопрос задан
  • 1066 просмотров
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
Если запрос не сильно сложный, то можно так:
F12 в браузере -> network
Нажимаем кнопку на сайте, смотрим на первый запрос в списке и что он вернул. Если вернул html, из него можно распарить ссылку новую. Если редирект, то нужно брать новую ссылку из хедера Location.

Если запрос сложный, допустим нужна авторизация, или там через js сложно сделано, то можно использовать Selenium. Там все просто. Чтобы браузер не мозолил глаза, можно задать настройку headless.

Это в общих чертах. Если никто не сделает до завтра, то могу помочь утром.

UPD:
import requests
import time
import json
import re



BASE_URL = 'https://rezka.ag/ajax/get_cdn_series/?t={}'



def parse_quality(urls, quality=None):

    splited = urls.split(',')

    if not quality:
        using_quality = splited[-1].split('http')[0]
        print('Используем максимально доступное качество ({})'.format(using_quality))
        return splited[-1].split(' or')[0].replace(using_quality, '')

    intext_quality = '[{}p]'.format(quality)

    if intext_quality not in urls:
        print('Качества {} нет в списке доступных'.format(quality))
        
        # тут уже я не выдержал и импортировал регекс
        available_qualities = re.findall(r'\[(.+?)\]', urls)
        print('Доступные варианты: ', ', '.join(available_qualities))
        return None

    for url in splited:
        if intext_quality in url:
            return url.split(' or')[0].replace(intext_quality, '')


def get_urls(film_id, season, episode):

    payload = {'id': film_id, 'translator_id': '1', 'season': season, 'episode': episode, 'action': 'get_stream'}

    r = requests.post(BASE_URL.format(str(int(time.time()))), data=payload)

    if r.status_code != 200:
        # тут нужно будет как нибудь обработать ошибку, если запрос не прошел
        print('Ошибка')
        return

    data = json.loads(r.text)

    if data.get('success') != True:
        # тут нужно будет как нибудь обработать ошибку, если запрос не прошел
        print('Ошибка')
        print(data)
        return

    return data['url']



if __name__ == '__main__':
    
    all_urls = get_urls(9364, 1, 1)

    if all_urls:
        url = parse_quality(all_urls)

        print(url)


Параметры для get_urls:
ID фильма, можно взять по ссылке в браузере
Сезон, эпизод - тут все понятно

Параметры для parse_quality:
список ссылок с качеством
желаемое качество. Например, parse_quality(all_urls, 1080)

Если качество задано, то вернет ссылку на него, если не найдет - ошибка
Если качество не задано, то вернет максимальное доступное

ps:
если весь запустить код сверху, то он вернет 1080p, но в ссылке явно будет указано 720p. В этом ошибки нет, сайт так помечает 1080p, похоже, нет там 1080 честного)

Сырой ответ с ссылками, если интересно

[360p]https://load.hdrezka-ag.net/tvseries/cb2beeb8822647baa8621766e5a360cc3c7ae16b/aff285f2cedd0cb70b49a97e53b8c246:2020060411/240.mp4:hls:manifest.m3u8 or https://load.hdrezka-ag.net/65af9f4fab0d894043fac8887b7da99e:2020060411/tvseries/cb2beeb8822647baa8621766e5a360cc3c7ae16b/240.mp4,[480p]https://load.hdrezka-ag.net/tvseries/cb2beeb8822647baa8621766e5a360cc3c7ae16b/aff285f2cedd0cb70b49a97e53b8c246:2020060411/360.mp4:hls:manifest.m3u8 or https://load.hdrezka-ag.net/ea218fab2e907aa2093c5bc7f9cb480d:2020060411/tvseries/cb2beeb8822647baa8621766e5a360cc3c7ae16b/360.mp4,[720p]https://load.hdrezka-ag.net/tvseries/cb2beeb8822647baa8621766e5a360cc3c7ae16b/aff285f2cedd0cb70b49a97e53b8c246:2020060411/480.mp4:hls:manifest.m3u8 or https://load.hdrezka-ag.net/92bdeccddc5661b6b786659fae6adc3b:2020060411/tvseries/cb2beeb8822647baa8621766e5a360cc3c7ae16b/480.mp4,[1080p]https://load.hdrezka-ag.net/tvseries/cb2beeb8822647baa8621766e5a360cc3c7ae16b/aff285f2cedd0cb70b49a97e53b8c246:2020060411/720.mp4:hls:manifest.m3u8 or https://load.hdrezka-ag.net/d2bb808ccb6910d8317224825ee2875d:2020060411/tvseries/cb2beeb8822647baa8621766e5a360cc3c7ae16b/720.mp4

Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
total4c
@total4c
Говнокодер
Но я не знаю как нажимать на кнопки или делать для этого запросы.

Selenium
Ответ написан
Комментировать
@m1kz Автор вопроса
Методом тыка я опробовал множество различных кодов, из которых у меня получилось то, что я хотел. Кому интересен, вот небольшой код :

import requests
import json


def get_url(id, t_id, season, episode):
    '''Возвращает url видео '''
    URL = 'https://hdrezka.sh/ajax/get_cdn_series/?t=1590958856022' #const для запросов
    dict = {
             'id': id,
             'translator_id': t_id,  # озвучка
             'season': season,
             'episode': episode,
             'action': 'get_stream' #const
            }

    response = requests.post(URL, data=dict) #сам запрос

    dict = json.loads(response.text.replace("'",'"')) #Строка в словарь
    i = -1
    while dict['url'][i]!=' ':
        i-=1
    return dict['url'][i:] #Видео с лучшим качеством


Naruto = [12333, 14, 2, 38]
Mr_Robot = [9364, 1, 1, 1]

print('%d серия Наруто %d сезона : %s \n' % (Naruto[3], Naruto[2],get_url((*Naruto))))
print('%d серия Мистера Робота %d сезона : %s \n' % (Mr_Robot[3], Mr_Robot[2],  get_url((*Mr_Robot))))


Всем спасибо
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы