Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2014, 16:29   #1
Fahman
Форумчанин
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 703
По умолчанию Webbrowser (событие по изменению кода html)

Доброго времени суток, Есть браузет webbrowser в delphi вот я его и использую загрузил одну данамическую страницу вот и хотел бы у вас узнать можно ли когда страница сама изменяется брать и выдергивать из нее код? Ну вот короче страничка
хочу просто цену нужную отображать и не хотелось бы брать каждый раз и делать запрос а хотелось бы просто чтоб когда данные сами изменились то текст сам спарсился
Вот мой код
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, SHDocVw, regExpr, ActiveX;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    WebBrowser1: TWebBrowser;
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure WebBrowser1DownloadComplete(Sender: TObject);
    procedure Memo1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


function WB_GetHTMLCode(WebBrowser: TWebBrowser; ACode: TStrings): Boolean;
var ps: IPersistStreamInit;
      ss: TStringStream;
      sa: IStream;
      s: string;
begin
ps := WebBrowser.Document as IPersistStreamInit;
s := '';
ss := TStringStream.Create(s);
try
sa := TStreamAdapter.Create(ss, soReference) as IStream;
Result := Succeeded(ps.Save(sa, True));
if Result then ACode.Add(ss.Datastring);
finally
ss.Free;
end;
end;
// перехожу по странице
procedure TForm1.Button1Click(Sender: TObject);
begin
     webbrowser1.Navigate(edit1.Text);
end;

//Тут я начал парсить


// После загрузки я вывожу в label результат так вот
// Чтоб постоянно не парсить можно сделать так чтоб при обновлении
//данных все обновлялось автоматом?

procedure TForm1.WebBrowser1DownloadComplete(Sender: TObject);
begin
WB_GetHTMLCode(Webbrowser1, Memo1.Lines);
end;

procedure TForm1.Memo1Change(Sender: TObject);
 var
RegExp: TRegExpr;
begin
 RegExp := TRegExpr.Create;
 RegExp.InputString :=Memo1.Text;
 RegExp.Expression :='<td class="lines">(.*?)</td>';
 if RegExp.Exec then
 begin
 label1.Caption:=(RegExp.Match[1]);
 end;
 RegExp.Free;
end;

end.
99% ошибок компьютера сидит в полуметре от монитора.
Fahman вне форума Ответить с цитированием
Старый 12.08.2014, 17:19   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Если IE ниже 9й версии - забудьте.
А так гуглим HTML DOM Mutation Events
http://stackoverflow.com/questions/5...ts-replacement
Человек_Борща вне форума Ответить с цитированием
Старый 12.08.2014, 17:25   #3
Fahman
Форумчанин
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 703
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Если IE ниже 9й версии - забудьте.
А так гуглим HTML DOM Mutation Events
http://stackoverflow.com/questions/5...ts-replacement
Спасибо, а как проверить какая версия у меня? можно же переустановить данный компонент?
99% ошибок компьютера сидит в полуметре от монитора.
Fahman вне форума Ответить с цитированием
Старый 12.08.2014, 17:58   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
можно же переустановить данный компонент?
Не поможет. Он тянет все из винды. Я даже не уверен в том что установка нового IE исправит дело.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.08.2014, 18:06   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
Не поможет. Он тянет все из винды. Я даже не уверен в том что установка нового IE исправит дело.
На XP, сервер 2003 максимум 8 IE поставите.
На Windows 7, 8 можете не волноваться.

Цитата:
можно же переустановить данный компонент?
Нельзя. Это компонент операционной системы.

Чем старше версии IE, том лучше реализована поддержка событий мутации DOM-дерева.
Человек_Борща вне форума Ответить с цитированием
Старый 14.08.2014, 00:51   #6
Fahman
Форумчанин
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 703
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
На XP, сервер 2003 максимум 8 IE поставите.
На Windows 7, 8 можете не волноваться.


Нельзя. Это компонент операционной системы.

Чем старше версии IE, том лучше реализована поддержка событий мутации DOM-дерева.
получается что вин 7,8 не проблема а на ХР надо переустановить? и только до 8 версии максимум, плохо это....
99% ошибок компьютера сидит в полуметре от монитора.
Fahman вне форума Ответить с цитированием
Старый 14.08.2014, 05:35   #7
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 178
По умолчанию

Можно-же обойтись и без TWebBrowser. Судя по коду страницы по ссылке данные обновляются раз в 30 секунд, причём все они тянутся из ajax по запросу:
Код HTML:
https://informers.instaforex.com/ru/quotes_online/ajax/tickers=EURUSD,GBPUSD,USDJPY,USDCAD,USDCHF,USDCAD,EURJPY,EURCHF,GBPJPY,GBPCHF,GOLD&callback=update_quotes?_=0
(опять-же в запросе можно убрать ненужные поля, например GOLD)- можно брать этот ajax, где-нибудь в потоке раз в 30 секунд(при весе около 1,5 кб вряд-ли это загрузит сеть), парсить и сравнивать значения со старыми, а там уже выводить нужные значения, строить графики и пр.

и да:
Цитата:
когда страница сама изменяется брать и выдергивать из нее код?
Очевидно-же что страница точно изменится не позднее чем через 1 минуту, ибо там есть поле со временем
DIONISKA вне форума Ответить с цитированием
Старый 14.08.2014, 11:37   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

DIONISKA, человеку надо ловить мутации конкретных узлов DOM, т.е. когда работает AJAX а не перезагружать всю страницу. Темболее что после перезагрузки всей страницы, нужных данных может просто не быть, для этого AJAX и придуман. Например сокрытие номеров телефонов/email'ов и прочего.

Цитата:
получается что вин 7,8 не проблема а на ХР надо переустановить?
Да. Заменить Windows XP на Windows 7. На Windows 7, установить IE 10.
В добавок запрашивать IHTMDocument8 а не IHTMLDocument2
Человек_Борща вне форума Ответить с цитированием
Старый 14.08.2014, 12:47   #9
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 178
По умолчанию

Цитата:
человеку надо ловить мутации конкретных узлов DOM, т.е. когда работает AJAX а не перезагружать всю страницу.
Единственное что я понял из топика это то, что ТС после загрузки страницы копирует код html из TWebBrowser а затем парсит нужные ему значения, при этом желает узнавать когда данные были изменены.
Я предлагал самому подгружать и обрабатывать ajax(не загружая страницу), который и так подгружает та страница один раз в 30 секунд:
Код HTML:
setInterval("start_update_quotes()", 30000);
ps: Насколько я понял тот-же MutationObserver требует IE 11 версии, а в поставке с win7 раньше шла 10-я версия(или я что-то пропустил?)
DIONISKA вне форума Ответить с цитированием
Старый 14.08.2014, 17:55   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
Я предлагал самому подгружать и обрабатывать ajax(не загружая страницу), который и так подгружает та страница
Бред пишите уважаемый. AJAX подгружает новый HTML код(какую-то часть, а не весь документ) куда-то а JS вставляет этот HTML куда-то на странице. Таким образом в оригинальном HTML этих новшевств нету. И перезагрузив страницу вы ничего не добъётесь.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WebBrowser, какое событие? spirit-ua Общие вопросы Delphi 3 22.01.2014 09:19
Нужен совет по изменению кода. Hezorin Помощь студентам 0 12.02.2012 21:23
Есть ли событие клика в webbrowser? и как его обработать? Зод Работа с сетью в Delphi 0 03.01.2012 00:57
Выдернуть куски кода из html-кода trafbite Помощь студентам 7 18.08.2007 13:51