Как уже написал в комментарии, api у Яндекса есть, и json он возвращает без проблем.
Повторюсь, что изучать возможности и ограничения api сайтов дело занимательное, но трудозатратное, ещё более трудозатратно разжёвывать это всё, поэтому здесь вкратце.
1. Headers
Api ничего не отдаст, если не будет необходимых headers. И‥ нет, referer, origin, User-Agent и т.д. не являются необходимыми. Необходимы только те что прилетают с антикапчи. Хотя эмулировать всё подряд, чтобы претвориться браузером не так уж и плохо.
Собственно, быстрее всего забрать из браузера, можно руками, можно через selenium:
from selenium import webdriver
url = 'https://market.yandex.ru'
driver = webdriver.Firefox()
driver.get(url)
sk = driver.execute_script("return window.state['user']['sk']")
skid = driver.get_cookie("skid")['value']
driver.quit()
В Selenium сильно застревать не будем, забрали то что нужно и вышли.
Капча может попросить поставить галочку, это также можно сделать автоматически:
driver.execute_script("arguments[0].click();", driver.find_element('id', 'js-button'))
Всякие обвески в виде WebDriverWait
, обёрток по поводу того открылась страница или капча — оставлю на домашнее задание, тем более вопрос не об этом. Капчу также можно решить не прибегая к Selenium, но по подобным наработкам есть смысл делать SaaS монетизацию, вряд ли кто-то в ответах будет решение капчи расписывать. Главное — получили автоматически то что нам нужно и едем дальше.
По итогу в headers нужны:
- content-type
- cookie (причём исключительно сессионные работать не будут, надо именно передать)
- sk
2. Cookies
В браузере их много. Можно перенести все, и тогда requests заработает как надо, иначе будет выводить на антикапчу. Конечно же, все cookies не нужны, достаточно получить:
- _yasc
- i
- yandexuid
- spravka
- skid
Как их получать, опять же, подробно останавливаться не буду, есть другой ответ упомянутый в начале о том как это делать. Но если использовать cloudscraper, то достаточно будет указать лишь skid.
3. API
import cloudscraperfrom
from urllib.parse import urljoin as UJ
s = cloudscraper.create_scraper()
api = r'/api/resolve/'
params = {'r': 'src/resolvers/search/resolveRemoteSearch:resolveRemoteSearch'}
headers = {
'content-type': 'application/json',
'cookie': 'skid={}'.format(skid),
'sk': sk
}
body = {
"params": [
{
"suggest_text": "Блендеры",
"page": 1,
"withResults": True
}
]
, "path": ""
}
r = s.post(UJ(url, api), params=params, headers=headers, json=body)
Получаем response 200, внутри либо товары, либо предупреждение о капче, если предупреждение, см. пункт 1, нужны новые sk и skid.
body
значительно сокращён. Лично я не вижу особой разницы в наличии или отсутствии томошних параметров, по сути самые важные suggest_text
и page
. По мне результат удовлетворительный. Без path
работать не будет, но можно указать пустой, или при особом желании сократить до /catalog--blendery/54931/list
. Если же необходимо 1 в 1 получить то что выдаётся в браузере по дополнительным фильтрам, есть смысл просто скопировать тело запроса из браузера.
Информации там просто тьма, на любой каприз, даже та, которая на страницу не выводится, про склады и т.д. Но т.к. задающий вопрос в комментариях тоже капризный, и в вопросе упёрто отказывается писать что хочет получить, ограничимся названиями, ценой и ценой без скидки. Также стоит отметить, что порядок товаров может не совпадать с тем что на сайте, т.к. сортировка идёт стандартно по ключам в dict.
for offer in r.json()['results'][0]['data']['collections']['offer'].values():
print(offer['modelAwareTitles']['raw'])
print(offer['discount']['currentPrice']['value'], end='\t')
print('\u0336'+'\u0336'.join(str((offer['discount'].get('oldPrice') or {'value':''})['value'])))
Вывод:
Погружной блендер VITEK VT-3407
1299 ̶1̶7̶9̶0
Стационарный блендер Polaris PTB 1834G
6990 ̶
Погружной блендер Zigmund & Shtain BH-342 M
5590 ̶6̶9̶8̶8
Погружной блендер Scarlett SC-HB42F90
1999 ̶2̶3̶9̶9
Погружной блендер Scarlett SC-HB42F96
2599 ̶5̶4̶9̶9
Погружной блендер Polaris PHB 1589AL
7699 ̶9̶1̶1̶2
Блендер REDMOND RSB-M3427
4640 ̶
Погружной блендер Scarlett SC-HB42F56
1699 ̶2̶4̶6̶2
Погружной блендер REDMOND RHB-2994
4124 ̶
Погружной блендер Scarlett SC-HB42F94
1699 ̶3̶1̶5̶9
Блендер Zigmund & Shtain BH-345 M
3190 ̶6̶9̶9̶0
Погружной блендер с миксером HiSTORY IHB-527, стальной/черный, soft-touch
4590 ̶
Блендер REDMOND RHB-2995
1749 ̶3̶9̶9̶9
Погружной блендер Polaris PHB 1594
2999 ̶3̶7̶3̶7
Погружной блендер Braun MQ 7045X
6620 ̶7̶7̶8̶8
Стационарный блендер Kitfort KT-1359
7990 ̶9̶5̶9̶0
Погружной блендер Braun MQ 9125XS
7990 ̶
Погружной блендер Polaris PHB 1476
2899 ̶6̶1̶9̶9
Блендер HYUNDAI HYB-H3845
1760 ̶2̶5̶9̶0
Погружной блендер Scarlett SC-HB42M33
1799 ̶2̶5̶9̶9
Погружной блендер Polaris PHB 1385
2800 ̶
Погружной блендер Braun MQ 3137 Sauce +
5594 ̶
Блендер погружной Scarlett SC-HB42F97
1399 ̶1̶9̶9̶9
Погружной блендер Scarlett SC-HB42F91
1250 ̶2̶9̶9̶9
Погружной блендер Scarlett SC-HB42F61
2133 ̶2̶9̶8̶9
Погружной блендер Braun MQ 3020 Pesto
3690 ̶
Стационарный блендер NutriBullet Pro exclusive
5990 ̶8̶9̶9̶0
Погружной блендер Braun MQ5207
3990 ̶
Погружной блендер Scarlett SC-HB42M47
2782 ̶3̶5̶9̶9
Погружной блендер Kitfort КТ-3052
2990 ̶
Погружной блендер Polaris PHB 1380 Silent
3499 ̶4̶2̶1̶0
Погружной блендер Bosch ErgoMixx MS 6CM6120
5426 ̶
Погружной блендер Scarlett SC-HB42M49
2624 ̶
Погружной блендер REDMOND RHB-2951
2999 ̶3̶9̶9̶9
Стационарный блендер Kitfort KT-1340
2990 ̶
Погружной блендер REDMOND RHB-2944
2800 ̶
Погружной блендер Braun MQ 3035 Sauce
4325 ̶
Стационарный блендер Kitfort KT-3034
2380 ̶
Погружной блендер Scarlett SC-HB42F39
1498 ̶1̶9̶1̶9
Погружной блендер Braun MQ 535 Sauce
3670 ̶
Погружной блендер REDMOND RHB-2993
3390 ̶4̶4̶9̶9
Погружной блендер Polaris PHB 1065
2699 ̶3̶3̶0̶6
Погружной блендер Bosch MSM 14100
1440 ̶2̶3̶2̶6
Погружной блендер Bosch MSM 2610B
2901 ̶
Блендер погружной bosch
4100 ̶9̶8̶5̶6
Погружной блендер LUMME LU-1886
1107 ̶3̶7̶4̶0
Блендер домашний/стационарный/измельчитель льда/для смузи/кофемолка/5000 Вт, стеклянный кувшин 2.5 литра, регулировка скорости работы, красный
4999 ̶9̶9̶9̶9
Погружной блендер REDMOND RHB-2913
3240 ̶
Блендер погружной Moulinex Quickchef DD653832 черный, 800 Вт
5499 ̶6̶9̶9̶0
Погружной блендер Moulinex InfinyForce Pro DD95HD10, 1200 Вт, регулировка скорости силой нажатия, 6 предметов
9499 ̶1̶2̶4̶9̶0
Блендер погружной Moulinex Optichef DD64K832, 800 Вт, 4 предмета
3810 ̶5̶3̶3̶4
Блендер погружной Moulinex InfinyForce DD944810, 1000 Вт
6999 ̶9̶7̶9̶9
Стационарный блендер Dauken MX950 PRO
15589 ̶2̶5̶4̶8̶8
ICook™ Блендер от Amway
10700 ̶1̶2̶2̶2̶3
Блендер мини Smeg, белый, PBF01WHEU
14590 ̶
Погружной блендер Polaris PHB 1594
2999 ̶3̶7̶3̶7
Погружной блендер REDMOND RHB-2972
3240 ̶
Погружной блендер Polaris PHB 1385
2800 ̶
Блендер портативный Rommelsbacher SVD 1400 1400Вт серебристый
18737 ̶
Блендер REDMOND RHB-2983
3390 ̶4̶4̶9̶9
Блендер REDMOND RHB-2995
3289 ̶3̶9̶9̶9
Блендер REDMOND RSB-3402
4952 ̶5̶9̶9̶9
Блендер REDMOND RHB-2989
7999 ̶9̶9̶9̶9
Блендер REDMOND RHB-2941
3270 ̶3̶9̶9̶9
Блендер REDMOND RHB-2943
2999 ̶3̶9̶9̶9
Блендер REDMOND RHB-2972
3490 ̶5̶4̶9̶0
Увлажнитель воздуха VITEK VT-1761
3569 ̶
Мясорубка Metropolis VITEK VT-3644
2790 ̶3̶4̶9̶0