Как стать автором
Обновить

Комментарии 14

А почему именно фотографии, а не цены например?

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/

Как мне кажется, чтобы использовать модуль urllib.request, его необходимо импортировать в самом начале:
import urllib.request
А зачем тут вообще selenium?
Как написали выше, в коде страницы есть данные, да еще и в удобном формате.
Тут можно все намного проще сделать:
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)

Может где туториал есть, где подробно такой финт разбирается, интересно было-бы посмотреть.

НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации