Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Embarcadero RAD Studio XE5-XE8,10.x(Seattle, Berl

Автор: voixkas
Дата сообщения: 22.03.2014 21:13
Подскажите, пожалуйста, с помощью каких стандартных компонентов оптимальнее всего выполнить следующую задачу?

Суть: необходимо автоматизировать сбор определённой информации о финансовых учреждениях из сети Интернет (информация публикуется на сайтах: как на официальных, так и на сторонних).
На каких-то сайтах информация доступна сразу, где-то необходимо аутентифицироваться как зарегистрированный пользователь. Где-то информация представлена в виде структурированных таблиц (на html-странице), где-то - необходимо запрашивать инфу по каждому объекту отдельно (вводим наименование объекта в поле ввода и нажимаем кнопку поиска).

В качестве инструментария имею XE5.

Ранее никогда не работал с чтением web-ресурсов. Поэтому сейчас не знаю с какой стороны подступиться к задаче.
Пока (дилетантски?) предполагаю, что необходимо будет коннектиться к web-ресурсу, при необходимости аутентифицироваться. Затем закачивать в строковую переменную всю страницу (в виде html-кода) и парсить её (по индивидуальным критериям, для каждого ресурса).

Собственно, вопросы.
С чего начать? Какими стандартными компонентами их XE5 лучше/уместнее всего пользоваться для подключения к http|https-ресурсам, чтобы прочитать содержимое страницы? Как программно пользоваться родным поиском сайта (грубо говоря, вносить текст в edit-box, "нажимать на кнопку") либо определить, по каким правилам строится запрос, самому генерировать его и передавать странице на исполнение? В общем, будет полезна любая инфа по сабжу.
Автор: ChSerg
Дата сообщения: 22.03.2014 22:21
voixkas

Если стандарные, то смотрите Indy
Автор: AlekXL
Дата сообщения: 22.03.2014 22:53

Цитата:
Если стандарные, то смотрите Indy

но лучше взять ICS. Говорят, indy это глюкодром. а ICS - пожалуй, единственный асинхронный.
Плюс, регулярные выражения , чтобы вытащить данные из html(из JCL-PCRE)
Плюс, база данных
но новичку все это будет непросто. Лучше нанять профи.
Автор: voixkas
Дата сообщения: 22.03.2014 23:02
ChSerg
AlekXL
А по-конкретнее можете объяснить?
Компонентов инди - 5 закладок. Что именно из них использоваться? Через какой компонент подключаться, загружать данные, аутентифицироваться, отправлять запрос и т.п.

П.С. Не совсем понял про асинхронный доступ. Мне, наверное, это не потребуется, т.к. буду явно контролировать весь процесс с последовательным перебором всех источников данных.
Автор: Alexey_Gawrilow
Дата сообщения: 23.03.2014 01:32
AlekXL
[
Цитата:
Говорят, indy это глюкодром

Говорят, что кур доят.

Indy - отличная библиотека. Есть особенности.
Как и любая другая:
- да, не лишена недостатков
- ей пользуются, а значит и говорят про нее, то, чем недовольны.

Большинство причин для критики объясняются просто:
Вы не любите кошек - вы просто не умеете их готовить.

Есть море библиотек для программирования коммуникаций на базе сокетов.
И Indy в ряду первых и лучших.
Несколько меньше библиотек предлагает реализацию прикладных протоколов.
И Indy также в ряду первых и лучших.

Indy, Synapse, ICS, TurboPower Internet Professional.
Из коммерческих я лично хотел бы упомянуть DXSock от Brain Patchwork DX, LLC.
Clever подрос, сначала было не очень.
Это что касается сокетов и протоколов.

Если просто о сокетах говорить, то очень не плохи стоковые, поставляемые VCL, причем обе генерации (TClientSocket, TServerSocket) и (TTCPSocket, TUDPSocket и т.п.).
SimpleTCP By UtilMind Solutions.
TSock by Ward van Wanrooij.
CrtSocket by Paul Toth.

Впрочем на них тоже реализации протоколы имеются.

О чем это? О том что решений множество..
И да..
Блокирующие решения таки проще для понимания и отладки.

voixkas

Цитата:
Что именно из них использоваться?

Мое мнение - ничем.
Эти иструменты не решат твою задачу вместо тебя.

Цитата:
Поэтому сейчас не знаю с какой стороны подступиться к задаче

И этот путь слишком низкоуровневый.
Да, он приведет к решению.
Да, узнаешь много интересного.
Да, прокачаешь скиллы во многих темах.
Но ведь, чтобы съесть гамбургер, не обязательно идти работать в Макдональдс.

Предлагаю иной вариант - используй функциональность браузера - компонент TWebBrowser.
Для данной задачи - выше крыши. IMHO.

Вот несколько полезных ссылок, для начала:

Парсинг от А до Я Блог о программировании парсеров и web-автоматизации - See more at: http://parsing-and-i.blogspot.ru/#sthash.nK84qEsY.dpuf Ну вот прямо твои задачи решает.

TWebBrowser - Delphi Usage Examples, Tips and Tricks

Раздел Internet / LAN на SwissDelphiCenter.ch

StackOverflow, просто первый попавшийся сохраненный топик по теме, используй Related, Тэги

Был еще такой проект как Embedded Web Browser Pack for Borland Delphi от Bsalsa Productions.
Остатки былого величия живут сейчас на GoogleCode
Автор: ChSerg
Дата сообщения: 23.03.2014 08:50
AlekXL
Полностью согласен с Alexey_Gawrilow.
Нормальная библиотека. Использую во всех проектах, включая коммерческие.
Никаких проблем.
Преимущество использования стандартных компонент в том, что при переходе на новую версию среды разработки достаточно просто перебилдить весь проект, а не ждать версию сторонней библиотеки для новой среды... ИМХО

Навскидку,
если работать с веб-сервисами посмотрите THTTPReqResp,
если просто скачивать странички и парсить, то TIdHTTP...
Автор: Frodo_Torbins
Дата сообщения: 23.03.2014 11:14
voixkas
Взаимодействие с содержимым стандартного веббраузера: http://delphikingdom.com/asp/viewitem.asp?catalogid=1410
Также рекомендую познакомится с веб-дебагерами, встроенными в популярные браузеры.
Автор: deks
Дата сообщения: 24.03.2014 10:49
voixkas

Я бы задачу начал решать так: путем использования сниффера HTTP протокола / средств разработчика в браузере понял бы как именно происходит авторизация на ресурсах (смотрим - какие запросы с какими полями шлет клиент и как отвечает сервер). Запоминаем логику работы и пытаемся повторить алгоритм внутри стандартного компонента WebBrowser. Если авторизация работает, и внутри стандартного компонента видны нужные данные - полдела сделано.

Дальше - просто сохраняем полученные данные на диск и парсим HTML как нам надо: или на уровне дельфи (да хоть в StringList, чтобы не заморачиваться), ну или XML, или JavaScript. Есть куча ниструментов - от DIHTMLParser до всяких XML библиотек. Но никто не отменяет и обычные регулярки. В общем - простор для творчества! Но мое ИМХО - это KISS, если данные можно достать через перебор StringList - зачем делать что то большее?

P.Sиспользуйте VCL!
Автор: Alexey_Gawrilow
Дата сообщения: 24.03.2014 14:21
AlekXL
deks
Уважаемые, ну зачем вы коллегу загоняете на сложный путь?

Было предложено истользование TWebBrowser, потому что:
1)
Цитата:
Как программно пользоваться родным поиском сайта (грубо говоря, вносить текст в edit-box, "нажимать на кнопку")

2) у TWebBrowser уже разобранный DOM
3) коллега уже знает ЧТО, ему надо КАК

