ozon_api_helpers/products.py

81 lines
2.4 KiB
Python

import requests
import time
import os
import ast
import pandas as pd
from ozon_data import headers
# URL для первого и второго запроса
url_list = "https://api-seller.ozon.ru/v4/product/info/stocks"
url_detail = "https://api-seller.ozon.ru/v4/product/info/attributes"
product_type = "INVISIBLE"
try:
response_list = requests.post(
url_list,
headers=headers,
json={
"filter": {
"visibility": product_type,
},
"limit": 100,
},
)
response_list.raise_for_status()
data_list = response_list.json()
df_list = pd.DataFrame(data_list["items"])
df_list['stocks'] = df_list['stocks'].apply(
lambda x: ast.literal_eval(x.replace("'", '"')) if isinstance(x, str) else x
)
stocks_df = pd.json_normalize(df_list['stocks'].str[0])
df_list = pd.concat([df_list, stocks_df], axis=1)
response_detail = requests.post(
url_detail,
headers=headers,
json={
"filter": {
"product_id": df_list["product_id"].to_list(),
},
"limit": 1000
},
)
response_detail.raise_for_status()
data_detail = response_detail.json()
df_detail = pd.DataFrame(data_detail["result"])
# Объединяем по id и product_id
df = pd.merge(
df_detail,
df_list,
left_on="id",
right_on="product_id",
how="inner" # или 'left', 'right', 'outer' в зависимости от задачи
)
# print("Результат:", result)
output_dir = "result"
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# Получаем имя текущего скрипта без расширения
script_name = os.path.splitext(os.path.basename(__file__))[0]
filename = "_".join([script_name, product_type])
csv_filename = os.path.join(output_dir, f"{filename}_output.csv")
xls_filename = os.path.join(output_dir, f"{filename}_output.xlsx")
df.to_csv(csv_filename, encoding="utf-8")
df.to_excel(xls_filename)
print(f"Данные успешно сохранены в {csv_filename}")
except requests.exceptions.RequestException as e:
print(f"Ошибка при выполнении запроса: {e}")
print(e)
except ValueError as e:
print(f"Ошибка обработки данных: {e}")