Комментарии 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