1 (edited by RZ-007 2016-11-19 14:44:17)

Topic: TWebBrowser

Здравствуйте Дмитрий!!!
Form1.Memo1.Lines.Text:= HTTPGet('https://yandex.ru'); //получаем HTML-код странички ЭТО РАБОТАЕТ_ОК!!!
У меня такой вопрос:
на форме есть TWebBrowser и мемо, как сделать чтоб по клику на Button1
получить исходный HTML-код странички которая загружена именно в TWebBrowser...  появился в мемо???
т.е. запросить HTML-код у TWebBrowser???

Post's attachments

Attachment icon Скриншот 19-11-2016 173528.png 50.69 kb, 357 downloads since 2016-11-19 

Re: TWebBrowser

Приветствую.


Скачайте пожалуйста последнюю бета версию.
http://myvisualdatabase.com/forum/viewtopic.php?id=2887



Пример, как получить html из TWebBrowser

Post's attachments

Attachment icon TWebBrowser get html.zip 3.9 kb, 524 downloads since 2016-11-21 

Dmitry.

3 (edited by RZ-007 2016-11-23 22:22:10)

Re: TWebBrowser

Дмитрий...это просто чудо...ВСЁ РАБОТАЕТ...ОК!!!
Дмитрий...и пользователи MVD кто увлекается парсингом!!!
Есть сайт:

URL :='https://m.avito.ru/sankt-peterburg/sobaki/miniatyurnyy_metis_rotveylera_devochka_866645105'  //именно мобильная версия

в нём надо спарсить номер телефона!!!, но проблема в том, что на сайте присутствует битон "показать номер"!!!
У меня в голове крутится два решения:
1.) делаем:

S:=HTTPGet('https://m.avito.ru/sankt-peterburg/sobaki/miniatyurnyy_metis_rotveylera_devochka_866645105');

В коде находим нужную строчку...она нужна для следующего запроса:

sankt-peterburg/sobaki/miniatyurnyy_metis_rotveylera_devochka_866645105/phone/a16d85fb23a4c6d042f5bad7773d5ee6 

А теперь самое интересное...программкой "fiddler web debugger " при нажатием на битон "показать номер"
перехватываю данные который посылает браузер для получении номера "{"phone":"8 921 964-64-89"}" от сервера...
мои перехваченные данные из браузера:
Headres

GET /sankt-peterburg/sobaki/miniatyurnyy_metis_rotveylera_devochka_866645105/phone/a16d85fb23a4c6d042f5bad7773d5ee6?async HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate, lzma, sdch, br
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.87 Safari/537.36 OPR/41.0.2353.56
X-Requested-With: XMLHttpRequest
Referer: https://m.avito.ru/sankt-peterburg/sobaki/miniatyurnyy_metis_rotveylera_devochka_866645105
Connection: keep-alive
Host: m.avito.ru

Raw

GET https://m.avito.ru/sankt-peterburg/sobaki/miniatyurnyy_metis_rotveylera_devochka_866645105/phone/a16d85fb23a4c6d042f5bad7773d5ee6?async HTTP/1.1
Host: m.avito.ru
Connection: keep-alive
Accept: application/json
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.87 Safari/537.36 OPR/41.0.2353.56
Referer: https://m.avito.ru/sankt-peterburg/sobaki/miniatyurnyy_metis_rotveylera_devochka_866645105
Accept-Encoding: gzip, deflate, lzma, sdch, br
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4

Как я только их не группировал...какими символами их не разделял...результат нулевой...
S:=HTTPGet('?????????????????????????????????????????????????????????????');  //как правильно это записать???
Естественный вопрос: в MVD-это возможно??? или нужна доп.функция???
2.) Также интересно...ВЫ Дмитрий на пост №2 показали как из самого TWebBrowser по клику на битон
получить исходный HTML-код странички которая загружена именно в TWebBrowser...ОК!!!
Вопрос:
если страничка:     

URL :='https://m.avito.ru/sankt-peterburg/sobaki/miniatyurnyy_metis_rotveylera_devochka_866645105'  //именно мобильная версия

загружена в TWebBrowser...теперь по клику на битон в MBD...
автоматически происходил клик на битоне "показать номер" в  TWebBrowser загруженной странички???
Такое возможно??? или это из области фантастики моих мыслей???
Любая идея будет в помощь!!! Заблаговременно СПАСИБО!!!

Re: TWebBrowser

С такими ньюансами к сожалению помочь не смогу. Нет опыта.

