Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
harvest6
Member

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

procedure TFUpdate.sButton3Click(Sender: TObject);
var i: Integer;
    AHTML, ACurCodeN: string;
    AValue, CValue: Currency;
    ADate, CDate: TDateTime;
    Doc: IHTMLDocument2;
    DocTR, DocTD: IHTMLElementCollection;
    TRElement: IHtmlElement;
    v: OleVariant;
begin
  CDate:=strtodate('01.11.2021');
  CValue:=3.1372;
  ACurCodeN:='376';
  try
    FDataModule.IdHTTP1.HandleRedirects:=true;
    AHTML:=FDataModule.IdHTTP1.Get('http://www.cbr.ru/hd_base/seldomc/sc_dynamic/?UniDbQuery.Posted=True&UniDbQuery.From='+DateToStr(CDate)+'&UniDbQuery.To='+DateToStr(Date)+'&UniDbQuery.ValID='+ACurCodeN);
    v:=VarArrayCreate([0,0], varVariant);
    v[0]:=AHTML;
    Doc:=coHTMLDocument.Create as IHTMLDocument2;
    Doc.write(PSafeArray(System.TVarData(v).VArray));
    DocTR:=Doc.all.tags('TR') as IHTMLElementCollection;
    for i := 1 to DocTR.length-1 do
    begin
      TRElement := DocTR.Item(i,0) as IHtmlElement;
      DocTD := TRElement.children as IHTMLElementCollection;
      if (DocTD.length > 2) then
      begin
        ADate:=StrToDate((DocTD.Item(0, 0) as IHtmlElement).innerText);
        if ADate=CDate then
        begin
          AValue:=StrToCurr((DocTD.Item(2, 0) as IHtmlElement).innerText);
          CValue:=AValue;
          sMemo1.Lines.Add(datetostr(ADate)+' '+floattostr(AValue));
          CDate:=CDate+1;
        end
        else
        begin
          while ADate>CDate do
          begin
            ADate:=CDate;
            AValue:=CValue;
            sMemo1.Lines.Add(datetostr(ADate)+' '+floattostr(AValue));
            CDate:=CDate+1;
            ADate:=StrToDate((DocTD.Item(0, 0) as IHtmlElement).innerText);
          end;
          AValue:=StrToCurr((DocTD.Item(2, 0) as IHtmlElement).innerText);
          CValue:=AValue;
          sMemo1.Lines.Add(datetostr(ADate)+' '+floattostr(AValue));
          CDate:=CDate+1;
        end;
      end;
    end;
  finally
  end;
end;


К сообщению приложен файл. Размер - 10Kb
19 ноя 21, 10:12    [22397821]     Ответить | Цитировать Сообщить модератору
 Re: Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15425
должно быть что-то типа

WebBrowser1.Silent := True;
не знаю, есть ли такое у IHTMLDocument2
19 ноя 21, 10:28    [22397832]     Ответить | Цитировать Сообщить модератору
 Re: Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
В каком месте возникает сообщение?

И почему вместо
harvest6
    v:=VarArrayCreate([0,0], varVariant);
    v[0]:=AHTML;
    Doc:=coHTMLDocument.Create as IHTMLDocument2;
    Doc.write(PSafeArray(System.TVarData(v).VArray));
не сделать
Doc:=coHTMLDocument.Create as IHTMLDocument2;
Doc.write(AHTML);
?
19 ноя 21, 12:33    [22397895]     Ответить | Цитировать Сообщить модератору
 Re: Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
harvest6
Member

Откуда:
Сообщений: 29
X11
должно быть что-то типа

WebBrowser1.Silent := True;
не знаю, есть ли такое у IHTMLDocument2
К сожалению такого свойства у IHTMLDocument2 нет

_Vasilisk_
В каком месте возникает сообщение?

Вот тут:
Doc.write(PSafeArray(System.TVarData(v).VArray));

_Vasilisk_
И почему не сделать
Doc:=coHTMLDocument.Create as IHTMLDocument2;
Doc.write(AHTML);
?
Потому что AHTML - это string, а внутри write должен быть PSafeArray
Кстати если включить режим
Doc.designMode:= 'on';
то сообщение не появляется
19 ноя 21, 12:50    [22397906]     Ответить | Цитировать Сообщить модератору
 Re: Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1504
harvest6,

а через вебсервисы ЦБ (а не веб-страницу) эти же данные нельзя получить? Может проще будет, не нужно будет парсить страницу. Я сам курс валют на текущую дату получал, не знаю, есть ли то, что нужно вам.
http://www.cbr.ru/development/
19 ноя 21, 13:04    [22397913]     Ответить | Цитировать Сообщить модератору
 Re: Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1504
