powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CEF4Delphi в потоке с внешней формой
25 сообщений из 139, страница 3 из 6
CEF4Delphi в потоке с внешней формой
    #39854730
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,
Сформулируй задачу!
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854742
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парсинг сайта в отдельном потоке с использованием Cef4Delphi без дополнительного окна.
По ходу действа искать не только нужный текст, который можно сохранить в базу, но и нужный текст ссылок, по которым нужно кликать, например, чтобы открыть объявление, контакты или вернуться назад и перейти не следующую страницу.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854749
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Парсинг сайта в отдельном потоке с использованием Cef4Delphi без дополнительного окна.
По ходу действа искать не только нужный текст, который можно сохранить в базу, но и нужный текст ссылок, по которым нужно кликать, например, чтобы открыть объявление, контакты или вернуться назад и перейти не следующую страницу.
Зачем парсить сайт в отдельном потоке? Chromium создает несколько процессов для парсинга, тебе этого мало?
Может сделать со скрытым окном?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854755
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014Может сделать со скрытым окном?

сейчас это вопрос изучаю
21959107
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854758
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014Зачем парсить сайт в отдельном потоке? Chromium создает несколько процессов для парсинга, тебе этого мало?

потому что не хочется создавать новый проект и новую программу, в которой уже есть несколько других работающих парсеров, так сказать оболочка есть и к ней нужно прикрутить ещё один с браузером и чтобы не машать работе пользователя.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854764
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11, Разве примера из DOMVisitor не достаточно?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854765
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SallerX11я не понимаю, что такое скармливай. как, куда?
где, в какой момент?

Я cef4 только начал изучать
Возьми любую демку CEF4Delphi (например MiniBrowser), добавь туда Memo поле для ввода скрипта и кнопку для выполнения скрипта. В Обработчике клика кнопки прописывает
Код: pascal
1.
Chromium1.Browser.MainFrame.ExecuteJavaScript(Memo1.Text, Chromium1.Browser.MainFrame.Url, 0);



Заходим на страницу объявления и выполняем скрипт.

получилось без окон и панелей загрузить страницу в фоне и выполнить JS

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  constJS =  'var links = document.querySelectorAll("a.link-ajax.j-v-contacts-expand-link"); ' +
             'if (links) { ' +
             '  for (var x = 0; x <= links.length; x++) { ' +
             '    if (links[x]) { ' +
             '      if (links[x].innerHTML.trim().indexOf("показать контакты") != -1) { ' +
             '         links[x].click(); ' +
             '         console.log("my click"); ' +
             '      } ' +
             '    } ' +
             '  }' +
             '}';



В итоге в консоль в DevTools попало сообщение "my click"
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854771
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11ziv-2014Зачем парсить сайт в отдельном потоке? Chromium создает несколько процессов для парсинга, тебе этого мало?

потому что не хочется создавать новый проект и новую программу, в которой уже есть несколько других работающих парсеров, так сказать оболочка есть и к ней нужно прикрутить ещё один с браузером и чтобы не машать работе пользователя.
Вы не понимаете, как работает chromium. Там есть очередь обработки сообщений. Все операции выполняются в отдельных потоках. Результат выводится в главный поток для отображения. Все операции, которые происходят внутри, chromium уже распределяет по нужным ему потокам. Если вам надо сделать в отдельном потоке, то вам надо делать окно в отдельном потоке и обрабатывать сообщения этого окна. Но по-моему это большие грабельки.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854773
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014X11, Разве примера из DOMVisitor не достаточно?

Изучаю три примера.

На данный момент волнует вопрос, можно ли управлять общаться с браузером не из главного потока программы, а из дополнительного.
Пока не пробовал. Пока изучаю ...
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854774
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014Вы не понимаете, как работает chromium.

не спорю, поэтому и пытаюсь изучать и понять. К сожалению инфы на русском мало.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855148
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, а что нужно указывать в качестве NodeID?


Код: 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.
procedure SimpleNodeSearch(const aDocument: ICefDomDocument; const frame: ICefFrame; const NodeID: string);
var
  TempNode: ICefDomNode;
  msg: ICefProcessMessage;
