Internal Server Error при асинхронном парсинге

Оптимизирую парсер к асинхронному. Ответ от сервера 500, а через обычный requests все работает. В чем проблема? При работе кода в обычном "синхронном" подходе все работает, но занимает уйму времени, т.к. данных много. Далее фрагмент кода, который я пытаюсь сделать асинхронным. Насколько я понимаю, проблема именно в запросе, но могу ошибаться. Для теста беру 2 категории товаров и вывожу список data_list с JSON ответом, чтобы увидеть что в нем.

headers = {
    "Accept": "application/json, text/plain, */*",
    "Accept-Language": "en-U",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 YaBrowser/24.7.0.0 Safari/537.36"
}

data_list = []


async def get_page_data(session, id, page):        
    url=f"https://shop.deere.com/bff/v1/search?categoryId={id}&page={page}&size=24&productType=all&countryCode=US"

    async with session.post(url=url, headers=headers) as response:
        print(f"{id}/{page} data collected")
        data = await response.json()
        data_list.append(data)
        return data_list

async def gather_data():
    
    ids_for_query = ['ServiceMaintenanceKits', '5081']
    pages_for_query = [12, 27]
    
    async with aiohttp.ClientSession() as session:
        
        tasks = []

        for id, total_pages in zip(ids_for_query, pages_for_query):
            for page in range(1, total_pages + 1):
                    
                task = asyncio.create_task(get_page_data(session, id, page))
                tasks.append(task)

        await asyncio.gather(*tasks)
            

def main():
    asyncio.run(gather_data())
    print(data_list)

if __name__ == "__main__":
    main()

На выходе имею ответ по каждому запросу:

{'errors': [{'type': 'Internal Server Error', 'description': None, 'details': [{'field': None, 'code': 'JD-COMMON-006', 'message': "Content-Type 'application/octet-stream;charset=UTF-8' is not supported"}

Подскажите, как заставить это работать?


Ответы (1 шт):

Автор решения: mrgervant

Добавьте к своим заголовкам "Content-Type": "application/json":

headers = {
    "Accept": "application/json, text/plain, */*",
    "Accept-Language": "en-U",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 YaBrowser/24.7.0.0 Safari/537.36",
    "Content-Type": "application/json"
}

aiohttp по умолчанию указывает application/octet-stream (aiohttp/payload.py), а в ошибке как раз говорится, что такой тип сервисом не поддерживается:

Content-Type 'application/octet-stream;charset=UTF-8' is not supported


Обычно в документации API-сервисов указывается какие HTTP-заголовки нужно указывать, чтобы запрос был корректно обработан. Все возможные типы заголовков собраны на сайте IANA.

Подробнее можете изучить вопрос по запросу "HTTP заголовки" (пример статьи) либо в целом почитайте про протокол HTTP и его запросы (как здесь).

→ Ссылка