Задать вопрос
@stantes

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

Есть такой код:

import requests

headers = {
    'Accept': '*/*',
    'Accept-language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
    'Deviceid': 'site_2a047e880327425b89fe726a55e5f479',
    'Dnt': '1',
    'Priority': 'u=1, i',
    'Referer': 'https://www.wildberries.ru/catalog/339182812/detail.aspx',
    'Sec-ch-ua': '"Not;A=Brand";v="99", "Google Chrome";v="139", "Chromium";v="139"',
    'Sec-ch-ua-mobile': '?0',
    'Sec-ch-ua-platform': '"Linux"',
    'Sec-fetch-dest': 'empty',
    'Sec-fetch-mode': 'cors',
    'Sec-fetch-site': 'same-origin',
    'User-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',
    'X-requested-with': 'XMLHttpRequest',
    'X-spa-version': '13.3.3'
}

response = requests.get(
    'https://www.wildberries.ru/webapi/product/339182812/data?subject=104&kind=1&brand=311487279&lang=ru',
    headers=headers
)
print(response.text)
print(response.status_code)

При выполнении которого я получаю ошибку 498.
Однако, есть код с использованием urllib:

from urllib import request
import json

# URL для запроса
url = 'https://www.wildberries.ru/webapi/product/339182812/data?subject=104&kind=1&brand=311487279&lang=ru'

# Заголовки запроса
headers = {
    'accept': '*/*',
    'accept-language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
    'deviceid': 'site_2a047e880327425b89fe726a55e5f479',
    'dnt': '1',
    'priority': 'u=1, i',
    'referer': 'https://www.wildberries.ru/catalog/339182812/detail.aspx',
    'sec-ch-ua': '"Not;A=Brand";v="99", "Google Chrome";v="139", "Chromium";v="139"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'empty',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'same-origin',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',
    'x-requested-with': 'XMLHttpRequest',
    'x-spa-version': '13.3.3'
}

# Формируем запрос
req = request.Request(url, headers=headers)
print(req.headers)

try:
    # Открываем соединение и выполняем запрос
    with request.urlopen(req) as resp:
        # Читаем ответ (байтовый объект)
        data_bytes = resp.read()

        # Декодируем в строку
        data_str = data_bytes.decode('utf-8')

        # Парсим JSON-строку в словарь Python
        product_data = json.loads(data_str)

        # Печать результата
        print(product_data)
except Exception as e:
    print(f"Возникла ошибка: {e}")

Который отрабатывает без проблем и возвращает нужный результат, объект JSON.
Как правильно оформить запрос, используя requests?
  • Вопрос задан
  • 422 просмотра
Подписаться 1 Простой 4 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Skillbox
    Профессия Python-разработчик + ИИ
    10 месяцев
    Далее
Решения вопроса 2
@eminsk
developer python, javascripts
Лучше использовать современную библиотеку httpx а не requests

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

import httpx

url = 'https://www.wildberries.ru/webapi/product/339182812/data?subject=104&kind=1&brand=311487279&lang=ru'
headers = {
    'accept': '*/*',
    'accept-language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
    'deviceid': 'site_2a047e880327425b89fe726a55e5f479',
    'dnt': '1',
    'priority': 'u=1, i',
    'referer': 'https://www.wildberries.ru/catalog/339182812/detail.aspx',
    'sec-ch-ua': '"Not;A=Brand";v="99", "Google Chrome";v="139", "Chromium";v="139"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'empty',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'same-origin',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',
    'x-requested-with': 'XMLHttpRequest',
    'x-spa-version': '13.3.3',
}

try:
    with httpx.Client(
        http2=True,  # включит HTTP/2, если сервер поддерживает
        headers=headers,  # без копирования на каждый запрос
        timeout=httpx.Timeout(connect=3.0, read=5.0, write=5.0, pool=5.0),
    ) as client:
        resp = client.get(url)
        resp.raise_for_status()
        print(resp.request.headers)  # аналог print(req.headers)
        print(resp.json())  # прямой парсинг JSON без лишних копий
except httpx.HTTPError as e:
    print(f"Возникла ошибка: {e}")


