Парсинг яндекс.маркет

Делаю 2 запроса. Один через браузер в инкогнито хрома: https://market.yandex.ru/catalog--smartfony/16814639/list?hid=91491&glfilter=16816262:16816264&onstock=1

Другой -- курлом.

curl --location --request GET 'https://market.yandex.ru/catalog--smartfony/16814639/list?hid=91491&glfilter=16816262:16816264&onstock=1' --header 'Accept:  text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' --header 'Accept-Encoding:  gzip, deflate, br' --header 'Accept-Language:  ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7' --header 'Connection:  keep-alive' --header 'Host:  market.yandex.ru' --header 'Sec-Fetch-Dest:  document' --header 'Sec-Fetch-Mode:  navigate' --header 'Sec-Fetch-Site:  none' --header 'Upgrade-Insecure-Requests:  1' --header 'User-Agent:  Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'

В первом случае ответ 302. Во втором 403. Хедеры и всё остальное совпадает. В чём прикол?


Ответы (1 шт):

Автор решения: hedgehogues

Убил какое-то катастрофическое количество времени на вытаскивание данных. В чём причина была того, что у меня не работал скрипт, я так до конца и не разобрался. Скорее всего с сертификатами проблема была. Запустился из-под системного python'а и всё заработало.

Curl так и не заработал. Как я выяснил, скорее всего собака зарыта либо в https, либо в сертификатах, либо в http2. Зато заработал python скрипт.

import requests

url = "https://market.yandex.ru/catalog--smartfony/16814639/list?hid=91491&glfilter=16816262:16816264&onstock=1"

payload = {}
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Accept-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
'Connection': 'keep-alive',
'Host': 'market.yandex.ru',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36',
}

response = requests.request("GET", url, headers=headers)

print(response.text.encode('utf8'))
print(response.status_code)

Для того, чтобы заработал curl, следует добавить:

   -q --tlsv1.3 --http1.1

Также отмечу, что это крайне странное поведение curl, поскольку при задании флага -v, в логе видно, что используется http1.1, tlsv1.3.

→ Ссылка