Dmitry.

5 (edited by RZ-007 2016-11-25 15:56:17)

Re: TWebBrowser

Дмитрий спасибо за внимания...ещё микро вопросик!!!!
Если в TWebBrowser открыть ссылку:

URL :='https://m.avito.ru/sankt-peterburg/sobaki/miniatyurnyy_metis_rotveylera_devochka_866645105'

появляется нужная страничка, где присутствует практически такой же
битон как в MVD....
Вопрос:
используя в MVD битон или что то ещё...,
возможно осуществить автоматический клик на сайте по битону в TWebBrowser???
(может быть используя оси Х и У...или текст на который надо кликнуть???)
рисунок прилагается...

Post's attachments

Attachment icon Скриншот 25-11-2016 180849.png 219.17 kb, 338 downloads since 2016-11-25 

Re: TWebBrowser

RZ-007
Добавил для TWebBrowser методы
ClickElement
GetAllInnerText


Скачайте альфа версию
http://myvisualdatabase.com/forum/viewtopic.php?id=2887


пример:

var
    Web: TWebBrowser;

procedure Form1_Button1_OnClick (Sender: string; var Cancel: boolean);
begin
    Web.Navigate('http://myvisualdatabase.com');

    while Web.ReadyState <> 4 do Application.ProcessMessages;
    if Web.ClickElement('a', 'FORUM') then ShowMessage('found and clicked FORUM');

    while Web.ReadyState <> 4 do Application.ProcessMessages;
    if Web.ClickElement('span', 'General') then ShowMessage('found and clicked General');

    // Get all span elements
    ShowMessage(Web.GetAllInnerText('span'));
end;

procedure Form1_OnShow (Sender: string; Action: string);
begin
    Web := TWebBrowser.Create(Form1);
    TWinControl(Web).Parent := Form1.Panel1;
    Web.Width := Form1.Width;
    Web.Height := Form1.Height-50;
    Web.Silent := 1;
end;


Проект:

Post's attachments

Attachment icon TWebBrowser click elements.zip 4.17 kb, 478 downloads since 2016-11-28 

Dmitry.

7 (edited by RZ-007 2016-12-04 17:11:57)

Re: TWebBrowser

Дмитрий это просто ЧУДЕСНО!!! Огромное Вам СПАСИБО!!!
Подскажите как проверить по клику на Button1:
1) если подключения с "интернетом"  НЕТ...then  ShowMessage('нет интернета') else Form1.Memo1.Lines.Add (Source);

procedure Form1_Button1_OnClick (Sender: string; var Cancel: boolean);
var
 Source: string;
begin
    try
      Source:= HTTPGet('https://www.yandex.ru',True);
    except
        if ExceptionMessage <> 'HTTP/1.1 404 Not Found' then  ShowMessage('нет интернета') else Form1.Memo1.Lines.Add (Source);
    end;
end;

отчего то вторая часть не срабатывает ...(else Form1.Memo1.Lines.Add (Source)
где я напортачил???
2.) как сделать проверку: до конца ли загрузилась страничка в TWebBrowser???
это нужно для:

procedure Form1_Button1_OnClick (Sender: string; var Cancel: boolean);
var
   sHTML: string;
begin
    while Web.ReadyState <> 4 do Application.ProcessMessages;
    sHTML := Web.GetHTMLBody;
    Form1.Memo1.Text := sHTML;
end;

P.S. используя новый метод ClickElement  в TWebBrowser, если сразу запросить sHTML := Web.GetHTMLBody,
то получим HTML-код до применения  метода ClickElement...так как страничка не успела загрузиться в TWebBrowser...

может быть прогресс-бар показывал загрузку странички в TWebBrowser

не давая другим действиям опережать события?
3.) есть способ по клику на Button1 открыть именно:

ShowMessage('Привет!')  //без кнопки "ОК" -не принципиально, но интересно?

на три секунды...после чего оно автоматически само закроется(минимум скрипта)???

Re: TWebBrowser

RZ-007
1.
Блок Except выполняется только при наличии ошибки, нужно так

procedure Form1_Button1_OnClick (Sender: string; var Cancel: boolean);
var
   Source: string;
begin
    try
      Source:= HTTPGet('https://www.yandex.ru',True);
    except
        if ExceptionMessage <> 'HTTP/1.1 404 Not Found' then  ShowMessage('нет интернета');
    end;
    Form1.Memo1.Lines.Add (Source);
end;