В контексте задачи, разбор - вторичное и необходимое зло.
Если его можно избежать - зачем этим заморачиваться?

Ему качелька нужна, а вы американские горки строите.





Автор: Frodo_Torbins
Дата сообщения: 24.03.2014 17:18
deks
Я когда то пробовал сделать так как вы говорите, и там было много подводных камней. Свою задачу я толком так и не смог решить, слава Богу, это было не по работе.
Автор: deks
Дата сообщения: 24.03.2014 21:04
Alexey_Gawrilow

Я то как раз поддержал WebBrowser.

Frodo_Torbins

Полюбопытствую - а какого рода проблемы возникли? Я просто на берегу не вижу: тупо эму липучем сессию пользователя браузером, дальше потрошим страничку как надо. Чего может пойти не так?
Автор: Alexey_Gawrilow
Дата сообщения: 24.03.2014 23:19
deks
Ключевое отличие: у TWebBrowser уже разобранный DOM.
Парсить не надо.

Нужно просто найти нужный элемент.

Например, перебрать все таблицы.

Код:
vTableColl := wbWebBrowser.OleObject.Document.getElementsByTagName('Table');
iCount := vTableColl.length;

for i := 0 to iCount - 1 do begin
vTable := vTableColl.Item(i);
if vTable.id > EmptyStr then
{Именованная таблица}

iRowCount := vTable.rows.length;
for iRow :=0 to iRowCount - 1 do begin
vCols := vTable.rows.item(iRow).getElementsByTagName('TD');
iColCount := vCols.length;
for iCol := 0 to vCols - 1 do begin
s := vCols.Item(iCol).innerHTML;
{обрабатываем значение ячейки}
end;//iCol
end;//iRow
end;//i
end;
Автор: deks
Дата сообщения: 25.03.2014 08:46

Цитата:
Смутила следующая фраза

Цитата:
Дальше - просто сохраняем полученные данные на диск и парсим HTML как нам надо


Ага, ступил. Проще конечно DOM потискать через компонент.
Автор: Frodo_Torbins
Дата сообщения: 25.03.2014 17:35

Цитата:
Полюбопытствую - а какого рода проблемы возникли? Я просто на берегу не вижу: тупо эму липучем сессию пользователя браузером, дальше потрошим страничку как надо. Чего может пойти не так?

Нужно было получить с сайта интернет-провайдера количество оставшихся денег на счету. Саму циферку выдавал отдельный скрипт, и вот с ним как раз и возникли проблемы. Чтобы получить циферку, этот скрипт нужно было выполнить, а для этого нужен полноценный браузер, в Инди js-движка нету. Разобраться в том, как работает скрипт тоже не вышло - скрипт был обфусцирован а перехватчик пакетов не хотел показывать ничего полезного. Переписывать с Инди на полноценный WebBrowser я тогда не стал, а вскоре у провайдера появилось смс-информирование.
Автор: deks
Дата сообщения: 25.03.2014 18:36
Frodo_Torbins

А!) Есть такая тема с js. Если не заморачиваться сильно, то можно было бы еще DCEF заюзать теоретически, но это еще тот геморрой! Впрочем, задача должна была еще решаться сниффером http и "взломом" протокола - наверное терпения не хватило))
Автор: Frodo_Torbins
Дата сообщения: 26.03.2014 13:41
deks
Да, с полноценным снифером я заморачиваться не стал, ограничился плагином LiveHTTPHeaders для лисы.
Автор: voixkas
Дата сообщения: 26.03.2014 14:08
Спасибо, ребят, за ответы.

К сожалению, вашими советами пока не смогу воспользоваться. Начальник хочет, чтобы я забирал информацию с web-страниц только при помощи следующих инструментов: Excel, Oracle. В коде С++/паскале больше никто не разбирается и, случись чего со мной в будущем, никто не сможет дальше поддерживать созданное решение (вносить появляющиеся изменения как со стороны источников данных, так и со стороны приёмной БД). Этот аргумент не пробиваем. Поэтому при наличии молотка, будем забивать гвозди руками.

Собственно, если у кого есть какие идеи по автоматизации загрузки данных силами указанных инструментов удалению гланд галогеном через анус, буду признателен за советы. Если это будет офф-топ, отпишите, пожалуйста, в личку. У меня пока идейный ступор.
Автор: ZloyBrawler
Дата сообщения: 26.03.2014 14:33
VBA в MS Office Word/Excel + COM WebBrowser (контрол, легко добавляется на палитру компонентов)

Private Sub CommandButton1_Click()
WebBrowser1.Navigate ("ya.ru")
End Sub

И в добрый путь)))
Автор: deks
Дата сообщения: 26.03.2014 14:39
voixkas

Все что в данной ситуации могу посоветовать - заюзайте VBA/VB.NET (или чего там в Excel как скриптовый язык входит). То же управление WebBrowser через OLE вполне доступно! А начальнику можно сказать - что тот же Excel используется

ПС. Взаправду смешная история, повеселили))
Автор: Alexey_Gawrilow
Дата сообщения: 26.03.2014 23:24
voixkas

Цитата:
Excel, Oracle

Дурдом.

<ирония>
Они, конечно, именно для этого и предназначены.
</ирония>

Совет с использованием WebBrowser остается в силе.

Не... Конечно можно.
Запросить/загрузить в Oracle, и там распарсить.

Делали, работает.
Но елы-палы...
Оно не то затачивалось...
Миллионы человеко-часов...

Грабить кОрованы...


Автор: xpin2013
Дата сообщения: 27.03.2014 18:06
voixkas

Цитата:
Совет с использованием WebBrowser остается в силе.

Я целиком и полностью согласен с Alexey_Gawrilow

Цитата:
только при помощи следующих инструментов: Excel, Oracle.

Выбирайте Excel, в конвертациях данных - самая счастливая жизнь программиста.
Автор: DimDimon
Дата сообщения: 27.03.2014 21:27
Может кто знает можно ли использовать TRESTResponseDataSetAdapter
для передачи данных через JSON в сторону сервиса на хосте.

Я пока проверил передачу данных от сервиса хоста в приложение.
Использовав TRESTResponseDataSetAdapter. Все прекрасно работает.

А вот обратную передачу придется делать наверное в ручную,
используя RESTRequest->Params.
Или как-то можно этот процесс автоматизировать...???
Заранее спасибо.
Автор: krapotkin
Дата сообщения: 28.03.2014 07:02
все ведь от объема зависит
если укладывается в разумные рамки, используйте Post и Params
Автор: DimDimon
Дата сообщения: 28.03.2014 13:24
Post и Params - это понятно. Но почему можно тока принимать в датасет с хоста,- и никак отправить
из него?? Ведь перекидывать данные из датасета в Params,-нужно писать код...(
TRESTResponseDataSetAdapter - какое-то половинчатое решение в XE5....
Наверное все-таки есть там возможность???
Автор: krapotkin
Дата сообщения: 28.03.2014 13:27
А сервер никогда не принимал датасет с хоста.
Представьте все в пределах 1 компа.
Программа тянет к себе датасет, а обратно записывает всегда по одной записи.
Автор: Eternal_Shield
Дата сообщения: 28.03.2014 15:09
Случайно наткнулся на апликуху Digifort Mobile Client для камер слежения написанную на XE5 + FM: _http://www.youtube.com/watch?v=4lQGA8-sO9w

Собственно вопрос ... Если отбросить философию идеального кода и апроача реализации FM и прочей шелухи, а объективно так, значит таки можно писать на FM адекватные приложения? Выходит так?




Автор: Erazor84
Дата сообщения: 28.03.2014 15:21

Цитата:
Собственно вопрос ... Если отбросить философию идеального кода и апроача реализации FM и прочей шелухи, а объективно так, значит таки можно писать на FM адекватные приложения? Выходит так?

Я для себя сделал вывод, что более-менее стандартные приложения можно писать на FM. Да, код будет не идеальный, размер раздутый, но в большинстве случаев и этого достаточно, так как скорость разработки зачастую важнее.
Автор: X11
Дата сообщения: 28.03.2014 15:25
Eternal_Shield, видел сообщения, что реально от FMX там процентов 20.
Автор: Eternal_Shield
Дата сообщения: 28.03.2014 15:50
X11

Цитата:
видел сообщения, что реально от FMX там процентов 20.

Разрабы утверждают, что это pure FM без всяких кастомных контролов. Разумеется, сказать можно всё что угодно ... Да и люд силён додумать сам, когда не силах подобное повторить ... при таком раскладе сложно понять кто прав, а кто нет.

Как по мне, так я не вижу профита разрабам врать насчёт FM. Ради рекламы FM? Едва ли.

Честно, я не занимался ещё FM, не было задач ... сейчас появились и я начал ковырять в этом направлении. Оказывается, что если сильно захотеть, то всё может взлететь.

Автор: Lena44
Дата сообщения: 28.03.2014 15:59

Цитата:
Оказывается, что если сильно захотеть, то всё может взлететь.


Вот тут в презентации некоторые работы которые были сделаны на конкурс:
_https://softpromua.sharefile.com/download.aspx?id=d247cd0e134e4642

А это в игрушка на Дельфи в маркете:
_https://play.google.com/store/apps/details?id=ru.delphinotes.TapTap&hl=ru

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129

Предыдущая тема: Отмена встречи в Outlook из Excel VBA


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.