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

Код: 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
19.11.2021, 10:28
    #40113046
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
должно быть что-то типа

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

И почему вместо
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
19.11.2021, 12:50
    #40113089
harvest6
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
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
19.11.2021, 13:04
    #40113094
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
harvest6,

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

lmgfy
...
Рейтинг: 0 / 0
19.11.2021, 14:47
    #40113132
harvest6
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
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
19.11.2021, 14:54
    #40113137
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
harvest6
... Нужная информация там есть.

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

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

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

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

убирает это всплывающее окно. На что он может повлиять еще? я его потом отключаю после разбора документа.
...
Рейтинг: 0 / 0
22.11.2021, 02:12
    #40113632
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2
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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как победить всплывающее окно при парсинге через интерфейс IHTMLDocument2 / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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