2. В данном коде уже есть проверка на загрузку страницы, данная строка

while Web.ReadyState <> 4 do Application.ProcessMessages;

зацикливается до тех пор, пока страница не будет загружена полностью. В моем примере есть использование ClickElement


3. Не понял вопроса.

Dmitry.

9 (edited by RZ-007 2016-12-05 17:33:07)

Re: TWebBrowser

Здравствуйте Дмитрий!!!

DriveSoft wrote:

RZ-007

2. В данном коде уже есть проверка на загрузку страницы, данная строка

while Web.ReadyState <> 4 do Application.ProcessMessages;

зацикливается до тех пор, пока страница не будет загружена полностью. В моем примере есть использование ClickElement

Я это понимаю, но к сожалению: 

procedure Form1_Button1_OnClick (Sender: string; var Cancel: boolean);
var
     sHTML: string;
begin
{1часть}      Web.Navigate('https://m.avito.ru/vyselki/avtomobili/daewoo_nexia_2012_881652265');

{2часть}      while Web.ReadyState <> 4 do Application.ProcessMessages;
              if    Web.ClickElement('span', 'Показать номер')  then  //ShowMessage('нашли номер телефона');
//верхняя часть скрипта срабатывает на УРА!!!, но нижняя часть выдаёт HTML-код 1части, а надо 2части!!!

{3часть}      while Web.ReadyState <> 4 do Application.ProcessMessages;

                     sHTML := Web.GetHTMLBody;
                     Form1.Memo1.Text := sHTML;

                     Form2.show;

end;

Как приостановить 3часть...до тех пор, пока 2часть прогрузится до конца???

Re: TWebBrowser

RZ-007
Не думаю что там все так просто, на сайте есть защита от подобных манипуляций, также после теста вашего примера сайт меня заблокировал

Доступ с вашего IP-адреса временно ограничен

Dmitry.

Re: TWebBrowser

Если нашли способ перехвата телефона с авито, отпишитесь пожалуйста!

Re: TWebBrowser

sidhillsaid wrote:

Если нашли способ перехвата телефона с авито, отпишитесь пожалуйста!

Приветствую!
Да...такая возможность появилась благодаря новым возможностям MVD...(ClickElement)
С такими темпами "инфляции"... "нас ни кто не догонит"!!!!!!!!!!!!!!!!!!...-Дмитрий СПАСИБО ВАМ!!!
Авито-№ телефона
1.) Делаем веб-браузер...заганяем в него страничку с Авито
P./S. Важно!!! именно мобильную версию!!!
2.) используем пример Дмитрия в этой теме ПОСТ № 6(происходит автоматический клик по номеру телефона)
3.) используем пример Дмитрия в этой теме ПОСТ № 2
(получаем исходный HTML-код странички которая загружена именно в TWebBrowser )
Надеюсь Вам эта инфа поможет!

Re: TWebBrowser

Здравствуйте Дмитрий!!!...прошу прощения если "полез по перёд батьки" ПОСТ №12...

DriveSoft wrote:

RZ-007
Не думаю что там все так просто, на сайте есть защита от подобных манипуляций, также после теста вашего примера сайт меня заблокировал

Доступ с вашего IP-адреса временно ограничен

Вообще то такого не должно быть, сайт доступен для всех...
уже неделю эксперементирую на нём с № телефона всё ОК!!!
Дмитрий можно к этому вопросу подойти под другим углом....
Сделал пример основываясь на ваших примерах:

procedure Form1_Button4_OnClick (Sender: string; var Cancel: boolean);
var
    sHTML: string;
begin
    Web.Navigate('http://myvisualdatabase.com'); //{1 часть}-имеет свой HTML-код

    while Web.ReadyState <> 4 do Application.ProcessMessages;
    if Web.ClickElement('a', 'FORUM') then  //{2 часть}-имеет свой HTML-код

    while Web.ReadyState <> 4 do Application.ProcessMessages;

    sHTML := Web.GetHTMLBody;
    Form1.Memo1.Text := sHTML; //получаем  HTML-код {1 часть}, а нужно {2 часть}!!!

end;

получаем  HTML-код {1 часть}, а нужно {2 часть}??????????????????????????????
На этом сайте Вас не должны заблокировать...:) и smile

Re: TWebBrowser

RZ-007 wrote:
sidhillsaid wrote:

Если нашли способ перехвата телефона с авито, отпишитесь пожалуйста!

