Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать, что страница с JS (AJAX)? нетривиальная задача 
:(
    Опции темы
Lindemann66
  Дата 25.10.2011, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinking...
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 2.8.2011
Где: Ульяновск

Репутация: нет
Всего: нет



Всем привет!

У меня следующий нетривиальный вопрос:

Задача - загрузить из интернета код страницы и осуществить его парсинг, как-то:
  • Получить содержимое всех ссылок <a>
  • Получить содержимое контентных тэгов, таких как <p>, <table> и т.д.
  • и т.д. и т.п.

Какие средства можно использовать для решения данной проблемы?
  • Средства, предоставляемые QtWebKit
  • Другие средства (допустим, htmlcxx)

Всё бы хорошо, но у QtWebKit есть один большой минус - он производит рендер страницы - для того, чтобы, если сайт типа facebook.com (имеющий исключительно JS-код) - на выходе давать "человеческий" html
На эту операцию по рендеру и получению JS -> html тратится достаточно много ресурсов - по сравнению с другими средствами, которые осуществляют парсинг страницы исключительно в виде "как есть" - т.е. пришёл html код - всё ок, пришёл js код (с twitter'а, например) - ну чтож, значит, пропарсить и получить ссылки не удастся

Так вот, выходит, что использование QtWebKit обосновано только в том случае, если на сайте преобладает JS-код, AJAX-вставки и т.п.

Отсюда вопрос - есть ли какие-то адекватные способы осуществления проверки того, что на старнице присутствует динамический JS-код для показа контента?
Знает ли кто-то такие способы?

Буду очень признателен за любой ответ!
--------------------
stay true
PM MAIL WWW ICQ   Вверх
_GRIN_
Дата 26.10.2011, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



Lindemann66, ну примерно так:

Код

    QWebPage page;
    //привязываемся к сигналу QWebFrame::loadFinished(bool)
    connect(page.mainFrame(),SIGNAL(loadFinished(bool)),SLOT(mySlotLoadFinished(bool)));
    page.mainFrame()->load("http://dtf.ru");

void CMyClass::mySlotLoadFinished(bool ok)
{
    if(ok) {
        //получаем контент - т.е. код страницы - включая всякие забитые в него скрипты.
        QString content = page.mainFrame()->toHtml();
        //получаем коллекция ссылок, параграфов и таблиц
        QWebElementCollection a_list=page.mainFrame()->findAllElements("a");
        QWebElementCollection p_list=page.mainFrame()->findAllElements("p");
        QWebElementCollection table_list=page.mainFrame()->findAllElements("table");
        //что-то делаем с полученными колеекциями элементов.
    }
}


P.S. - Рендерят виджеты - в частности QWebView ;)

Это сообщение отредактировал(а) _GRIN_ - 26.10.2011, 08:43


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
Lindemann66
Дата 26.10.2011, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinking...
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 2.8.2011
Где: Ульяновск

Репутация: нет
Всего: нет



SIGNAL(loadFinished(bool) сработает, когда загрузится страница, при этом асинхронно-подгружаемые элементы (картинки, AJAX и т.д.) всё ещё будут подгружаться
Получится, что часть контента не загрузится, и мы не сможем её обработать
--------------------
stay true
PM MAIL WWW ICQ   Вверх
_GRIN_
Дата 26.10.2011, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



Lindemann66, я в свое время писал бота для тивттера - проблемы с тем, что у меня страница не догрузилась в момент прихода сигнала loadFinished(true) - не было. Ты уверен в своих словах?


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
Lindemann66
Дата 26.10.2011, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinking...
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 2.8.2011
Где: Ульяновск

Репутация: нет
Всего: нет



Ну, в документации об этом написано...

Цитата

This signal is emitted when the page finishes loading content. This signal is independant of script execution or page rendering. ok will indicate whether the load was successful or any error occurred.

--------------------
stay true
PM MAIL WWW ICQ   Вверх
_GRIN_
Дата 26.10.2011, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



Lindemann66, нда, действитель =)

Давай по порядку:
Код

Задача - загрузить из интернета код страницы и осуществить его парсинг, как-то:
Получить содержимое всех ссылок <a>
Получить содержимое контентных тэгов, таких как <p>, <table> и т.д.
и т.д. и т.п.

Решение указано выше

Код

Всё бы хорошо, но у QtWebKit есть один большой минус - он производит рендер страницы - для того, чтобы,
 если сайт типа facebook.com (имеющий исключительно JS-код) - на выходе давать "человеческий" html
На эту операцию по рендеру и получению JS -> html тратится достаточно много ресурсов - по сравнению с другими средствами,
 которые осуществляют парсинг страницы исключительно в виде "как есть" - т.е. пришёл html код - всё ок,
 пришёл js код (с twitter'а, например) - ну чтож, значит, пропарсить и получить ссылки не удастся

Отсюда вопрос - есть ли какие-то адекватные способы осуществления проверки того, что на старнице присутствует динамический JS-код для показа контента?

Рендер производится в виджете QWebView - можно использовать QWebPage (QWebView его использует) - что бы уйти от рендера.
Код

//получаем контент - т.е. код страницы - включая всякие забитые в него скрипты.
        QString content = page.mainFrame()->toHtml();

Данный код возвращает исходный код загрузенной страницы - включая скрипты. Парси его на здоровь "как есть".

Или я не до конца понял твой вопрос, или ты не до конца понял мой ответ, или ... =)


Это сообщение отредактировал(а) _GRIN_ - 26.10.2011, 12:27


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0438 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.