Парсинг яндекс.маркет
Делаю 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 шт):
Убил какое-то катастрофическое количество времени на вытаскивание данных. В чём причина была того, что у меня не работал скрипт, я так до конца и не разобрался. Скорее всего с сертификатами проблема была. Запустился из-под системного 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.