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 шт):
Добавьте к своим заголовкам "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 и его запросы (как здесь).