Результат
C:\proekts\wildberries_parser>parser4.py  

                                                                                                                                                                      Headers({'host': 'www.wildberries.ru', 'accept-encoding': 'gzip, deflate', 'connection': 'keep-alive', 'accept': '*/*', 'accept-language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7', 'deviceid': 'site_2a047e880327425b89fe726a55e5f479', 'dnt': '1', 'priority': 'u=1, i', 'referer': 'https://www.wildberries.ru/catalog/339182812/detail.aspx', 'sec-ch-ua': '"Not;A=Brand";v="99", "Google Chrome";v="139", "Chromium";v="139"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Linux"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36', 'x-requested-with': 'XMLHttpRequest', 'x-spa-version': '13.3.3'})                                                                                                 {'resultState': 0, 'value': {'data': {'brandAndSubjectUrl': '/brands/311487279-onv/kedy', 'targetInfo': {'targetUrl': 'EX', 'targetCode': 0, 'sort': 0, 'targetUrlExtended': 'EX|||||||||'}, 'sitePath': [{'id': 629, 'name': 'Обувь', 'sort': 20, 'pageUrl': '/catalog/obuv', 'topMenuRenderer': 0, 'leftMenuRenderer': 0, 'landingPage': False, 'hash': 1115844598, 'xshardKey': 'blackhole', 'xquery': 'cat=629', 'noFollow': True, 'excludeFromBreadcrumbs': False, 'isTop': False, 'isDenyLink': True, 'rawQuery': 'subject=2;739'}, {'id': 751, 'parentId': 629, 'name': 'Мужская', 'sort': 20, 'pageUrl': '/catalog/obuv/muzhskaya', 'topMenuRenderer': 0, 'leftMenuRenderer': 0, 'landingPage': False, 'hash': -5142543, 'xshardKey': 'men_shoes', 'xquery': 'cat=751', 'noFollow': False, 'excludeFromBreadcrumbs': False, 'isTop': False, 'rawQuery': 'kind=1&subject=2', 'snippet': 'sizes'}, {'id': 8194, 'parentId': 751, 'name': 'Кеды и кроссовки', 'sort': 10, 'pageUrl': '/catalog/obuv/muzhskaya/kedy-i-krossovki', 'topMenuRenderer': 0, 'leftMenuRenderer': 0, 'landingPage': False, 'hash': 363037686, 'xshardKey': 'men_shoes', 'xquery': 'cat=8194', 'noFollow': False, 'excludeFromBreadcrumbs': False, 'isTop': False, 'rawQuery': 'kind=1&subject=104;105;128;130;396;1382;1586', 'snippet': 'sizes', 'searchQuery': 'menu_redirect_subject_v2_8194 мужские кеды и кроссовки'}, {'id': 0, 'name': 'O_N_V', 'sort': 0, 'pageUrl': '/brands/311487279-onv', 'topMenuRenderer': 0, 'leftMenuRenderer': 0, 'landingPage': False, 'hash': -1593255687, 'noFollow': False, 'excludeFromBreadcrumbs': False, 'isTop': False}]}}}
Ответ написан
@dim5x
ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
Скорее всего requests детектят по фингерпринту. pyOpenSSL + cryptography меняют TLS-стек:
pip install pyOpenSSL cryptography idna certifi urllib3[secure] requests[security]


import urllib3.contrib.pyopenssl  # активирует pyOpenSSL для urllib3
urllib3.contrib.pyopenssl.inject_into_urllib3()

import requests

url = "https://www.wildberries.ru/webapi/product/339182812/data?subject=104&kind=1&brand=311487279&lang=ru"

headers = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36",
    "Accept": "*/*",
    "Referer": "https://www.wildberries.ru/catalog/339182812/detail.aspx",
    "X-Requested-With": "XMLHttpRequest",
}

response = requests.get(url, headers=headers)
print(response.status_code)
print(response.text)


>>>200
>>>{"resultState":0,"value":{"data":{"brandAndSubjectUrl":"/brands/311...


З.Ы. можно вообще без headers, потому что дело не в них.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@66demon666
Сетевой админ, АТС-админ
Исходя из тела ответа сайт просит вам капчу ввести, нужно обработать этот момент
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
ITK academy Краснодар
от 220 000 до 300 000 ₽
ITK academy Краснодар
от 75 000 ₽
DimaTech Ltd Краснодар
от 140 000 до 140 000 ₽