Вот тут Example 2, как получить динамику курса какой-то валюты в заданном диапазоне дат:
http://www.cbr.ru/development/SXML/
19 ноя 21, 13:21    [22397922]     Ответить | Цитировать Сообщить модератору
 Re: Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1592
harvest6,

lmgfy
19 ноя 21, 14:19    [22397953]     Ответить | Цитировать Сообщить модератору
 Re: Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
harvest6
Member

Откуда:
Сообщений: 29
s62
а через вебсервисы ЦБ (а не веб-страницу) эти же данные нельзя получить? Может проще будет, не нужно будет парсить страницу. Я сам курс валют на текущую дату получал, не знаю, есть ли то, что нужно вам.
http://www.cbr.ru/development/
Я никогда не работал с вебсервисами, поэтому не знаю можно ли их использовать( Нужная информация там есть.
s62
Вот тут Example 2, как получить динамику курса какой-то валюты в заданном диапазоне дат:
http://www.cbr.ru/development/SXML/
Увы, но API ЦБ не предоставляет нужную информацию в виде XML.
Zelius
lmgfy
тоже, но по-русски: https://fooobar.com/questions/8964010/silently-block-cookies-warning-with-ihtmldocument2-in-delphi

Вот эта строчка в пока не очень понятном для меня тексте смущает:
Боюсь, вы не сможете скрыть это сообщение. Зачем?
19 ноя 21, 14:47    [22397975]     Ответить | Цитировать Сообщить модератору
 Re: Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1504
harvest6
... Нужная информация там есть.

...Увы, но API ЦБ не предоставляет нужную информацию в виде XML.
Из того, что я просмотрел, там все результаты в виде XML как раз и представляются.
19 ноя 21, 14:54    [22397982]     Ответить | Цитировать Сообщить модератору
 Re: Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1504
harvest6
Я никогда не работал с вебсервисами, поэтому не знаю можно ли их использовать( Нужная информация там есть.
Пишете запрос, получаете ответ. Разбираете его.
Форматы запросов и ответов приведены здесь (раздел ежедневных данных): http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx

p.s. Да, там есть версии, где указан формат ответа не XML, а Dataset (что бы это ни значило :) ), но по-моему у всех есть парные методы с ответом в формате XML.

Сообщение было отредактировано: 19 ноя 21, 15:02
19 ноя 21, 14:58    [22397985]     Ответить | Цитировать Сообщить модератору
 Re: Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
harvest6
Member

Откуда:
Сообщений: 29
s62
Из того, что я просмотрел, там все результаты в виде XML как раз и представляются.
Ну если дадите ссылку на XML-файл, в котором есть такая валюта:
VAL_NM_RQ=R01265
NumCode=376
CharCode=ILS
то я буду просто счастлив)
19 ноя 21, 15:12    [22397992]     Ответить | Цитировать Сообщить модератору
 Re: Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
harvest6
Ну если дадите ссылку на XML-файл, в котором есть такая валюта:
Этой валюты и на сайте нет.
19 ноя 21, 16:27    [22398028]     Ответить | Цитировать Сообщить модератору
 Re: Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
harvest6
Member

Откуда:
Сообщений: 29
_Vasilisk_
Этой валюты и на сайте нет.
Обратите внимание, что кусок кода приведенный мной скачивает с сайта котировки именно этой валюты с 01.11.2021 по 19.11.2021. Вот скрин

К сообщению приложен файл. Размер - 11Kb
19 ноя 21, 16:34    [22398033]     Ответить | Цитировать Сообщить модератору
 Re: Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
http://www.cbr.ru/currency_base/dynamics/?UniDbQuery.Posted=True&UniDbQuery.so=1&UniDbQuery.mode=1&UniDbQuery.date_req1=&UniDbQuery.date_req2=&UniDbQuery.VAL_NM_RQ=R01265&UniDbQuery.From=01.11.2021&UniDbQuery.To=19.11.2021

К сообщению приложен файл. Размер - 26Kb
19 ноя 21, 16:40    [22398036]     Ответить | Цитировать Сообщить модератору
 Re: Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
harvest6
Member

Откуда:
Сообщений: 29
_Vasilisk_
У Вас адрес неверный
Должен быть такой: http://www.cbr.ru/hd_base/seldomc/sc_dynamic/?UniDbQuery.Posted=True&UniDbQuery.From=01.11.2021&UniDbQuery.To=19.11.2021&UniDbQuery.ValID=376

К сообщению приложен файл. Размер - 50Kb
19 ноя 21, 16:47    [22398040]     Ответить | Цитировать Сообщить модератору
 Re: Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
Котировки редких валют предоставляемые агентством «Thomson Reuters»
Вот там и нужно искать

Сообщение было отредактировано: 19 ноя 21, 16:53
19 ноя 21, 16:50    [22398042]     Ответить | Цитировать Сообщить модератору
 Re: Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358


К сообщению приложен файл. Размер - 38Kb
19 ноя 21, 16:53    [22398045]     Ответить | Цитировать Сообщить модератору
 Re: Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1504
_Vasilisk_,

Я подумал, что стоило бы там посмотреть, но ЦБ предоставляет эти данные
http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?op=GetReutersCursDynamicXML

Только я не понял, что означают слова:
автор
Форма для тестирования доступна только для запросов от локальных компьютеров.


Сообщение было отредактировано: 19 ноя 21, 17:01
19 ноя 21, 17:00    [22398050]     Ответить | Цитировать Сообщить модератору
 Re: Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
harvest6
Member

Откуда:
Сообщений: 29
_Vasilisk_
Вот там и нужно искать
Не все так просто... Но что-то ушли от темы сообщения.
Выяснилось, что включение режима редактирования
Doc.designMode:= 'on';
убирает это всплывающее окно. На что он может повлиять еще? я его потом отключаю после разбора документа.
19 ноя 21, 17:05    [22398054]     Ответить | Цитировать Сообщить модератору
 Re: Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1504
harvest6
s62
Из того, что я просмотрел, там все результаты в виде XML как раз и представляются.
Ну если дадите ссылку на XML-файл, в котором есть такая валюта:
VAL_NM_RQ=R01265
NumCode=376
CharCode=ILS
то я буду просто счастлив)

В принципе в Delphi есть специализированные компоненты для работы с веб-службами (закладка WebServices), но я не знаю, как с ними работать.
Используем компонент TNetHTTPClient, например. Надо послать POST запрос, такой, как указано вот тут:
http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?op=GetReutersCursDynamicXML
Выберем, например, SOAP 1.2. Задаем тело запроса такое:

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <GetReutersCursDynamicXML xmlns="http://web.cbr.ru/">
      <FromDate>dateTime</FromDate>
      <ToDate>dateTime</ToDate>
      <NumCode>int</NumCode>
    </GetReutersCursDynamicXML>
  </soap12:Body>
</soap12:Envelope>

Даты надо задать в формате YYYY-MM-DD. Код - 376. Задаем свойство NetHTTPClient.ContentType := 'application/soap+xml; charset=utf-8', как указано в описании (я задал через инспектор объектов). Отправляем запрос и выводим ответ для примера в Memo.

procedure TForm1.Button1Click(Sender: TObject);
var SS: TStringStream;
begin
  SS := TStringStream.Create(BodyStr, TEncoding.UTF8);
  try
    Memo.Lines.LoadFromStream(Client.Post('http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx', SS, nil, nil).ContentStream,
      TEncoding.UTF8);
  finally
    SS.Free;
  end;
end;

Задал даты как у вас 22398033, с 11.11.2021 по 19.11.2021. Получил ответ:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetReutersCursDynamicXMLResponse xmlns="http://web.cbr.ru/">
<GetReutersCursDynamicXMLResult><ReutersValuteData xmlns="">
<VCD><DT>2021-11-11T00:00:00+03:00</DT><val>3.1210</val><dir>0</dir></VCD>
<VCD><DT>2021-11-12T00:00:00+03:00</DT><val>3.1151</val><dir>0</dir></VCD>
<VCD><DT>2021-11-15T00:00:00+03:00</DT><val>3.1047</val><dir>0</dir></VCD>
<VCD><DT>2021-11-16T00:00:00+03:00</DT><val>3.1052</val><dir>0</dir></VCD>
<VCD><DT>2021-11-17T00:00:00+03:00</DT><val>3.0866</val><dir>0</dir></VCD>
<VCD><DT>2021-11-18T00:00:00+03:00</DT><val>3.0822</val><dir>0</dir></VCD>
<VCD><DT>2021-11-19T00:00:00+03:00</DT><val>3.0846</val><dir>0</dir></VCD>
</ReutersValuteData></GetReutersCursDynamicXMLResult>
</GetReutersCursDynamicXMLResponse>
</soap:Body>
</soap:Envelope>


Сообщение было отредактировано: 22 ноя 21, 02:16
22 ноя 21, 02:12    [22398851]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить