Delphi: использование компонента TWebBrowser для загрузки в базу данных
Постановка задачи: есть сайт, с которого надо закачать данные в имеющуюся в вашем распоряжении базу данных.
Для этого надо :
- 1. разобрать структуру страницы, с которой собираемся качать данные;
- 2. найти нужные элемнты структуры html-документа, в которых хранятся данные;
- 3. считать данне;
- 4. загрузить данные в таблицу базы данных
Думаю, что лучше всего рассмотреть данную задачу на конкретном примере. Имеется страница Центробанка, на которой размещаются курсы валют на указанную дату. Например, на 24.11.15 ссылка будет выглядеть следующим образом: http://cbr.ru/currency_base/daily.aspx?date_req=24.11.2015
Таблица базы данных имеет вид:
create table kurs_cb (data date, - соответствует дате курса валют id_valuta integer, - это код валюты. У меня в базе от цифровой kurs number(10,4), - текущий курс данной валюты на указанную дату kol integer - соответствует столбцу "Единиц" )
В браузере открываем исходный текст страницы и ищем нужную нам информацию.
<h2>Центральный банк Российской Федерации установил с 24.11.2015 следующие курсы иностранных валют к рублю Российской Федерации без обязательств Банка России покупать или продавать указанные валюты по данному курсу </h2><table class="data"><tbody><tr><th>Цифр. код</th><th>Букв. код</th><th>Единиц</th><th>Валюта</th><th>Курс</th></tr> <tr><td>036</td> <td>AUD</td> <td>1</td> <td>Австралийский доллар</td> <td>47,0792</td></tr> <tr><td>944</td> <td>AZN</td> <td>1</td> <td>Азербайджанский манат</td> <td>62,4082</td></tr> <tr><td>051</td> <td>AMD</td> <td>100</td> <td>Армянских драмов</td> <td>13,6377</td></tr> <tr><td>974</td> <td>BYR</td> <td>10000</td> <td>Белорусских рублей</td> <td>36,4977</td></tr> <tr><td>975</td> <td>BGN</td> <td>1</td> <td>Болгарский лев</td> <td>35,6565</td></tr> <tr><td>986</td> <td>BRL</td> <td>1</td> <td>Бразильский реал</td> <td>17,6917</td></tr> <tr><td>348</td> <td>HUF</td> <td>100</td> <td>Венгерских форинтов</td> <td>22,4425</td></tr> <tr><td>410</td> <td>KRW</td> <td>1000</td> <td>Вон Республики Корея</td> <td>56,5596</td></tr> <tr><td>208</td> <td>DKK</td> <td>10</td> <td>Датских крон</td> <td>93,4874</td></tr> <tr><td>840</td> <td>USD</td> <td>1</td> <td>Доллар США</td> <td>65,5973</td></tr> <tr><td>978</td> <td>EUR</td> <td>1</td> <td>Евро</td> <td>69,7037</td></tr> <tr><td>356</td> <td>INR</td> <td>100</td> <td>Индийских рупий</td> <td>98,8060</td></tr> <tr><td>398</td> <td>KZT</td> <td>100</td> <td>Казахстанских тенге</td> <td>21,3554</td></tr> <tr><td>124</td> <td>CAD</td> <td>1</td> <td>Канадский доллар</td> <td>48,9788</td></tr> <tr><td>417</td> <td>KGS</td> <td>100</td> <td>Киргизских сомов</td> <td>90,3109</td></tr> <tr><td>156</td> <td>CNY</td> <td>1</td> <td>Китайский юань</td> <td>10,2667</td></tr> <tr><td>498</td> <td>MDL</td> <td>10</td> <td>Молдавских леев</td> <td>32,6014</td></tr> <tr><td>934</td> <td>TMT</td> <td>1</td> <td>Новый туркменский манат</td> <td>18,7421</td></tr> <tr><td>578</td> <td>NOK</td> <td>10</td> <td>Норвежских крон</td> <td>75,7317</td></tr> <tr><td>985</td> <td>PLN</td> <td>1</td> <td>Польский злотый</td> <td>16,4478</td></tr> <tr><td>946</td> <td>RON</td> <td>1</td> <td>Румынский лей</td> <td>15,6748</td></tr> <tr><td>960</td> <td>XDR</td> <td>1</td> <td>СДР (специальные права заимствования)</td> <td>90,5131</td></tr> <tr><td>702</td> <td>SGD</td> <td>1</td> <td>Сингапурский доллар</td> <td>46,2409</td></tr> <tr><td>972</td> <td>TJS</td> <td>1</td> <td>Таджикский сомони</td> <td>10,2049</td></tr> <tr><td>949</td> <td>TRY</td> <td>1</td> <td>Турецкая лира</td> <td>23,0652</td></tr> <tr><td>860</td> <td>UZS</td> <td>1000</td> <td>Узбекских сумов</td> <td>24,2953</td></tr> <tr><td>980</td> <td>UAH</td> <td>10</td> <td>Украинских гривен</td> <td>27,3322</td></tr> <tr><td>826</td> <td>GBP</td> <td>1</td> <td>Фунт стерлингов Соединенного королевства</td> <td>99,4652</td></tr> <tr><td>203</td> <td>CZK</td> <td>10</td> <td>Чешских крон</td> <td>25,7917</td></tr> <tr><td>752</td> <td>SEK</td> <td>10</td> <td>Шведских крон</td> <td>75,2142</td></tr> <tr><td>756</td> <td>CHF</td> <td>1</td> <td>Швейцарский франк</td> <td>64,4058</td></tr> <tr><td>710</td> <td>ZAR</td> <td>10</td> <td>Южноафриканских рэндов</td> <td>46,6994</td></tr> <tr><td>392</td> <td>JPY</td> <td>100</td> <td>Японских иен</td> <td>53,2770</td></tr> </tbody></table>
Красота! Из нее видно, что данные хранятся в таблице. Она первая и последняя, поэтому ее индекс будет 1 (это вам понадобится чуть ниже). Осталось толко докопаться до этих элементов.
На форму кидаем TWebBrowser, TDateTimePicker, TQuery (не обязательно BDE-шный компонент, можно ADO, DBExpress ...) и кнопку (TButton), по нажатию которой будет качать данные в базу.
Командой Navigate('http://cbr.ru/currency_base/daily.aspx?date_req=' + DateToStr(DateTimePicker1.Date) + '''') - переходим на нужную страницу.
А теперь осталось обработать текст самой страницы
procedure TMainForm.Button2Click(Sender: TObject); var vTags, vCols:OleVariant; i : Integer ; Id_Valuta : String[18] ; kod : String[50] ; kol : String[20] ; valuta : String[50] ; kurs : string[18] ; begin vTags:=WebBrowser1.OleObject.Document.getElementsByTagName('Table'); // отобрали все таблицы в документе for i := 1 to (vTags.Item(1).rows.length-1) do // Item(1) - это как раз та единичка, про которую говорили выше begin vCols:=vTags.Item(1).rows.item(i).getElementsByTagName('TD'); // в каждой строке обращаемся поочередно к ячейкам, которых у нас пять (индексация от 0..4) Id_Valuta := Trim(vCols.Item(0).innerHTML) ; // Избавляемся от лишних символов и пробелов KOD := Trim(vCols.Item(1).innerHTML) ; While Pos(' ',KOD) > 0 do Delete(KOD,Pos(' ',KOD),6) ; Kol := Trim(vCols.Item(2).innerHTML) ; Valuta := Trim(vCols.Item(3).innerHTML) ; While Pos(' ',Valuta) > 0 do Delete(Valuta,Pos(' ',Valuta),6) ; Kurs := Trim(vCols.Item(4).innerHTML) ; While Pos(' ',Kurs) > 0 do Delete(Kurs,Pos(' ',Kurs),1) ; While Pos('"',Kurs) > 0 do Delete(Kurs,Pos('"',Kurs),1) ; // Конец подготовки данных для загрузки // Грузим данные в базу для этого используем компонент TQuery Query1.SQL.Clear ; Query1.SQL.Add('insert into nsi.kurs_cb Values (') ; Query1.SQL.Add('''' + MakeDate(DateTimePicker1.Date) + ''',') ; // MakeDate - функция, которая преобразует данные типа TDate в строковую переменную, соответствующую формату даты для загрузки в вашу базу. // Код функции не привожу, так как форматы данных везде разные Query1.SQL.Add(Id_Valuta + ',') ; Query1.SQL.Add(ZapToToch(Kurs) + ',') ; Query1.SQL.Add(Kol) ; SQL.Add(')') ; Query1.ExecSQL ; end ; // конец цикла
Вот вроде бы и все. Дальше уже ваша фантазия, где и как делать проверки, структура данных может отличаться от данной, где и как запускать. Все в ваших руках.