Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2014, 17:11   #1
AmbaQ
Пользователь
 
Аватар для AmbaQ
 
Регистрация: 23.12.2009
Сообщений: 47
Вопрос Парсинг html страницы

Доброго времени суток! Прошу помощи, есть сайт ВУЗА (http://ecampus.ncfu.ru/), на нём имеется расписание, персональная страницы студента с его рейтингом, все дела, короче. Вот именно с персональной страничкой и нужно работать.

Необходимо спарсить таблицу. В ней есть рейтинг, который собственно и нежен. Проблема в том, что в исходном коде этот рейтинг представлен следующем образом:

Код:
<br />
<div data-bind="foreach: items, css: { loading: term() && term().loading && term().loading() }, visible: !error()" id="study-courses" class="panel-group">
    <div class="panel panel-default">
        <div class="panel-heading">
            <span data-bind="attr: { 'data-target': '#study-courses [data-id=' + Id + ']' }" class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#study-courses">
                <span class="glyphicon glyphicon-chevron-up pull-right"></span> 
             
           ==>     <span data-bind="visible: MaxRating, text: core.format('Рейтинг {0:N2} из {1:D}', CurrentRating, MaxRating)" class="rating"></span>

                <span data-bind="text: Name"></span>
            </span>
        </div>
Нужную строчку выделил жирным, на самом деле, нужно получить больше данных, но если вы мне подскажите с этим, остальное я сделаю сам.

Пользователь видит вот это:



В инспекторе огнелиса вот такой код:



Вопрос: как правильно спарсить или каким способом получить эту информацию в Delphi?

P.S. HTML, CSS., PHP, js знаю поверхностно, отсюда и проблема, я думаю. Заранее спасибо.
AmbaQ вне форума Ответить с цитированием
Старый 25.09.2014, 17:20   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Не нашел я там никаких похожих таблиц.
Но есть очень сильное подозрение, что все действо построено на динамической передаче информации через AJAX используя некий серверный фреймворк. Другими словами то что, вы видите в веб-браузере не существует в исходном коде страницы.

Из этого можно сделать вывод:
Из delphi эти данные можно получить, встроив в программу WebBrowser или Chromium который будет отображать сайт с нужным блоком информации, если повезёт то через работу с DOM сможете что-то получить из страницы веб-браузера, спрятав сам веб-браузер. Что врядли.. т.к. тот же FF не отображает динамический исходный код.

Других способов нет.
Человек_Борща вне форума Ответить с цитированием
Старый 25.09.2014, 17:48   #3
AmbaQ
Пользователь
 
Аватар для AmbaQ
 
Регистрация: 23.12.2009
Сообщений: 47
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Не нашел я там никаких похожих таблиц.
Но есть очень сильное подозрение, что все действо построено на динамической передаче информации через AJAX используя некий серверный фреймворк. Другими словами то что, вы видите в веб-браузере не существует в исходном коде страницы....
Спасибо за ответ, просто имеется для этого сайта мобильное приложение, написанное народными умельцами, там как-то эти данные получают, я попробую как Вы сказали.
AmbaQ вне форума Ответить с цитированием
Старый 25.09.2014, 17:52   #4
Avazart
Форумчанин
 
Аватар для Avazart
 
Регистрация: 13.08.2011
Сообщений: 184
По умолчанию

Цитата:
Сообщение от Человек_Борща
динамической передаче информации через AJAX используя некий серверный фреймворк.
Цитата:
Сообщение от Человек_Борща
Из delphi эти данные можно получить, встроив в
Достаточным будет воссоздать AJAX запрос, так что не нужно пугать раньше времени.

AmbaQ, Помочь тебе не представляется возможным ибо нужен пароль логин что бы посмотреть что там, поэтому можно лишь посоветовать: поставь снифер(например HTTPAnalyzer7) и проанализируй запросы которые шлются браузером.

Цитата:
P.S. HTML, CSS., PHP, js знаю поверхностно, отсюда и проблема, я думаю. Заранее спасибо.
Знание этого не сильно нужно, нужны знания протокола HTTP + либ для работы по нему.

Последний раз редактировалось Avazart; 25.09.2014 в 17:56.
Avazart вне форума Ответить с цитированием
Старый 25.09.2014, 18:03   #5
AmbaQ
Пользователь
 
Аватар для AmbaQ
 
Регистрация: 23.12.2009
Сообщений: 47
По умолчанию

Цитата:
Сообщение от Avazart Посмотреть сообщение
Достаточным будет воссоздать AJAX запрос, так что не нужно пугать раньше времени.

AmbaQ, Помочь тебе не представляется возможным ибо нужен пароль логин что бы посмотреть что там, поэтому можно лишь посоветовать: поставь снифер(например HTTPAnalyzer7) и проанализируй запросы которые шлются браузером.


Знание этого не сильно нужно, нужны знания протокола HTTP + либ для работы по нему.
Спасибо, я написал Вам в ЛС, а снифером сейчас воспользуюсь =)
AmbaQ вне форума Ответить с цитированием
Старый 25.09.2014, 18:17   #6
Avazart
Форумчанин
 
Аватар для Avazart
 
Регистрация: 13.08.2011
Сообщений: 184
По умолчанию

Авторизация вроде простая, сначала делам GET запрос получаем "ключ", потом делаем POST используя этот ключ.

http://screencast.com/t/vulr6anauBE

Информация о рейтинге, работает через JSON

http://screencast.com/t/eqXCI8JJCq5B

Последний раз редактировалось Avazart; 25.09.2014 в 18:50.
Avazart вне форума Ответить с цитированием
Старый 25.09.2014, 18:58   #7
AmbaQ
Пользователь
 
Аватар для AmbaQ
 
Регистрация: 23.12.2009
Сообщений: 47
По умолчанию

Цитата:
Сообщение от Avazart Посмотреть сообщение
Авторизация вроде простая, сначала делам GET запрос получаем "ключ", потом делаем POST используя этот ключ.

http://screencast.com/t/vulr6anauBE

Информация о рейтинге, работает через JSON

http://screencast.com/t/eqXCI8JJCq5B
Спасибо, теперь многое прояснилось!
AmbaQ вне форума Ответить с цитированием
Старый 26.09.2014, 11:47   #8
AmbaQ
Пользователь
 
Аватар для AmbaQ
 
Регистрация: 23.12.2009
Сообщений: 47
По умолчанию

Собственно история имеет продолжение =) Разобрался с запросами, не без помощи добрых людей, сервер ответил как нужно, прислал ответ json структуру, осталась одна проблема, как её правильно сохранить теперь в любой файл, я попробовал использовать txt, в итоге получил, не чтоб кракозябры, а вид, похожий на вид типизированного файла. Так как можно его правильно сохранить? Или как его правильно читать? Пользовался библиотекой DBXJSON, но ни одна функция не признаёт такой текст. Вот что в блокноте:
Код:
?      ??j?0?_?hm?7??0?R2?Y[eB?x4?I $?<B^!?!a?~????[HCS??CA`?->???rxJ???L??S?HDf??KU~??7?L>?z?"2_??? O?4??;?m?0
ILEL???S?S??Z5?lJ?"?P?\????i'+?@??????Q?l?]?k??}????U#k??*?F??	w( ???s7??{?.??pm6A??l^?[?}??5?
9???`???B?I?3
??F?|i8?d?hdE0? ?!???????/????v??pc??` {A&?K2?|?]5?b?H|?]5i??? ?i????uTG?X?`??????A){8*N???:?:????Y(??F?S_u?Rp?`?&?t?):?????14?&t4?@w{?4?.Жbi??
????RD48??
ES
B<
???Mp??A ?0\o?#?"??4?`JA?&8??.z?c ?C[

Вот что присылает сервер в ответ и то должно получиться в блокноте:

Код:
[{"Room":"9-516","IsCheckpoint":false,"ShortName":null,"Date":"2014-09-02T00:00:00",
"Attendance":1,"Teacher":null,"Grade":0,"GradeText":"","GainedScore":0.0,"LostScore":
0.0,"PenaltyScore":0.0,"ParentId":0,"Id":1817363990,"Name":"Практическое занятие"},
{"Room":"9-526","IsCheckpoint":false,"ShortName":null,"Date":"2014-09-02T00:00:00",
"Attendance":1,"Teacher":null,"Grade":0,"GradeText":"","GainedScore":0.0,"LostScore":0.0,
"PenaltyScore":0.0,"ParentId":0,"Id":1817364016,"Name":"Практическое занятие"},{"Room":"9-519",
"IsCheckpoint":false,"ShortName":null,"Date":"2014-09-09T00:00:00","Attendance":1,"Teacher":null,
"Grade":0,"GradeText":"","GainedScore":0.0,"LostScore":0.0,"PenaltyScore":0.0,"ParentId":0,"Id":1817364042,
"Name":"Практическое занятие"},{"Room":"9-516","IsCheckpoint":false,"ShortName":null,"Date":"2014-09-16T00:00:00
","Attendance":1,"Teacher":null,"Grade":0,"GradeText":"","GainedScore":0.0,"LostScore":0.0,"PenaltyScore":0.0,
"ParentId":0,"Id":1817364068,"Name":"Практическое занятие"},{"Room":"9-526","IsCheckpoint":false,"ShortName":null
Это маленькая часть того, что там должно быть. То что выше - это тип данных TJSONarray, как я понял, элементы там типа TJSOnobjeck, в post запросе я сохраняю его в переменную типа string, по мне так это странно, кто посоветует, как правильно сохранить это дело, так чтоб читабельно было.

Вот код отправки и сохранения данного post запроса (да, ужасно выглядит, но как заработает правильно оптимизирую):

Код:
procedure TForm1.Button2Click(Sender: TObject);
var
 token                   :       string;
 s                       :       tstringstream;
 F                       :       textfile;
begin
AssignFile(f, '.\1.txt');
Rewrite(f);

IdHttp3.Request.CustomHeaders.Add('X-Requested-With: XMLHttpRequest');
IdHttp3.Request.Host:='ecampus.ncfu.ru';
IdHttp3.Request.UserAgent:='Mozilla/5.0 (Windows NT 6.1; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0';
IdHttp3.Request.Accept:='*/*';
IdHttp3.Request.AcceptLanguage:='ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3';
IdHttp3.Request.AcceptEncoding:='gzip, deflate';
Idhttp3.Request.ContentType:='application/json; charset=UTF-8';
Idhttp3.Request.Referer:='http://ecampus.ncfu.ru/studies';
Idhttp3.Request.Connection:='keep-alive';
IdHttp3.Request.Pragma:='no-cache';
Idhttp3.Request.CacheControl:='no-cache';
idhttp3.Request.ContentLength:=44;
IdHTTP3.Request.AcceptCharSet   :=    'utf-8';

  s:=TStringStream.Create;

s.WriteString('{"studentId":1284814,"lessonTypeId":4359178}');

token:= (idhttp3.Post('http://ecampus.ncfu.ru/studies/GetLessons', s));

write(f,token);
CloseFile(F);

end;
знаю что где-то явно налажал, да ещё так тупо наверное...
AmbaQ вне форума Ответить с цитированием
Старый 26.09.2014, 13:06   #9
AmbaQ
Пользователь
 
Аватар для AmbaQ
 
Регистрация: 23.12.2009
Сообщений: 47
По умолчанию

РЕШЕНИЕ ТОГО ЧТО ВЫШЕ
ИЗВИНЯЮСЬ, данная проблема, которая описана постом выше решена, опять же я криворукий, я не воспользовался поиском и забыл, что gzip распаковать надо, просто убрал строку
Код:
 IdHttp3.Request.AcceptEncoding:='gzip, deflate';
AmbaQ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсинг страницы record222 Общие вопросы Delphi 1 28.06.2012 14:45
Парсинг html страницы Eldrich HTML и CSS 6 07.02.2011 01:25
Парсинг голой HTML страницы Blourid Работа с сетью в Delphi 5 15.03.2010 19:37
парсинг страницы seoanalyzer Общие вопросы Delphi 3 13.02.2009 12:50
Парсинг HTML страницы OkeaH Работа с сетью в Delphi 1 19.01.2009 09:17