Russian Qt Forum
Ноябрь 23, 2024, 00:39
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Работа с сетью
>
Парсинг сайта
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Парсинг сайта (Прочитано 6606 раз)
NICKSERGEEV
Гость
Парсинг сайта
«
:
Март 31, 2016, 21:43 »
1. Раньше удавалось успешно парсить код со следующей страницы:
view-source:https://www.whoscored.com/Matches/824411/Live
2. Сейчас видно поставили защиту от парсинга, что интересно с браузера заходит спокойно
3. Код как это делалось раньше
QString Site::getText()
{
// get content
QEventLoop loop;
reply_ = manager_.get(QNetworkRequest(QUrl(pageUrl_)));
connect(reply_, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
// set text codec from content
QTextCodec *codec = QTextCodec::codecForName("UTF8");
QString siteContent = codec->toUnicode(reply_->readAll());
// check's
// empty content?
if (siteContent.simplified().isEmpty())
{
// redirect site?
QUrl redirectedTo = (reply_->attribute(QNetworkRequest :: RedirectionTargetAttribute).toUrl());
if (redirectedTo.isValid() && redirectedTo != QUrl(pageUrl_))
{
reply_->deleteLater();
reply_ = NULL;
pageUrl_ = QUrl(pageUrl_).resolved(redirectedTo).toString();
return (getText());
}
// have error?
int errorReply = reply_->error();
reply_->deleteLater();
reply_ = NULL;
if (errorReply != 0)
{
return QString("Site: %1 return error: %2.").arg(pageUrl_).arg(mapError_[errorReply]);
}
else
{
return QString("Site: %1 return empty content.").arg(pageUrl_).arg(mapError_[errorReply]);
}
}
reply_->deleteLater();
reply_ = NULL;
return siteContent;
}
4. Кто поможет поправить, чтобы снова всё работало? Закину рублей 500 чисто на пиво, больше не могу ибо кризис.
Записан
arhohryakov
Гость
Re: Парсинг сайта
«
Ответ #1 :
Апрель 01, 2016, 07:09 »
По идее всё обработка должна производиться после того, как запрос завершен, т.е. по сигналу finished().
Создайте для него слот и обрабатывайте данные (_reply->readAll()) в нём.
Записан
NICKSERGEEV
Гость
Re: Парсинг сайта
«
Ответ #2 :
Апрель 01, 2016, 09:00 »
Дело не в том, что результата нет.
Результат есть, но он возвращает не то, что когда заходишь через браузер - просмотр кода.
Ощущение, что инкапсулировали данные.
Записан
gil9red
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1805
Re: Парсинг сайта
«
Ответ #3 :
Апрель 01, 2016, 09:10 »
Наверное, на странице есть объект JavaScript, в который данные перенесли. Я такое для какого-то чат бота видел -- на странице данные есть, но в html нет, игрался с консолью браузера и нашел тот объект
Записан
https://github.com/gil9red
https://ru.stackoverflow.com/users/201445/gil9red
NICKSERGEEV
Гость
Re: Парсинг сайта
«
Ответ #4 :
Апрель 01, 2016, 11:01 »
Теперь возвращает вот такую фигню.
"<html>
<head>
<META NAME="robots" CONTENT="noindex,nofollow">
<script>
(function() { function getSessionCookies() { cookieArray = new Array(); var cName = /^\s?incap_ses_/; var c = document.cookie.split(";"); for (var i = 0; i < c.length; i++) { key = c
.substr(0, c
.indexOf("=")); value = c
.substr(c
.indexOf("=") + 1, c
.length); if (cName.test(key)) { cookieArray[cookieArray.length] = value } } return cookieArray } function setIncapCookie(vArray) { try { cookies = getSessionCookies(); digests = new Array(cookies.length); for (var i = 0; i < cookies.length; i++) { digests
= simpleDigest((vArray) + cookies
) } res = vArray + ",digest=" + (digests.join()) } catch (e) { res = vArray + ",digest=" + (encodeURIComponent(e.toString())) } createCookie("___utmvc", res, 20) } function simpleDigest(mystr) { var res = 0; for (var i = 0; i < mystr.length; i++) { res += mystr.charCodeAt(i) } return res } function createCookie(name, value, seconds) { if (seconds) { var date = new Date(); date.setTime(date.getTime() + (seconds * 1000)); var expires = "; expires=" + date.toGMTString() } else { var expires = "" } document.cookie = name + "=" + value + expires + "; path=/" } function test(o) { var res = ""; var vArray = new Array(); for (var j = 0; j < o.length; j++) { var test = o[j][0] switch (o[j][1]) { case "exists": try { if(typeof(eval(test)) != "undefined"){ vArray[vArray.length] = encodeURIComponent(test + "=true") } else{ vArray[vArray.length] = encodeURIComponent(test + "=false") } } catch (e) { vArray[vArray.length] = encodeURIComponent(test + "=false") } break; case "value": try { vArray[vArray.length] = encodeURIComponent(test + "=" + eval(test).toString()) } catch (e) { vArray[vArray.length] = encodeURIComponent(test + "=" + e) } break; case "value_or_nil": try{ if(typeof(eval(test)) != "undefined"){ vArray[vArray.length] = encodeURIComponent(test + "=" + eval(test).toString()) } else{ vArray[vArray.length] = encodeURIComponent(test + "=nil") } } catch(e){ vArray[vArray.length] = encodeURIComponent(test + ":" + test_type + "=" + e) } break; case "plugin_extentions": try { extentions = [] for (var i=0;i<navigator.plugins.length;i++) { filename = navigator.plugins
.filename if(typeof(filename) != "undefined") { if (filename.split(".").length == 2) { ext = filename.split(".")[1] if (extentions.indexOf(ext) < 0) { extentions.push(ext) } } } } for (i = 0; i < extentions.length; i++) { vArray[vArray.length] = encodeURIComponent("plugin_ext=" + extentions
); } } catch (e) { vArray[vArray.length] = encodeURIComponent("plugin_ext=" + e) } break; case "plugins": try{ p=navigator.plugins pres="" for (a in p){pres+=(p[a]['description']+" ").substring(0,20)} vArray[vArray.length] = encodeURIComponent("plugins=" + pres); } catch(e){ vArray[vArray.length] = encodeURIComponent("plugins=" +e); } break; case "plugin": try { a = navigator.plugins; for (i in a) { f = a
["filename"].split("."); if (f.length == 2) { vArray[vArray.length] = encodeURIComponent("plugin=" + f[1]); break } } } catch (e) { vArray[vArray.length] = encodeURIComponent("plugin=" + e) } break } } vArray = vArray.join(); return vArray } var o = [ ["navigator", "exists"], ["navigator.vendor", "value"], ["navigator.vendor", "value_or_nil"], ["opera", "exists"], ["ActiveXObject", "exists"], ["navigator.appName", "value"], ["navigator.appName", "value_or_nil"], ["platform", "plugin"], ["platform", "plugin_extentions"], ["webkitURL", "exists"], ["navigator.plugins.length==0", "value"], ["navigator.plugins.length==0", "value_or_nil"], ["_phantom", "exists"] ]; try { setIncapCook
ie(test(o)); document.createElement("img").src = "/_Incapsula_Resource?SWKMTFSR=1&e=" + Math.random() } catch (e) { img = document.createElement("img"); img.src = "/_Incapsula_Resource?SWKMTFSR=1&e=" + e } })();
</script>
<script>
(function() {
var z="";var b="7472797B766172207868723B76617220743D6E6577204461746528292E67657454696D6528293B766172207374617475733D227374617274223B7661722074696D696E673D6E65772041727261792833293B77696E646F772E6F6E756E6C6F61643D66756E6374696F6E28297B74696D696E675B325D3D22723A222B286E6577204461746528292E67657454696D6528292D74293B646F63756D656E742E637265617465456C656D656E742822696D6722292E7372633D222F5F496E63617073756C615F5265736F757263653F4553324C555243543D363726743D373826643D222B656E636F6465555249436F6D706F6E656E74287374617475732B222028222B74696D696E672E6A6F696E28292B222922297D3B69662877696E646F772E584D4C4874747052657175657374297B7868723D6E657720584D4C48747470526571756573747D656C73657B7868723D6E657720416374697665584F626A65637428224D6963726F736F66742E584D4C4854545022297D7868722E6F6E726561647973746174656368616E67653D66756E6374696F6E28297B737769746368287868722E72656164795374617465297B6361736520303A7374617475733D6E6577204461746528292E67657454696D6528292D742B223A2072657175657374206E6F7420696E697469616C697A656420223B627265616B3B6361736520313A7374617475733D6E6577204461746528292E67657454696D6528292D742B223A2073657276657220636F6E6E656374696F6E2065737461626C6973686564223B627265616B3B6361736520323A7374617475733D6E6577204461746528292E67657454696D6528292D742B223A2072657175657374207265636569766564223B627265616B3B6361736520333A7374617475733D6E6577204461746528292E67657454696D6528292D742B223A2070726F63657373696E672072657175657374223B627265616B3B6361736520343A7374617475733D22636F6D706C657465223B74696D696E675B315D3D22633A222B286E6577204461746528292E67657454696D6528292D74293B6966287868722E7374617475733D3D323030297B706172656E742E6C6F636174696F6E2E72656C6F616428297D627265616B7D7D3B74696D696E675B305D3D22733A222B286E6577204461746528292E67657454696D6528292D74293B7868722E6F70656E2822474554222C222F5F496E63617073756C615F5265736F757263653F535748414E45444C3D313335323939303335353536383038353731302C31353231363832373033303034353635363133382C313933323430303638323730313833383337392C313536363439222C66616C7365293B7868722E73656E64286E756C6C297D63617463682863297B7374617475732B3D6E6577204461746528292E67657454696D6528292D742B2220696E6361705F6578633A20222B633B646F63756D656E742E637265617465456C656D656E742822696D6722292E7372633D222F5F496E63617073756C615F5265736F757263653F4553324C555243543D363726743D373826643D222B656E636F6465555249436F6D706F6E656E74287374617475732B222028222B74696D696E672E6A6F696E28292B222922297D3B";for (var i=0;i<b.length;i+=2){z=z+parseInt(b.substring(i, i+2), 16)+",";}z = z.substring(0,z.length-1); eval(eval('String.fromCharCode('+z+')'));})();
</script></head>
<body>
<iframe style="display:none;visibility:hidden;" src="//content.incapsula.com/jsTest.html" id="gaIframe"></iframe>
</body></html>"
Записан
Bepec
Гость
Re: Парсинг сайта
«
Ответ #5 :
Апрель 01, 2016, 15:30 »
Вам нужно выполнить эти скрипты и после этого они уже на страницу добавят содержимое.
PS самый легкий вариант - добавить QWebEngine или QWebView и запихивать их туда. А после выполнения уже забирать текст страницы.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...