Задать вопрос
@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?
  • Вопрос задан
  • 166 просмотров
Подписаться 1 Простой 4 комментария
Решения вопроса 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
Сетевой админ, АТС-админ
Исходя из тела ответа сайт просит вам капчу ввести, нужно обработать этот момент
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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