Web-Scraping | При парсинге данных ошибки 400, 401 и 403

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

Начал изучать способы Web-Scraping'а и столкнулся с такой проблемой как ошибки 400, 401 и 403 при получении фалов в Json формате.

Для примера взял сайт Магнита, и была цель на выходе из программы получать карточки товаров.(https://magnit.ru/promo/) введите сюда описание изображения

введите сюда описание изображения Как видно на прикреплённых скриншотах, нужные мне данные отображаются корректно и на выходе я получаю их в Json формате. Однако, если я захочу открыть этот файл в другом окне, то получаю такую картину: введите сюда описание изображения введите сюда описание изображения

И это даже не касается Headrs или то что я сижу через WebDriver на Silenium. Я просто захожу туда со своего обычного браузера и не могу получить доступ к этому словарю.

И вот хочу узнать в чём проблема и каким образом её можно решить? Или же это проблема с фаерволом, то что он фильтрует запросы и допускает к этому API только админов?(Но как тогда я получаю доступ к этому файлу на главной странице и в ответе получаю все эти карточки?) Может есть какие-нибудь библиотеки на Python, чтобы можно было как-то выгружать этот файл?

Да, конечно есть костыли, как можно это решить опять же через Selenium, просто прогружать всю страницу и через page_source и по итогу получать HTML файл, который можно спокойно пропарсить и получить эти карточки, однако этот способ мне совсем не нравиться, так как всё зависит от стабильного подключения к самому сайту, которое не всегда может быть и код просто работает дольше(из-за наагрузок могут выходить исключения на подобии TimeoutExeption и по итогу мне по новой придётся долго ждать, когда он прогрузит все страницы и сохранит мне их все в нужную мне директорию).

Ответы

▲ 0Принят

Решить данную проблему я смог с помощью обычных headers которые я скопировал с ответа JS'a как Node.js fetch: введите сюда описание изображения Далее я просто вставил все эти данные в свой код и подкорректировал так, чтобы интерпретатор Python'a мог понять, что это словарь:

import requests

URL = "https://web-gateway.middle-api.magnit.ru/v1/promotions?offset=36&limit=36&storeId=94537&sortBy=priority&order=desc&adult=true"
headers = {
    "accept": "*/*",
    "accept-language": "ru,ru-RU;q=0.9,en-RU;q=0.8,en-US;q=0.7,en;q=0.6",
    "sec-ch-ua": "\"Not/A)Brand\";v=\"99\", \"Google Chrome\";v=\"115\", 
\"Chromium\";v=\"115\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\"",
    "sec-fetch-dest": "empty",
    "sec-fetch-mode": "cors",
    "sec-fetch-site": "same-site",
    "x-app-version": "0.1.0",
    "x-client-name": "magnit",
    "x-device-id": "ie5h31ju1n",
    "x-device-platform": "Web",
    "x-device-tag": "disabled",
    "x-platform-version": "window.navigator.userAgent",
    "Referer": "https://magnit.ru/",
    "Referrer-Policy": "origin"
  }

response = requests.get(URL, headers=headers)
print(response.text)

После выполнения данного кода, я получаю нужные мне данные в Json формате.

P.S. правда я так и не понял, почему когда я раньше вставлял headers, которые присутствуют в ответе HTML фалом, он мне не давал доступ к этому Json