Delphi: использование компонента TWebBrowser для загрузки в базу данных

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

Для этого надо :

Думаю, что лучше всего рассмотреть данную задачу на конкретном примере. Имеется страница Центробанка, на которой размещаются курсы валют на указанную дату. Например, на 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 ;                                                         // конец цикла  
  

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