@suzo
17 лет, программист самоучка

Как мне решить проблему когда сервер вместо json отдает html?

В общем есть запрос на сайте который по всей логике должен отдавать json (так как все заголовки я передаю), но вместо json отдает html разметку с функциями js. На скрине ниже как раз представлен этот запрос.
6592d42e9ce90917430434.png
Я на другом форуме спросил в чем может быть проблема, мне посоветовали разобрать html и попытаться достать с этого кода куки, что бы сделать повторный запрос с этими уникальными куками. Я получил куки, и попытался сделать запрос через session, но все тщетно. Сервер отдает все то что отдавал и при первом запросе, подобную html разметку, только уже с другими данными.
Я сделал запрос через браузер, и через браузер все работает, я посмотрел какие куки нужны серверу. Их названия spid и spsc может кому-то это что то говорит.
Вот мой python код.
headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'ru-RU,ru;q=0.9',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive',
        'Host': 'e-disclosure.ru',
        'Sec-Fetch-Dest': 'document',
        'Sec-Fetch-Mode': 'navigate',
        'Sec-Fetch-Site': 'none',
        'Sec-Fetch-User': '?1',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"'
    }
    session = requests.Session()
    url = 'http://e-disclosure.ru/api/events/page'
    response = session.get(url, headers=headers)
    # Получаем приватный ключ RSA PEM
    PRIVKEY = re.search(r"-----BEGIN RSA PRIVATE KEY-----?(\n|.)+-----END RSA PRIVATE KEY-----", response.text).group()

    # Получаем сообщение в шестнадцатеричном типе
    hex_message = re.search(r"(?<=\.decrypt\(\").+(?=\")", response.text).group()
    # Формируем в байтовом представлении
    decoded_message = bytes.fromhex(hex_message)

    # Переводим в стандартный вид сообщения RSA
    crypted_text = base64.b64encode(decoded_message)
    privkey = rsa.PrivateKey.load_pkcs1(
        PRIVKEY,
    )

    # Обратно формируем в нужное байтовое представление
    crypted_text = base64.b64decode(crypted_text.decode())
    # Получаем расшифрованное сообщение
    message = rsa.decrypt(crypted_text, privkey)
    print(str(message)[2:-1])
    cookie = {"spsc": str(message)[2:-1]}
    headers['Cookie'] = f"spsc={str(message)[2:-1]}"
    response = session.get("https://e-disclosure.ru/api/events/page?companyId=3043&year=2023", cookies=cookie, headers=headers)
    print(response.text)
  • Вопрос задан
  • 368 просмотров
Решения вопроса 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Прежде всего надо понять, что защиту от парсинга пишут не дураки. И так же то, что все защиты разные. Как только в интернете появляется гарантировано работающий рецепт обхода какой-то за защиты, ей сразу меняют. Поэтому в каждом отдельном случае приходится искать способ обхода защиты самостоятельно и быть умнее её разработчиков. В каких-то случаях, вы боретесь с подростком-фралансером, пишущим код для маленького бизнеса со скромным бюджетом, тогда вам придётся столкнуться с чем-то типа проверки заголовков, csrf и тому подобными простыми штуками. В каком-то, вы боретесь с корпорацией, в которой целый отдел отличных опытных разработчиков пишет поведенческий фильтр и валидацию на клиентской стороне. В последнем случае вам придётся применять Selenium, ежемесячно платить за прокси и так же ежемесячно править довольно сложный алгоритм, притворяющий группой людей.
Ответ написан
Комментировать
@suzo Автор вопроса
17 лет, программист самоучка
Решить проблему можно с помощью библиотеки на python curl_cffi
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы