Как спарсить наличие товара в определенном городе sportmaster
Требуется спарсить наличие товара в определенном городе. Для этого я посмотрел запрос https://www.sportmaster.ru/events-api/v1/page-view/, в который передаются данные о городе. Написал следующий код:
cookies = {
'UDID': '1c4ed12e-44ce-4d9d-a40d-2b66b9dc4649',
'SMID': 'eyJhbGciOiJSUzI1NiJ9.eyJqdGkiOiJmNzJmMTVhNy03YTIxLTQ3ZmQtOTIxMy03NDcwMTc0NDUyOWUiLCJpc3MiOiJTTTMwIiwiaWF0IjoxNjg3Nzk1NjgyLCJhdWQiOiJzcG9ydG1hc3RlciIsImFuVCI6ImU4YzdkZTc2LTUwMGItNDY3MS1iOTcxLWNlYzE3YzE1N2VlYyIsImFuUCI6ImU0OTkyMmI0LTI5NjEtNGQ4YS05MzQ3LTIwNmIwNzM2YjAzNyIsImFuVSI6IjEwMDAwMDAwNjU1MzUyNjQ5MyIsImNhblAiOiJBSUFna3RPaVBYYm40cklvb1dCMjA3SmhhU3dBQlMvb0tETCtLUW9NeEhCQjZJUzNUNWZYbExEb0Y1Qnc3NlJ3UGdQUlltOWhMZDBGaHlyTkg1SG5tdTVBVDlHck9RRGFVdTV0NkswWFY3dnppMGhqMmxSbGVlMXhHd3JGRWhadHB2RGJDRWc1Sm1rTGtKRjVFN3ZraG1IcEtYYXVoVGV2Z3Ewd3I5SE9jcVZrSEswaWtNbnk2MXlZLzI4dEh3SExEaVp4WWN0V3VuWWdIeVh4OU8xU3FEMkgrcVhGYWU0WXFWUmczclpBcFl1STZLUjFENlNQL2NVYTBqM0dUOW9UMlFrPSIsImNhblQiOiJBSUFvN3JrNnBIbTNQQmRoVDNYUDI4Ky83YmJGWXNCb2hHY0Z2bGQyblVZcHEvVGhzL0NWLzhNSVYxeXR5WFNnclFiMXdEQUpZZytrM0lzTHZyWlZMUkFKanlMZnFEdC9SZ29OdC9rcmxEMmh1QmZseVJkdmhGMjZRb0toV2p2b2E2dWt5U3FHcFJQQytMUE5kTjVHYUJLaTREQTA4NHRJOUVIVitHS1Z1aEpxM0VSckhjNnEzaEtuMjlWVWxEZVBDQ1pwanRZMURicm9FWVpXVFlubWh2SE9yM3VUdkpKQXhCS2xNL3dibHBjN3o2VER5azU0bk9sY3kxdjU0R3pLT2dJPSIsInYiOiJWMiJ9.GNhsG76fmvZ6uS-JHH8ZMrnQfwdvcgqBDdinz6mZ9BF5QqDJVVO9kfxQunL78RUDhaZZn0D8JN5nQqaHW_jOl8ByypOnZqi5r8pyLuPQC_-kM8amTtlAl9Y7xHEDIPMXnLra4glh6ywN2qlQrJ3B9LEJeVw6qhrnmq6C0C0Y6j1d79oxPCptcqoPXAmtp53Qt2vbsIm5_EwtzD51yDGulgWgPwyGHcJ2qdp3Dro1HzNP9vjgBKyRfc4vuU17rDIzfXcV6TKhvxXxUboIXIRcHe6LsNz0lfKYMVoYd0FTsosYq6foNA3QXK_JyVk9WnPcNKSJluWhFPCr0LiVT198Wg',
'SMAUTH': 'eyJpZCI6ImU0OTkyMmI0LTI5NjEtNGQ4YS05MzQ3LTIwNmIwNzM2YjAzNyIsInN0IjoiUkVUVVJORUQiLCJ0bSI6MTY4Nzg1NDY5MH0=',
'utm_paidsource': 'google',
'userAuth': '0',
'_ga_Z7E27793QJ': 'GS1.1.1688481869.21.0.1688481869.60.0.0',
'_ga': 'GA1.2.1724500244.1687795689',
'gdeslon.ru.__arc_domain': 'gdeslon.ru',
'gdeslon.ru.user_id': '181c83c2-a4d6-4030-82cc-f3d72f0bc5ee',
'tmr_lvid': 'dbaf907f2b8e4dac50ff1eec440d5909',
'tmr_lvidTS': '1650745384547',
'_ym_uid': '1650745429154025559',
'_ym_d': '1687795691',
'adrcid': 'AVd4ft9sZ85UM-cOWWQMNXw',
'userId': '100000006553523997',
'ab_frisbuy': '2',
'_ga_R1JBBZ02M3': 'GS1.2.1688481871.12.0.1688481871.0.0.0',
'srv_id': '9c935903a1a5983603abc5cf9e24b037',
'_gid': 'GA1.2.1373342858.1688403759',
'tmr_detect': '0^%^7C1688490079939',
#0^%^7C1688481872182
'qrator_jsr': '1688481860.838.eweLhnV1NkyL5FJQ-0e5putb94ioejoh36332jk47btdo9sov-00',
'qrator_jsid': '1688481860.838.eweLhnV1NkyL5FJQ-0pr3bc4a5ua06qudbko7visl1e2hcqj9',
'spcount': '0',
'_dc_gtm_UA-3450216-4': '1',
'_dc_gtm_UA-3450216-27': '1',
'_ym_isad': '2',
'_ym_visorc': 'w',
'_gat_frisbuyGa': '1',
}
headers = {
'User-Agent': user_agent,
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
# 'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Referer': 'https://www.sportmaster.ru/',
# 'Cookie': 'UDID=1c4ed12e-44ce-4d9d-a40d-2b66b9dc4649; SMID=eyJhbGciOiJSUzI1NiJ9.eyJqdGkiOiJmNzJmMTVhNy03YTIxLTQ3ZmQtOTIxMy03NDcwMTc0NDUyOWUiLCJpc3MiOiJTTTMwIiwiaWF0IjoxNjg3Nzk1NjgyLCJhdWQiOiJzcG9ydG1hc3RlciIsImFuVCI6ImU4YzdkZTc2LTUwMGItNDY3MS1iOTcxLWNlYzE3YzE1N2VlYyIsImFuUCI6ImU0OTkyMmI0LTI5NjEtNGQ4YS05MzQ3LTIwNmIwNzM2YjAzNyIsImFuVSI6IjEwMDAwMDAwNjU1MzUyNjQ5MyIsImNhblAiOiJBSUFna3RPaVBYYm40cklvb1dCMjA3SmhhU3dBQlMvb0tETCtLUW9NeEhCQjZJUzNUNWZYbExEb0Y1Qnc3NlJ3UGdQUlltOWhMZDBGaHlyTkg1SG5tdTVBVDlHck9RRGFVdTV0NkswWFY3dnppMGhqMmxSbGVlMXhHd3JGRWhadHB2RGJDRWc1Sm1rTGtKRjVFN3ZraG1IcEtYYXVoVGV2Z3Ewd3I5SE9jcVZrSEswaWtNbnk2MXlZLzI4dEh3SExEaVp4WWN0V3VuWWdIeVh4OU8xU3FEMkgrcVhGYWU0WXFWUmczclpBcFl1STZLUjFENlNQL2NVYTBqM0dUOW9UMlFrPSIsImNhblQiOiJBSUFvN3JrNnBIbTNQQmRoVDNYUDI4Ky83YmJGWXNCb2hHY0Z2bGQyblVZcHEvVGhzL0NWLzhNSVYxeXR5WFNnclFiMXdEQUpZZytrM0lzTHZyWlZMUkFKanlMZnFEdC9SZ29OdC9rcmxEMmh1QmZseVJkdmhGMjZRb0toV2p2b2E2dWt5U3FHcFJQQytMUE5kTjVHYUJLaTREQTA4NHRJOUVIVitHS1Z1aEpxM0VSckhjNnEzaEtuMjlWVWxEZVBDQ1pwanRZMURicm9FWVpXVFlubWh2SE9yM3VUdkpKQXhCS2xNL3dibHBjN3o2VER5azU0bk9sY3kxdjU0R3pLT2dJPSIsInYiOiJWMiJ9.GNhsG76fmvZ6uS-JHH8ZMrnQfwdvcgqBDdinz6mZ9BF5QqDJVVO9kfxQunL78RUDhaZZn0D8JN5nQqaHW_jOl8ByypOnZqi5r8pyLuPQC_-kM8amTtlAl9Y7xHEDIPMXnLra4glh6ywN2qlQrJ3B9LEJeVw6qhrnmq6C0C0Y6j1d79oxPCptcqoPXAmtp53Qt2vbsIm5_EwtzD51yDGulgWgPwyGHcJ2qdp3Dro1HzNP9vjgBKyRfc4vuU17rDIzfXcV6TKhvxXxUboIXIRcHe6LsNz0lfKYMVoYd0FTsosYq6foNA3QXK_JyVk9WnPcNKSJluWhFPCr0LiVT198Wg; SMAUTH=eyJpZCI6ImU0OTkyMmI0LTI5NjEtNGQ4YS05MzQ3LTIwNmIwNzM2YjAzNyIsInN0IjoiUkVUVVJORUQiLCJ0bSI6MTY4Nzg1NDY5MH0=; utm_paidsource=google; userAuth=0; _ga_Z7E27793QJ=GS1.1.1688481869.21.0.1688481869.60.0.0; _ga=GA1.2.1724500244.1687795689; gdeslon.ru.__arc_domain=gdeslon.ru; gdeslon.ru.user_id=181c83c2-a4d6-4030-82cc-f3d72f0bc5ee; tmr_lvid=dbaf907f2b8e4dac50ff1eec440d5909; tmr_lvidTS=1650745384547; _ym_uid=1650745429154025559; _ym_d=1687795691; adrcid=AVd4ft9sZ85UM-cOWWQMNXw; userId=100000006553523997; ab_frisbuy=2; _ga_R1JBBZ02M3=GS1.2.1688481871.12.0.1688481871.0.0.0; srv_id=9c935903a1a5983603abc5cf9e24b037; _gid=GA1.2.1373342858.1688403759; tmr_detect=0^%^7C1688481872182; qrator_jsr=1688481860.838.eweLhnV1NkyL5FJQ-0e5putb94ioejoh36332jk47btdo9sov-00; qrator_jsid=1688481860.838.eweLhnV1NkyL5FJQ-0pr3bc4a5ua06qudbko7visl1e2hcqj9; spcount=1; _dc_gtm_UA-3450216-4=1; _dc_gtm_UA-3450216-27=1; _ym_isad=2; _ym_visorc=w; _gat_frisbuyGa=1',
'Upgrade-Insecure-Requests': '1',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-User': '?1',
# Requests doesn't support trailers
# 'TE': 'trailers',
}
list_cities = [
'Москва',
'Санкт-Петербург',
'Екатеринбург',
'Воронеж',
'Казань',
'Краснодар',
'Нижний Новгород',
'Новосибирск',
'Омск',
'Пермь',
'Ростов-на-Дону',
'Самара',
'Саратов',
'Уфа',
'Челябинск'
]
city_ids = [
'1720920299',
'1547800299',
'1465980299',
'30640299',
'28300299',
'28880299',
'33760299',
'34030299',
'34170299',
'34530299',
'34930299',
'35330299',
'35390299',
'27520299',
'36560299'
]
macro_city_ids = [
'11080299',
'11050299',
'11450299',
'10890299',
'12630299',
'11010299',
'11100299',
'11120299',
'11160299',
'11200299',
'11400299',
'11420299',
'11430299',
'11240299',
'11560299'
]
def get_timestamp():
timezone = pytz.timezone('Africa/Dakar')
current_date = datetime.now(timezone).date()
current_time = datetime.now(timezone).time()
timestamp = str(current_date) + str('T')
if(len(str(current_time.hour)) < 2):
timestamp += '0' + str(current_time.hour) + ':'
else:
timestamp += str(current_time.hour) + ':'
if(len(str(current_time.minute)) < 2):
timestamp += '0' + str(current_time.minute) + ':'
else:
timestamp += str(current_time.minute) + ':'
if(len(str(current_time.second)) < 2):
timestamp += '0' + str(int(current_time.second)-1)
else:
timestamp += str(int(current_time.second)-1)
timestamp += '.111Z'
return timestamp
def get_city_data(city_name):
index = -1 # индекс элемента массива, которому соответствует данный город
for i in range(len(list_cities)):
if list_cities[i] == city_name:
index = i
break
if index == -1:
return (None, None, None)
city_ = list_cities[index]
city_ = '^' + '^'.join(city_)
print(city_ids[index], macro_city_ids[index], city_)
return (city_ids[index], macro_city_ids[index], city_)
timestamp = get_timestamp()
city_id, macro_city_id, city_ = get_city_data(city)
print(timestamp)
if city_id == None or macro_city_id == None or city_ == None:
print('Произошла неизвестная ошибка...')
exit(-1)
data = str('{header:{adaptation:desktop,timestamp:'\
+ f'{timestamp}' + ',screen:{resolution:1536x864,viewPortSize:1179x749},page:{'\
+ 'location:' + 'https://www.sportmaster.ru/catalog/product/search.do/?text=футболка мужская adidas originals,'\
+ 'referrer:https://www.sportmaster.ru/,title:^И^н^т^е^р^н^е^т-^м^а^г^а^з^и^н ^С^п^о^р^т^м^а^с^т^е^р,type:SearchResults},'\
+ 'location:{id:' + f'{city_id}'\
+ ',name:' + f'{city_}' + ',macroCityId:' + f'{macro_city_id}'\
+ '},osVersion:10,deviceModel:null,bonuses:}}')
print(data)
response = requests.post(
'https://www.sportmaster.ru/events-api/v1/page-view/',
cookies=cookies,
headers=headers,
data=data.encode())
###
#cookies['spcount'] += str(int(cookies['spcount']) + 1)
###
response = requests.get(
'https://www.sportmaster.ru/catalog/product/search.do/?text=футболка мужская adidas originals',
cookies=cookies,
headers=headers
)
print(response.status_code)
Но при таком запросе все равно выдает неправильные данные. Подскажите, в какую сторону копать, какие параметры передавать и куда, чтобы получить данные по конкретному городу. Полный код могу прикрепить по ссылке, если требуется.
Дополнение. Также была идея, что данные о местоположении могут храниться в куки, посмотрел, что при изменении города меняется параметр 'tmr_detect', пробовал изменять его, но это так же не приносит никакого результата.
Источник: Stack Overflow на русском