powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
20 сообщений из 20, страница 1 из 1
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
    #40113040
harvest6
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно, вопрос в теме. Подскажите как победить всплывающее окно. Нашел только один вариант: править реестр перед загрузкой страницы, а потом возвращать в исходное состояние

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
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;
...
Рейтинг: 0 / 0
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
    #40113046
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
должно быть что-то типа

WebBrowser1.Silent := True;
не знаю, есть ли такое у IHTMLDocument2
...
Рейтинг: 0 / 0
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
    #40113084
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В каком месте возникает сообщение?

И почему вместо
harvest6
Код: pascal
1.
2.
3.
4.
    v:=VarArrayCreate([0,0], varVariant);
    v[0]:=AHTML;
    Doc:=coHTMLDocument.Create as IHTMLDocument2;
    Doc.write(PSafeArray(System.TVarData(v).VArray));

не сделать
Код: pascal
1.
2.
Doc:=coHTMLDocument.Create as IHTMLDocument2;
Doc.write(AHTML);

?
...
Рейтинг: 0 / 0
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
    #40113089
harvest6
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11должно быть что-то типа

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

_Vasilisk_ В каком месте возникает сообщение?
Вот тут:
Код: pascal
1.
Doc.write(PSafeArray(System.TVarData(v).VArray));


_Vasilisk_ И почему не сделать
Код: pascal
1.
2.
Doc:=coHTMLDocument.Create as IHTMLDocument2;
Doc.write(AHTML);

? Потому что AHTML - это string, а внутри write должен быть PSafeArray
Кстати если включить режим
Код: pascal
1.
Doc.designMode:= 'on';

то сообщение не появляется
...
Рейтинг: 0 / 0
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
    #40113094
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
harvest6,

а через вебсервисы ЦБ (а не веб-страницу) эти же данные нельзя получить? Может проще будет, не нужно будет парсить страницу. Я сам курс валют на текущую дату получал, не знаю, есть ли то, что нужно вам.
http://www.cbr.ru/development/
...
Рейтинг: 0 / 0
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
    #40113099
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тут Example 2, как получить динамику курса какой-то валюты в заданном диапазоне дат:
http://www.cbr.ru/development/SXML/
...
Рейтинг: 0 / 0
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
    #40113120
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
harvest6,

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

Вот эта строчка в пока не очень понятном для меня тексте смущает:
Боюсь, вы не сможете скрыть это сообщение. Зачем?
...
Рейтинг: 0 / 0
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
    #40113137
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
harvest6
... Нужная информация там есть.

...Увы, но API ЦБ не предоставляет нужную информацию в виде XML.
Из того, что я просмотрел, там все результаты в виде XML как раз и представляются.
...
Рейтинг: 0 / 0
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
    #40113139
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
harvest6
Я никогда не работал с вебсервисами, поэтому не знаю можно ли их использовать( Нужная информация там есть.
Пишете запрос, получаете ответ. Разбираете его.
Форматы запросов и ответов приведены здесь (раздел ежедневных данных): http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx

p.s. Да, там есть версии, где указан формат ответа не XML, а Dataset (что бы это ни значило :) ), но по-моему у всех есть парные методы с ответом в формате XML.
...
Рейтинг: 0 / 0
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
    #40113143
harvest6
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
s62Из того, что я просмотрел, там все результаты в виде XML как раз и представляются.Ну если дадите ссылку на XML-файл, в котором есть такая валюта:
VAL_NM_RQ=R01265
NumCode=376
CharCode=ILS
то я буду просто счастлив)
...
Рейтинг: 0 / 0
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
    #40113164
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
harvest6
Ну если дадите ссылку на XML-файл, в котором есть такая валюта:
Этой валюты и на сайте нет.
...
Рейтинг: 0 / 0
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
    #40113169
harvest6
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_Этой валюты и на сайте нет.Обратите внимание, что кусок кода приведенный мной скачивает с сайта котировки именно этой валюты с 01.11.2021 по 19.11.2021. Вот скрин
...
Рейтинг: 0 / 0
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
    #40113170
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
    #40113174
harvest6
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
    #40113176
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Котировки редких валют предоставляемые агентством «Thomson Reuters»Вот там и нужно искать
...
Рейтинг: 0 / 0
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
    #40113179
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
    #40113182
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

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

Только я не понял, что означают слова:
авторФорма для тестирования доступна только для запросов от локальных компьютеров.
...
Рейтинг: 0 / 0
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
    #40113184
harvest6
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_Вот там и нужно искать Не все так просто... Но что-то ушли от темы сообщения.
Выяснилось, что включение режима редактирования
Код: pascal
1.
Doc.designMode:= 'on';

убирает это всплывающее окно. На что он может повлиять еще? я его потом отключаю после разбора документа.
...
Рейтинг: 0 / 0
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
    #40113632
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<?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.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<?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>
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]