закачка контента в БД
Это самый типичный случай для делового приложения - закачка контента в БД. Ситуация может быть самая разбанальная - вы ищете варианты квартир или еще что-то в газетах типа "Авизо". Можно сканировать саму газету, можно листать сайт бесконечным образом, но все-таки более экономичный вариант - выкачать контент в базу данных и после программно обеспечить условия для поиска, печати или анализа информации.
NQL может получать доступ к БД тремя способами, или, как говорят, "методами": ODBC, ADO и OLEDB. По умолчанию стоит ODBC, и поскольку это работает нормально, нет никаких причин изменять это умолчание. Для Java-версии, соответственно, предусмотрено несколько методов с участием JDBC.
Для операций можно использовать SQL-конструкции и дополнительно - nextrecord для выбора следующей записи. Поля результирующего набора при выборе по SELECT отображаются в переменные автоматически. Nextrecod тоже автоматически, в духе NQL, устанавливает код ошибки, так что код, выполняющий запрос и обрабатывающий результат, выглядит тривиально:
opendb "phonebook" select "SELECT Contacts WHERE State='NY'"; while { show Name, Street, City, State, Zip, Phone nextrecord }
Рассмотрим практический пример - пусть наша программа получает данные из газеты объявлений и складывает их в таблицу БД. Как всегда, можно "пойти другим путем" - выкачать весь раздел или даже газету и потом в комфортной обстановке разбирать ее на молекулы. Либо же прямо в момент выкачки анализировать и выбирать нужные строки. Мы продемонстрируем второй вариант - то есть выкачаем один раздел с фильтрацией строк. Допустим, мы ищем б/у Hi-Fi технику.
Наша программа может выглядеть так:
record #avizorec=issue, rubric, rubname, pline
get 'http://www.aviso.com.ua/aviso/browse.asp' match "ads/kiv/{codename}.asp" pop
push codename match '{prefix}/' pop
get "http://www.aviso.com.ua/aviso/ads/kiv/" &codename&".asp" match "HRef=\"{pagename}.asp\">Rubric #620" pop push pagename match "{dbsec}/" pop
openbrowser "http://www.aviso.com.ua/aviso/ads/kiv/" &prefix&"/"&pagename&".asp",'','','','',True getbrowserdata
opendb 'avizo' table 'ads'
while true { match "<font size=+1>Aviso newspaper {issue}. Rubric {rubric}.{rubname}</font>" match "<br><br>" push. match "{lines}<BR><BR><BR><BR>" pop push lines while (match ("{pline}<br><br>")) { if contains (pline,'б/у')&&contains (pline,'удио') { addrecord #avizorec } } pop
match "<A HRef=\"{lnextp}.asp\">- NEXT - </A><BR>" else { break 2 } browse "http://www.aviso.com.ua/aviso/ads/kiv/" &prefix&"/"&dbsec&"/"&lnextp&".asp" getbrowserdata } closedb closebrowser
Как видно, здесь применяется комбинированный подход - сначала осуществляется поиск нужной страницы с помощью get (URL имеет прихотливый и непредсказуемый вид, так что приходится исследовать ссылки), а после, во избежание работы к куками, закачивается собственно информация - можете переделать этот фрагмент с использованием get и посмотреть, что получится. Результат в данном случае сохраняется в базе данных - предполагается, что вы предварительно создали ODBC-источник с именем avizo и что эта БД содержит таблицу adv. В дальнейшем нам ничего не мешает снова использовать NQL для работы с этими данными.
Пример реализации этой технологии: периодическое выкачивание предложений работы по заданному критерию (допустим, с такого мегапортала, как dice.com) и массовая рассылка резюме по найденным адресам (это вовсе не спам - там оставляют свои адреса как раз затем, чтобы им присылали резюме; да и как же иначе должен рассылать программист, если не автоматически?). Поскольку данные изменяются сравнительно медленно (скажем, раз в сутки-двое), а рассылки (гипотетически) производятся по несколько раз в день, то окажется выгодным закачивать данные один раз и хранить их в БД для последующего использования.
* * *
Всё, о чем тут шла речь, это только верхушка айсберга. Каждый из вас придумает (если уже не придумал) десятки применений своим агентам - от закачки бизнес-котировок до системы управления контентом, поиска квартирных вариантов или активной раскрутки веб-проектов. Только имейте в виду: вы в ответе за сетевых агентов, которых приручили,- и потом не говорите, что я вас не предупреждал!