Приветствую!
Да...такая возможность появилась благодаря новым возможностям MVD...(ClickElement)
С такими темпами "инфляции"... "нас ни кто не догонит"!!!!!!!!!!!!!!!!!!...-Дмитрий СПАСИБО ВАМ!!!
Авито-№ телефона
1.) Делаем веб-браузер...заганяем в него страничку с Авито
P./S. Важно!!! именно мобильную версию!!!
2.) используем пример Дмитрия в этой теме ПОСТ № 6(происходит автоматический клик по номеру телефона)
3.) используем пример Дмитрия в этой теме ПОСТ № 2
(получаем исходный HTML-код странички которая загружена именно в TWebBrowser )
Надеюсь Вам эта инфа поможет!

Спасибо, но к сожалению, данный пример для меня не выход)
Мне необходимо номер телефона, выгрузить в Edit на форме, а этого не получается сделать.
К тому же:
1) При открытии мобильной версии у меня "Сценарий не отвечает, продолжить выполнение?"
2) В исходном коде даже посе клика не находит номер(((

Re: TWebBrowser

RZ-007
после того как кликнули, поставьте паузу таким образом

Web.ClickElement('a', 'FORUM')

Sleep(1000);
Application.ProcessMessages;
Dmitry.

Re: TWebBrowser

Почему-то окно форма с tWebBrowser закрывается (как крестиком, так и по баттону закрытия формы) через раз. Иногда вообще не закрывается, с чем может быть связано?
И ещё, не понимаю значения строчки
while Web.ReadyState <> 4 do Application.ProcessMessages;
что она означает?

Re: TWebBrowser

sidhillsaid wrote:

Почему-то окно форма с tWebBrowser закрывается (как крестиком, так и по баттону закрытия формы) через раз. Иногда вообще не закрывается, с чем может быть связано?
И ещё, не понимаю значения строчки
while Web.ReadyState <> 4 do Application.ProcessMessages;
что она означает?

Приложите проект, с описанием, что необходимо сделать чтобы воспроизвести данное поведение.


Данная строка сама себя зацикливает, пока web страница не будет загружена браузером полностью,т.е. скрипт дальше не идет пока страница не будет загружена доконца.

Dmitry.

Re: TWebBrowser

Отправил проект на почту, с описанием

Re: TWebBrowser

sidhillsaid wrote:

Отправил проект на почту, с описанием

Окно не закрывается, пока страница не загружена полностью, в след. версии сделаю метод Stop для браузера, т.е. просто разместите кнопку

procedure frmAvito_Button3_OnClick (Sender: string; var Cancel: boolean);
begin
    Web.Stop;
end;

после нажатию на эту кнопку форму можно будет закрыть.



Также при создании объекта web, добавьте эту строку

Web.Silent := 1;

тогда сообщения об ошибках на странице мешать не будут.

Dmitry.

Re: TWebBrowser

Разместил кнопку с данным кодом,
ругается на слово Stop

Re: TWebBrowser

sidhillsaid wrote:

Разместил кнопку с данным кодом,
ругается на слово Stop

Я упомянул что сделаю метод Stop в следующей версии. Скачайте версию 3.05b

Dmitry.

Re: TWebBrowser

Да, извиняюсь не обратил внимания.
Все работает, вопрос решен.

Re: TWebBrowser

И ещё два вопроса, касаемых TWebBrowser
1) Как растянуть компонент на всю форму, при разворачивании окна?
2) Вы встроите весь вышеописаный функционал в версию 2.х - ведь TWebBrowser компонент этой версии.
Просто необходимо сдавать проект, а он в триал версии 3 создан, вскоре покупку попросит, или скажите, когда можно будет купить стабильную 3 версию?)

Re: TWebBrowser

sidhillsaid wrote:

И ещё два вопроса, касаемых TWebBrowser
1) Как растянуть компонент на всю форму, при разворачивании окна?
2) Вы встроите весь вышеописаный функционал в версию 2.х - ведь TWebBrowser компонент этой версии.
Просто необходимо сдавать проект, а он в триал версии 3 создан, вскоре покупку попросит, или скажите, когда можно будет купить стабильную 3 версию?)

1. В другой вашей теме я сделал для вас пример.


2. Вы можете приобрести новую лицензию со скидкой 40% ($30), если необходимо, я могу вам на e-mail отправить ссылку для приобретения.

Dmitry.

Re: TWebBrowser

Да, отправьте пожалуйста. При приобретении этой версии, обновления так же до версии 4.0?