
Комментарии 14
А почему именно фотографии, а не цены например?
Цены рассмотрел здесь — https://habr.com/ru/post/487370/
cian написан на react + ssr. Там обычно валяется json стейт всей страницы. Проще просто выполнить
window._cianConfig['frontend-offer-card'].find(i => i.key === 'defaultState').value.offerData.offer.photosИ там есть все, что нужно. Вероятность, что поменяется структура данный на порядок ниже, чем вероятность, что поменяется разметка.
Спасибо за коммент, подскажите, где такому можно научиться?
Это опыт разработки сайтов + в их докладах видел стек. Не думаю что изучать такое отдельно имеет смысл.
Можете хотя бы в двух словах сказать, как вы поняли, что нужно смотреть в javascript? Или это в их докладе сказали?
Прочитайте пару статей по SSR, если интересно почему и как (я не знаю насколько вам близка фронтенд разработка, сложно дать точную инфу). Из гугл топа
https://tproger.ru/translations/rendering-on-the-web/
Смотрите часть с заголовком "Проблема регидратации: одно приложение по цене двух", там этот самый случай.
UPD
Вообще есть примерно 4-5 популярных способов реализации такой галереи (ссылки в html, ссылки из запроса апи, ссылки в js/json где-то). Можно начать просто с поиска url картинки в исходном коде картинки. Тут она лежала в json, который можно прочитать из window._cianConfig, дальше нюансы. Методом тыка можно находить, но с опытом в разработке таких сайтов это происходит быстрее.
Ничего не сказано про то что такое selenium, почему именно selenium, etc
Верно, надо было сделать ссылку на первый пример, который я написал до этого https://habr.com/ru/post/489762/
import urllib.request
Как написали выше, в коде страницы есть данные, да еще и в удобном формате.
Тут можно все намного проще сделать:
import requests
import json
start_json_template = "window._cianConfig['frontend-offer-card'] = "
url = "https://www.cian.ru/sale/flat/222059642/"
photos = []
response = requests.get(url)
html = response.text
if start_json_template in html:
start = html.index(start_json_template) + len(start_json_template)
end = html.index('</script>', start)
json_raw = html[start:end].strip()[:-1]
json = json.loads(json_raw)
for item in json:
if item['key'] == 'defaultState':
for photo in item['value']['offerData']['offer']['photos']:
photos.append(photo['fullUrl'])
break
print(photos)
Парсинг фотографий с сайта cian.ru с помощью Selenium