begin
  try
    if aDocument <> nil then
    begin
      TempNode := aDocument.GetElementById(NodeID);
      msg := TCefProcessMessageRef.New(msg_for_chromium);

      if TempNode <> nil then
      begin
        msg.ArgumentList.SetString(0, 'Node found: ' + NodeID);
        msg.ArgumentList.SetString(1, 'Node name: ' + TempNode.Name);
        msg.ArgumentList.SetString(2, 'ElementInnerText: ' + TempNode.ElementInnerText);
        msg.ArgumentList.SetString(3, 'ElementTagName: ' + TempNode.ElementTagName);

      end
      else
        msg.ArgumentList.SetString(0, 'ERROR. Node not found: ' + NodeID);

      frame.SendProcessMessage(PID_BROWSER, msg);
    end;
  except
    on e : exception do
      if CustomExceptionHandler('SimpleNodeSearch', e) then raise;
  end;
end;



передаю "ad-author-contact-row-content" или "ad-author-contact-row-content j-c-phones" и процедура его не находит.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855153
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Это классы а не id
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855159
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну т.е. с помощью GetElementById не получится?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855178
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

нет
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855212
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ок, тогда с помощью чего найти телефон или признак телефона во время итерации по DOM?

Код: 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.
procedure SimpleDOMIteration(const aDocument: ICefDomDocument; const frame: ICefFrame);
var
  TempHead, TempChild : ICefDomNode;
  msg: ICefProcessMessage;
begin
  try
    if aDocument <> nil then
    begin
        TempHead := aDocument.Body;

        if TempHead <> nil then
        begin
          TempChild := TempHead.FirstChild;

          while TempChild <> nil do
          begin
            Msg := TCefProcessMessageRef.New(msg_for_chromium);
            if TempChild.ElementInnerText = '' then
            begin
              TempChild := TempChild.NextSibling;
              Continue;
            end;

            msg.ArgumentList.SetString(0, 'name: ' + Trim(TempChild.Name));
            msg.ArgumentList.SetString(1, 'TagName: ' + Trim(TempChild.ElementTagName));
            msg.ArgumentList.SetString(2, 'InnerText: ' + Trim(TempChild.ElementInnerText));

            frame.SendProcessMessage(PID_BROWSER, msg);

            TempChild := TempChild.NextSibling;
          end;
        end;
    end;
  except
    on e : exception do
      if CustomExceptionHandler('SimpleDOMIteration', e) then raise;
  end;
end;
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855213
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Ну например использовать префикс tel в href
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855217
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovиспользовать префикс tel в href

не понял
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855226
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если на примере цикла итерации по DOM, то как?

Код: 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.
procedure SimpleDOMIteration(const aDocument: ICefDomDocument; const frame: ICefFrame);
var
  TempHead, TempChild : ICefDomNode;
  msg: ICefProcessMessage;
  attrList: TStrings;
begin
  try
    if aDocument <> nil then
    begin
        TempHead := aDocument.Body;

        if TempHead <> nil then
        begin
          TempChild := TempHead.FirstChild;

          while TempChild <> nil do
          begin
            Msg := TCefProcessMessageRef.New(msg_for_chromium);
            if TempChild.ElementInnerText = '' then
            begin
              TempChild := TempChild.NextSibling;
              Continue;
            end;

            msg.ArgumentList.SetString(0, 'name: ' + Trim(TempChild.Name));
            msg.ArgumentList.SetString(1, 'TagName: ' + Trim(TempChild.ElementTagName));

            attrList := TStringList.Create;
            try
              TempChild.GetElementAttributes(attrList);

              msg.ArgumentList.SetString(2, 'attrList: ' + attrList.Text);
            finally
              attrList.DisposeOf;
            end;

            msg.ArgumentList.SetString(3, 'InnerText: ' + Trim(TempChild.ElementInnerText));
            msg.ArgumentList.SetString(4, '**********************');


            frame.SendProcessMessage(PID_BROWSER, msg);

            TempChild := TempChild.NextSibling;
          end;
        end;
    end;
  except
    on e : exception do
      if CustomExceptionHandler('SimpleDOMIteration', e) then raise;
  end;
end;
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855230
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я ещё не могу понять/найти: в каком свойстве, где живёт то, что на картинке подчеркнуто в программе в ICefDomNode?

Т.е. как выловить, в каком свойстве вот то название класса "ad-author-contact-row-content j-c-phones", чтобы как можно ближе подобраться к телефону.

Т.е. когда я в Firefox выбираю "копировать/внутренний HTML", то копируется:
<span><a href="tel:+xxxxxxx0">+xxxxxxx0</a></span>
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855253
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я забыл про рекурсию
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855571
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11.е. как выловить, в каком свойстве вот то название класса "ad-author-contact-row-content j-c-phones", чтобы как можно ближе подобраться к телефону.

Т.е. когда я в Firefox выбираю "копировать/внутренний HTML", то копируется:

в общем, там ещё есть "TempChild.AsMarkup", т.е. можно использолвать вместо "TempChild.ElementInnerText"
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855632
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Код: pascal
1.
procedure SimpleDOMIteration(



извините за такой вопрос, но сегодня пятница, так что можно


Я не могу понять, обходит ли SimpleDOMIteration() ВСЕ узлы и все уровни дерева DOM или только узлы верхнего уровня? Процедура не является рекурсивной, но вижу заход (TempChild := TempHead.FirstChild) на дочерние узлы.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855732
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, вот такая конструкция у меня получилась, может кому пригодится.

найти нужный атрибут и значение узла в цикле по DOM
Код: 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.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
procedure StartDOMIteration(const aDocument: ICefDomDocument; const frame: ICefFrame);
var
  TempNode, TempChild : ICefDomNode;
  attrList: TStrings;
  InnerHTMLText, val: string;
begin

  try
    if aDocument <> nil then
    begin
      TempNode := aDocument.Body;

        if TempNode <> nil then
        begin

          TempChild := TempNode.FirstChild;

          while TempChild <> nil do
          begin
            RecourceDOMIteration(frame, TempChild);

            if SearchNodeAttr(frame, 'class=j-c-phones', TempChild) then
            begin
              SendMessageToBrowser(frame, msg_for_chromium, Trim(TempChild.ElementInnerText));
              exit;
            end;

            TempChild := TempChild.NextSibling;
          end;
        end;

    end;
  except
    on e : exception do
      if CustomExceptionHandler('StartDOMIteration', e) then raise;
  end;
end;

procedure RecourceDOMIteration(const frame: ICefFrame; CefDomNode: ICefDomNode);
var
  TempChild : ICefDomNode;
  attrList: TStrings;
  InnerHTMLText, val: string;
begin
  try
    if CefDomNode <> nil then
    begin
      TempChild := CefDomNode.FirstChild;

      while TempChild <> nil do
      begin
        RecourceDOMIteration(frame, TempChild);

        if SearchNodeAttr(frame, 'class=j-c-phones', TempChild) then
        begin
          SendMessageToBrowser(frame, msg_for_chromium, Trim(TempChild.ElementInnerText));
          exit;
        end;


        TempChild := TempChild.NextSibling;
      end;
    end;

  except
    on e : exception do
      if CustomExceptionHandler('RecourceDOMIteration', e) then raise;
  end;
end;

procedure SendMessageToBrowser(const frame: ICefFrame; const sMsg, sText: string);
var
  msg: ICefProcessMessage;
begin
  Msg := TCefProcessMessageRef.New(sMsg);
  msg.ArgumentList.SetString(0, sText);
  frame.SendProcessMessage(PID_BROWSER, msg);
end;

function SearchNodeAttr(const frame: ICefFrame; const aSearchAttrText: string; const Node: ICefDomNode): boolean;
var
  attrList: TStrings;
  InnerHTMLText, val: string;
begin
  Result := false;

  attrList := TStringList.Create;
  try

    Node.GetElementAttributes(attrList);

    if Trim(attrList.CommaText) = aSearchAttrText then
      Result := True;

  finally
    attrList.DisposeOf;
  end;
end;

...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39856038
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это же жесть -- вручную перебирать всю структуру DOM. Есть всякие css-селекторы, которые простыми командами могут найти и вывести любое количество элементов. Судя по вот этому -- CEF полностью поддерживает querySelectorAll .
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39856066
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это просто один из способов. Тем более, не надо изучать JS.
...
Рейтинг: 0 / 0
25 сообщений из 139, страница 3 из 6
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CEF4Delphi в потоке с внешней формой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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