Spaces:
Sleeping
Sleeping
File size: 5,867 Bytes
9e6917b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
import requests
import json
import pandas as pd
import numpy as np
from fastapi import FastAPI, Query
app=FastAPI()
latitude=int(input("Enter latitude:"))
longitude=int(input("Enter longitude:"))
url1=input("Enter the restaurant url:")
outlet_code = url1.split('/')[-2]
def extract_items_with_categories(menu):
items_list = []
categories_seen = set() # Set to keep track of categories that have been added
for category in menu['categories']:
category_name = category['name']
category_position = category['position'] if category['position'] != -1 else 0
if category_name not in categories_seen:
items_list.append({
'category': category_name,
'item': None, # Placeholder for item
'itemCode': None,
'item-position': None,
'img-url': None,
'price': None,
'Description': None,
'position': category_position
})
categories_seen.add(category_name)
for item_code in category['items']:
item = next((item for item in menu['items'] if item['itemCode'] == item_code), None)
if item:
items_list.append({
'category': '', # Empty string for subsequent items in the same category
'item': item['name'],
'itemCode': item['itemCode'],
'item-position': item['position'],
'img-url': "https://f.nooncdn.com/food_production/"+item['image'],
'price': item['price'],
'Description': item['itemDesc'],
'position': category['position']
})
return items_list
def extract_options(menu):
options_dict = {}
for item in menu['items']:
if 'modifiers' in item:
for modifier_code in item['modifiers']:
modifier = next((modifier for modifier in menu['modifiers'] if modifier['modifierCode'] == modifier_code), None)
if modifier:
if item['itemCode'] not in options_dict:
options_dict[item['itemCode']] = {}
if modifier['name'] not in options_dict[item['itemCode']]:
options_dict[item['itemCode']][modifier['name']] = {
'Min': modifier.get('minTotalOptions'),
'Max': modifier.get('maxTotalOptions'),
'Options': []
}
for option in modifier['options']:
option_item = next((i for i in menu['items'] if i['itemCode'] == option['itemCode']), None)
if option_item:
options_dict[item['itemCode']][modifier['name']]['Options'].append({
'Option name': option_item['name'],
'Option price': option['price']
})
return options_dict
# Make the request
url = "https://food.noon.com/_svc/mp-food-api-mpnoon/consumer/restaurant/outlet/details/guest"
payload = {
"addressLat": latitude,
"addressLng": longitude,
"deliveryType": "default",
"outletCode": outlet_code
}
headers = {
'Connection': 'keep-alive',
"Accept": "application/json, text/plain, */*",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8,gu;q=0.7",
"Cache-Control": "no-cache, max-age=0, must-revalidate, no-store",
"Content-Type": "application/json",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36",
"Cookie": "bm_mi=791533C8E67CE8E7DA98E80ADED70F69~YAAQRK0cuOep9tGPAQAAUYKw3RcGDAVhD+mtWU8IH76wZL29zl4qqCjMwGv8sKtYlQWZNaFftSOvHFOvQU4+3CY2uHZyjjK6I3GeNdKEn+XHupISeNc0K16GOXLqcPOwu4sADTmxE7PYQvSQE7eimhqsBiJVRd96R8W0D2hl31FlY/4rl+NPZvM3iXjrn2GO50VMv+HhGfCnDMBwApBxgpMWFLfs0u6EYy44mg/FXbom5s5pa3cro8AS35nYHbdUbi61K9fnWRVaF8L/4z0xh7V1AEQETevb5fdGF8aB9m2UG29p2W6KSMb8DyFZLpG3vl5+IRECqZdFxaUMnykO8G/ynRHG~1; Domain=.noon.com; Path=/; Expires=Mon, 03 Jun 2024 12:41:22 GMT; Max-Age=7199; Secure"
}
response = requests.post(url, headers=headers, json=payload)
json_data = response.json()
# Extract items and options
items = extract_items_with_categories(json_data['data']['menu'])
options = extract_options(json_data['data']['menu'])
# Create a DataFrame for items
items_df = pd.DataFrame(items)
options_list = []
for item_code, option_groups in options.items():
for group_name, group_data in option_groups.items():
row = {
'itemCode': item_code,
'Option Group Name': group_name,
'Min': group_data.get('Min'),
'Max': group_data.get('Max')
}
for i, option in enumerate(group_data['Options']):
row[f'Option name {i+1}'] = option['Option name']
row[f'Option price {i+1}'] = option['Option price']
options_list.append(row)
# Create DataFrame for options
options_df = pd.DataFrame(options_list)
# Merge DataFrames on 'itemCode'
merged_df = items_df.merge(options_df, on='itemCode', how='left')
merged_df['category'] = merged_df['category'].replace('', np.nan).ffill()
merged_df['item'] = merged_df['item'].replace('', np.nan)
#merged_df.iloc[:, :7] = merged_df.groupby('category').apply(lambda x: x.ffill().mask(x.duplicated(), '')).reset_index(level=0, drop=True)
#merged_df['category'] = merged_df['category'].replace('', pd.NA).ffill()
merged_df.iloc[:, :7] = merged_df.iloc[:, :7].mask(merged_df.iloc[:, :7].duplicated(), '')
merged_df = merged_df.dropna(subset=['item', 'itemCode', 'item-position', 'img-url', 'price', 'Description'], how='all')
merged_df.to_excel("output3.xlsx", index=False)
|