Парсер на Python. Ошибка requests.exceptions.TooManyRedirects: Exceeded 30 redirects

Рейтинг: -1Ответов: 1Опубликовано: 13.03.2023

Недавно начал изучать python, пытаюсь написать простой парсер на Python 3.11 с помощью библиотеки requests. Выдает следующую ошибку: requests.exceptions.TooManyRedirects: Exceeded 30 redirects. Как это можно исправить?

Ошибка:

requests.exceptions.TooManyRedirects: Exceeded 30 redirects.

Вот мой код:

import requests


def get_data():

    cookies = {
            '__lhash_': 'ed9dd81d6073446bb3fe453c7657a512',
            'MVID_ACTOR_API_AVAILABILITY': 'true',
            'MVID_BLACK_FRIDAY_ENABLED': 'true',
            'MVID_CART_AVAILABILITY': 'true',
            'MVID_CATALOG_STATE': '1',
            'MVID_CITY_ID': '47916277',
            'MVID_COOKIE': '2500',
            'MVID_CREDIT_AVAILABILITY': 'true',
            'MVID_CRITICAL_GTM_INIT_DELAY': '3000',
            'MVID_FILTER_CODES': 'true',
            'MVID_FILTER_TOOLTIP': '1',
            'MVID_FLOCKTORY_ON': 'true',
            'MVID_GEOLOCATION_NEEDED': 'true',
            'MVID_GIFT_KIT': 'true',
            'MVID_GLC': 'true',
            'MVID_GLP': 'true',
            'MVID_GTM_ENABLED': '011',
            'MVID_INTERVAL_DELIVERY': 'true',
            'MVID_IS_NEW_BR_WIDGET': 'true',
            'MVID_KLADR_ID': '4300700005400',
            'MVID_LAYOUT_TYPE': '1',
            'MVID_LP_SOLD_VARIANTS': '3',
            'MVID_MCLICK': 'true',
            'MVID_MCLICK_NEW': 'true',
            'MVID_MINDBOX_DYNAMICALLY': 'true',
            'MVID_MINI_PDP': 'true',
            'MVID_NEW_ACCESSORY': 'true',
            'MVID_NEW_LK_CHECK_CAPTCHA': 'true',
            'MVID_NEW_LK_OTP_TIMER': 'true',
            'MVID_NEW_MBONUS_BLOCK': 'true',
            'MVID_PROMO_CATALOG_ON': 'true',
            'MVID_REGION_ID': '89',
            'MVID_REGION_SHOP': 'S940',
            'MVID_SERVICES': '111',
            'MVID_TIMEZONE_OFFSET': '3',
            'MVID_TYP_CHAT': 'true',
            'MVID_WEB_SBP': 'true',
            'SENTRY_ERRORS_RATE': '0.1',
            'SENTRY_TRANSACTIONS_RATE': '0.5',
            'MVID_GUEST_ID': '22372453742',
            'MVID_VIEWED_PRODUCTS': '',
            'wurfl_device_id': 'generic_web_browser',
            'JSESSIONID': 'j7RGkTcTLmcVF9rxSQ3ZqWrhqHtvkM3QMPbJGm1w6wGxpjRgyvfC!-1094882547',
            'MVID_CALC_BONUS_RUBLES_PROFIT': 'true',
            'NEED_REQUIRE_APPLY_DISCOUNT': 'true',
            'MVID_CART_MULTI_DELETE': 'true',
            'PROMOLISTING_WITHOUT_STOCK_AB_TEST': '2',
            'MVID_GET_LOCATION_BY_DADATA': 'DaData',
            'PRESELECT_COURIER_DELIVERY_FOR_KBT': 'false',
            'HINTS_FIO_COOKIE_NAME': '1',
            'searchType2': '2',
            'COMPARISON_INDICATOR': 'false',
            'CACHE_INDICATOR': 'false',
            'MVID_NEW_OLD': 'eyJjYXJ0IjpmYWxzZSwiZmF2b3JpdGUiOnRydWUsImNvbXBhcmlzb24iOnRydWV9',
            'MVID_OLD_NEW': 'eyJjb21wYXJpc29uIjogdHJ1ZSwgImZhdm9yaXRlIjogdHJ1ZSwgImNhcnQiOiB0cnVlfQ==',
            'flacktory': 'no',
            'BIGipServeratg-ps-prod_tcp80': '2953108490.20480.0000',
            'bIPs': '-1323973254',
            '__hash_': '15bb5b41f7e7d58650e620c527a22e19',
            'MVID_ENVCLOUD': 'prod2',
        }

    headers = {
            'authority': 'www.mvideo.ru',
            'accept': 'application/json',
            'accept-language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
            'baggage': 'sentry-transaction=%2F,sentry-public_key=1e9efdeb57cf4127af3f903ec9db1466,sentry-trace_id=38269ba9075848d38494e9f5b2c98dd9,sentry-sample_rate=0.5',
            # 'cookie': '__lhash_=ed9dd81d6073446bb3fe453c7657a512; MVID_ACTOR_API_AVAILABILITY=true; MVID_BLACK_FRIDAY_ENABLED=true; MVID_CART_AVAILABILITY=true; MVID_CATALOG_STATE=1; MVID_CITY_ID=47916277; MVID_COOKIE=2500; MVID_CREDIT_AVAILABILITY=true; MVID_CRITICAL_GTM_INIT_DELAY=3000; MVID_FILTER_CODES=true; MVID_FILTER_TOOLTIP=1; MVID_FLOCKTORY_ON=true; MVID_GEOLOCATION_NEEDED=true; MVID_GIFT_KIT=true; MVID_GLC=true; MVID_GLP=true; MVID_GTM_ENABLED=011; MVID_INTERVAL_DELIVERY=true; MVID_IS_NEW_BR_WIDGET=true; MVID_KLADR_ID=4300700005400; MVID_LAYOUT_TYPE=1; MVID_LP_SOLD_VARIANTS=3; MVID_MCLICK=true; MVID_MCLICK_NEW=true; MVID_MINDBOX_DYNAMICALLY=true; MVID_MINI_PDP=true; MVID_NEW_ACCESSORY=true; MVID_NEW_LK_CHECK_CAPTCHA=true; MVID_NEW_LK_OTP_TIMER=true; MVID_NEW_MBONUS_BLOCK=true; MVID_PROMO_CATALOG_ON=true; MVID_REGION_ID=89; MVID_REGION_SHOP=S940; MVID_SERVICES=111; MVID_TIMEZONE_OFFSET=3; MVID_TYP_CHAT=true; MVID_WEB_SBP=true; SENTRY_ERRORS_RATE=0.1; SENTRY_TRANSACTIONS_RATE=0.5; MVID_GUEST_ID=22372453742; MVID_VIEWED_PRODUCTS=; wurfl_device_id=generic_web_browser; JSESSIONID=j7RGkTcTLmcVF9rxSQ3ZqWrhqHtvkM3QMPbJGm1w6wGxpjRgyvfC!-1094882547; MVID_CALC_BONUS_RUBLES_PROFIT=true; NEED_REQUIRE_APPLY_DISCOUNT=true; MVID_CART_MULTI_DELETE=true; PROMOLISTING_WITHOUT_STOCK_AB_TEST=2; MVID_GET_LOCATION_BY_DADATA=DaData; PRESELECT_COURIER_DELIVERY_FOR_KBT=false; HINTS_FIO_COOKIE_NAME=1; searchType2=2; COMPARISON_INDICATOR=false; CACHE_INDICATOR=false; MVID_NEW_OLD=eyJjYXJ0IjpmYWxzZSwiZmF2b3JpdGUiOnRydWUsImNvbXBhcmlzb24iOnRydWV9; MVID_OLD_NEW=eyJjb21wYXJpc29uIjogdHJ1ZSwgImZhdm9yaXRlIjogdHJ1ZSwgImNhcnQiOiB0cnVlfQ==; flacktory=no; BIGipServeratg-ps-prod_tcp80=2953108490.20480.0000; bIPs=-1323973254; __hash_=15bb5b41f7e7d58650e620c527a22e19; MVID_ENVCLOUD=prod2',
            'referer': 'https://www.mvideo.ru/noutbuki-planshety-komputery-8/noutbuki-118/f/skidka=da/tolko-v-nalichii=da/reiting-pokupatelei=ot-4',
            'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"',
            'sec-ch-ua-mobile': '?0',
            'sec-ch-ua-platform': '"macOS"',
            'sec-fetch-dest': 'empty',
            'sec-fetch-mode': 'cors',
            'sec-fetch-site': 'same-origin',
            'sentry-trace': '38269ba9075848d38494e9f5b2c98dd9-b0b61b9ddf6ea398-1',
            'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
            'x-set-application-id': '92579efa-b3e0-4be9-800f-57f6eda6e171',
        }

    params = {
            'categoryId': '118',
            'offset': '0',
            'limit': '24',
            'filterParams': [
                'WyJza2lka2EiLCIiLCJkYSJd',
                'WyJ0b2xrby12LW5hbGljaGlpIiwiIiwiZGEiXQ==',
                'WyJyZWl0aW5nLXBva3VwYXRlbGVpIiwiIiwib3QtNCJd',
            ],
            'doTranslit': 'true',
        }

    response = requests.get('https://www.mvideo.ru/bff/products/listing', params=params, cookies=cookies,
                            headers=headers).json()
    print(response)


def main():
    get_data()


if __name__ == '__main__':
    main()

Ответы

▲ 1Принят

Возможно срабатывает защита от скрапинга, но это не точно, но следующее решение должно помочь. По сути нам необходимо получить только первое перенаправление отключив его allow_redirects=False, потом вытащить место из заголовков, куда нас пытаются отправить response.headers['Location'], а дальше отправить ещё один запрос и мы получаем искомые данные.

.....
    session = requests.Session()
    response = session.get(
        'https://www.mvideo.ru/bff/products/listing',
        params=params,
        cookies=cookies,
        headers=headers,
        allow_redirects=False # Запрещаем перенаправление
        )
    redirect_url = response.headers['Location'] # Достаём путь, куда нас пытается отправить сайт
    redirect_url = f'https://www.mvideo.ru{redirect_url}' # Формируем путь, для следующего запроса
    response2 = session.get(
        redirect_url,
        headers=headers,
        cookies=cookies,
        allow_redirects=True # Разрешаем перенаправление
        )
    print(response2.json())
        


def main():
    get_data()


if __name__ == '__main__':
    main()