Как парсить сайты где всё построено на JavaScript?
Как получить контент который подгружается через ajax при захвате html дерева?
Знаю что есть selenium, но слишком долго через него + иногда не желательно чтоб кто то видел сценарий действий.
Выслушаю любые предложения на любых языках и технологиях
Запрос через AJAX это ведь такой же обычный HTTP-запрос. Смотрите через Панель Разработчика в браузере какие страницы запрашивает AJAX и парсите их. Или что вы имеете ввиду?
AWEme, DanKud, а вы не сталкивались с сайтами где по запросу приходят только данные (включая данные об интерфейсе, как например при использовании webix). Распарсить такой сайт весьма проблематично.
Артём Петренков, для начала обратимся к значению слова парсить. Как написано по ссылке, парсить - производить синтаксический анализ, анализировать, разбирать. Таким образом парсить сайт это разбирать и анализировать содержимое сайта, но не в коем случае не просто скачать сайт. Так же следует упомянуть, что у анализа должна быть определенная цель, и этой целью вряд ли являются непонятные куски непонятных данных. Наиболее вероятно, что автору необходимо либо готовое html представление сайта либо какие то осмысленные данные, отображаемые на сайте (например данные профилей пользователей и данные ими на тостере ответы, количество правильных, и т.д.). В своем вопросе автор упоминает сценарии действий и selenium, что так же наводит на мысль об автоматизации получения html представления возможно даже с последующей его обработкой (парсингом).
А теперь покажите мне програмный код, который автоматически получит html представление конечного вида этой простой странички без использования браузеров и безголовых браузеров?
PS: разметка интерфейса на этой страничке выглядит так:
Артём Петренков, сами по себе данные не имеют смысла, нужны данные, формализованные для применения на них имеющихся алгоритмов анализа и обработки. При этом, как я понял контекст вопроса, автору нужно распарсить не какойто конкретный сайт а некий, желательно универсальный способ сделать это с любым произвольным сайтом. Учитывая то, как безразмерно раздут зоопарк различных способов и технологий используемых для получения представления, ни о каком, по настоящему универсальном способе речи быть не может, Единтственное, относительно универсальное решение которое я вижу, это брать уже отрендереное представление и выковыривать данные уже из него. Соглашусь с вами, что в определенных ситуациях даный подход может потребовать даже больших трудозатрат чем индивидуальный, ручной подход к анализу отдельно взятого сайта. Но все это сильно зависит от того, что именно мы желаем получить на выходе, и пока автор не уточнит это, выбрать наиболее подходящий путь невозможно, и мы будем спорить до бесконечности.
Роман, например хотел получать посты из вк которые подгружаются через ajax ( не надо предлагать api, там музыка закрыта, в веб версии ещё можно дешифратором выдернуть прямые ссылки ) или в веб версии телеграмма вытащить картинки стикеров или переписку, без js там вообще ничего не работает, даже стартовая страница ( а что насчёт api, для ботов всё расписано, куча информации в интернете, а для обычного api день просидел ничего не понял + не все методы есть которые мне нужны )
felsme, в таком случае вам не поможет мой вариант. Только индивидуальный подход к каждому отдельно взятому сайту с реверсинженерингом протоколов передачи данных.
glebe, человек как раз и спрашивает, как получить данные для сайтов, в которых эти данные получают с помощью запросов из js.
В таком случае недостаточно открыть "инструменты разработчика" и скопировать из них запросы. Необходимо будет разбираться с авторизацией/сейсиями/токенами а также с параметрами запросов и много еще с чем. В настоящий момент сделать полностью автоматическую систему, способную сделать это с любым произвольным сайтом без участия человека невозможно. Так что остается только вариант с анализом и реверсинженерингом кастомных протоколов передачи данных, форматов информационных пакетов, и скриптов сайта.
Роман, автоматом и с html сайта невозможно спарсить, необходимо как минимум уникальные идентификаторы для конкретного сайта добавить в скрипт парсера.
Но конечная цель - это данные, а не логика их вывода на экран монитора. С сайтов на современных системах управления невозможно скачать логику, только данные.
А вообще я смотрю на это с другой стороны. Очень часто приходится пресекать попытки парсинга извне. Бывает веб-мудрецы придумывают очень хитро.опые схемы запросов. Например с заменой ip через несколько итераций и сбросом своей сессии (заменой всех сессионных данных). Таких распознать сложно, но тоже можно... правда не сразу.
А парсинг данных с сайта - это по сути считывание визуальных данных с монитора. Поэтому неважно на каком языке сайт сделан - яваскрипт, пхп или то и другое и ещё плюс что+то. Достаточно эмулировать действия пользователя в браузере
Разве я не тоже самое сказал (там где про универсальность и трудозатраты)
Достаточно эмулировать действия пользователя в браузере
именно про это и имел ввиду, с той лишь разницей, что предлагал брать данные из отрендеренного представления а вы непосредственно брать их из ответовна запросы.
В моем варианте надо определить признаки нужных данных в готовом html и затем рапарсить dom или делать хитрые регулярки на текст чтобы их достать, в вашем случае разбираться с форматами/протоколами передачи данных.
В зависимости от сайта проще и удобней это делать може быть как моим вариантом так и вашим.
Роман,
Можно так, можно иначе - не суть важно как. Но лично я в принципе против парсинга чужих сайтов.
Если владелец сайта не против массовой выборки данных, то обычно создаётся соответствующее api, ну или на крайний случай какой-нибудь обновляемый xml-файл с актуальными данными. Пожалуйста, подключайся через api или качай файл. Это не создаст нагрузки на сервер.
А если владелец не хочет отдавать данные оптом, то парсинг этих данных является ничем иным как тривиальным воровством
Я смотрел в хроме в консоле разработчика куда посылаются ajax запросы и какие параметры в хедере передаются, далие с помощью curl на php делаю запрос и подставляю такие же параметры имитация браузера. В ответ приходит либо готовый html - парсил на phpquery либо приходит json что ещё лучше не надо распаршевать.