Как спарсить наличие товара в определенном городе sportmaster

Рейтинг: -1Ответов: 1Опубликовано: 04.07.2023

Требуется спарсить наличие товара в определенном городе. Для этого я посмотрел запрос 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', пробовал изменять его, но это так же не приносит никакого результата.

Ответы

▲ 0
import json
from requests import Session
from bs4 import BeautifulSoup

cookies = {'qrator_jsid': '1688710785.926.oy6APPBbqgAZaYio-3jld5didcqli5gkpmdop3f47l0b6kh39'}
session = Session()
session.cookies.update(cookies)

def res():
    response = session.get('https://www.sportmaster.ru/catalog/product/search.do/?text=футболка мужская adidas originals')
    soup = BeautifulSoup(response.content, 'html.parser')
    x = str(soup('script')[2])
    data = json.loads(x[x.find('{'): x.find('];')])
    print(data['cityName'])

cities = {
    'Москва':          '1720920299',
    'Санкт-Петербург': '1547800299',
    'Екатеринбург':    '1465980299',
    'Казань':          "28300299",
}

res()
response = session.post('https://www.sportmaster.ru/web-api/v1/profile/location/', json={"territoryId": cities["Казань"]})
res()
response = session.post('https://www.sportmaster.ru/web-api/v1/profile/location/', json={"territoryId": cities["Екатеринбург"]})
res()

#Москва
#Казань
#Екатеринбург