Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/64: Рейтинг темы: голосов - 64, средняя оценка - 4.64
0 / 0 / 2
Регистрация: 09.09.2013
Сообщений: 32

Парсинг динамически изменяющихся Web страниц

10.10.2013, 12:12. Показов 12922. Ответов 43
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Пишу проект, в котором требуется выгружать в БД со страницы сайта некоторый набор динамически изменяющихся полей (т.е. их зависимость от времени). Есть реализация с периодическим извлечением текущих значений через WebBrowser.Document, однако не устраивает скорость работы - IE даже и сам по себе довольно медленно отрабатывает изменения наполнения страницы.
Курил форум по CefSharp, но не смог оттуда почерпнуть того, что требуется.
Если кто-то решал подобную задачу, например с использованием Chromium или Gecko, поделитесь пожалуйста опытом.
Буду очень признателен за выложенный скелет проекта.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.10.2013, 12:12
Ответы с готовыми решениями:

Парсинг web страниц, загруженных в WebBrowser
Добрый день всем. Собственно говоря у меня не вопрос, а просьба растолковать некоторые детали в приведенной теме. У меня есть написанная...

Парсинг web-страниц
Добрый день, форумчане. Задача заключается в следующем: 1) Грузим в компонент TWebBrowser страницу. 2) Сохраняем код страницы в...

Как динамически изменять высоту TableView при изменяющихся высотах CustomViewCell
Здравствуйте. Пишу на Mono но думаю, что с кодом на Obj-C разберусь. В общем есть UITableView заполняю его кастомными ячейками для каждой...

43
 Аватар для ksk
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
11.10.2013, 08:54
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от PIkarus Посмотреть сообщение
Но если для периодического извлечения динамически изменяющихся полей используется компонент браузера, проблема вроде бы снимается
Не снимается, если нужно обработать десятки тысяч страниц.
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
11.10.2013, 11:08
Цитата Сообщение от PIkarus Посмотреть сообщение
компонент от какого браузера использовали? Была ли скорость извлечения данных достаточна для отработки Live событий?
CHTML, то есть IE. Пользователь сам задает периодичность проверки страницы (порядка нескольких минут), то есть вопрос быстродействия вообще не стоял - таблица игр обновляется реже. Ну, и никакой защиты (кроме полного редизайна каждые пару месяцев :-), на тех сайтах, с которыми я работал, не было. Так что о проблемах подмены IP итд., даже не задумывался.
0
0 / 0 / 2
Регистрация: 09.09.2013
Сообщений: 32
11.10.2013, 11:09  [ТС]
Цитата Сообщение от ksk Посмотреть сообщение
Не снимается, если нужно обработать десятки тысяч страниц.
В каком смысле? В том, что по быстрому перебору страниц будет очевидно, что это робот, это имеется ввиду?
Если да, то это не мой случай. Мне (в основной ветке) много страниц перебирать не надо, надо отслеживать изменение многих полей на одной странице
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
11.10.2013, 11:14
Цитата Сообщение от ksk Посмотреть сообщение
Не снимается, если нужно обработать десятки тысяч страниц
IMHO, не везде она есть. Например, ~200,000 страниц с auto.ru - без проблем (по крайней мере, на то время, когда я этим занимался).
0
0 / 0 / 2
Регистрация: 09.09.2013
Сообщений: 32
11.10.2013, 11:14  [ТС]
Цитата Сообщение от gazlan Посмотреть сообщение
CHTML, то есть IE. Пользователь сам задает периодичность проверки страницы (порядка нескольких минут), то есть вопрос быстродействия вообще не стоял - таблица игр обновляется реже. Ну, и никакой защиты (кроме полного редизайна каждые пару месяцев :-), на тех сайтах, с которыми я работал, не было. Так что о проблемах подмены IP итд., даже не задумывался.
Порядка нескольких минут меня не устраивает - нужны в основном Live коэффициенты, а там обновление раза 3 в минуту.
То что IE я понял. Где б найти человечка, который бы поделился опытом использования Chromium...
0
 Аватар для ksk
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
11.10.2013, 11:31
Цитата Сообщение от gazlan Посмотреть сообщение
IMHO, не везде она есть. Например, ~200,000 страниц с auto.ru - без проблем (по крайней мере, на то время, когда я этим занимался).
Конечно не везде. Только там, где контент стоит денег и может стать предметом наживы конкурентов )
1
 Аватар для Игорь[Igor]
726 / 478 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
11.10.2013, 11:32
Цитата Сообщение от PIkarus Посмотреть сообщение
Так я и не сомневался, что с вашим подходом это возможно, вопрос в том, какой ценой. Вы код покажите - там наверняка или несколько обращений к сайту или Sleep ms на 1000
Delphi
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
function Find(StrSrc: string; Str1, Str2: string): TStringList;
var
  StrTmp: string;
  Pos1, Pos2, Len1, Len2: Integer;
begin
  Result:= TStringList.Create;
  // крайние левые теги для поиска
  Len1 := Length(Str1);
  // крайние правые теги для поиска
  Len2 := Length(Str2);
  Pos1 := posEx(Str1, StrSrc, 1);
  // поиск всех значений на странице, находящихся между тегами Str1 и Str2
  while Pos1 > 0 do
  begin
    Pos2 := posEx(Str2, StrSrc, Pos1 + Len1);
    if Pos2 = 0 then
    break;
    StrTmp := Copy(StrSrc, Pos1 + Len1, Pos2 - Pos1 - Len1);
    StrTmp := Trim(StrTmp);
    Result.Add(StrTmp);
    Pos1 := Pos2 + Len2;
    Pos1 := posEx(Str1, StrSrc, Pos1);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  PageData: TStringList;
  DData: TStringList;
begin
  PageData := TStringList.Create;
  DData := TStringList.Create;
  try
    PageData.Text := form1.IdHTTP1.Get('http://www.soccer24.com/england/premier-league/results/');
 
    DData.Clear;
    DData:=Find(PageData.Text, 'tournament-page-data', 'tournament-page-sport');
    DData:=Find(PageData.Text, '¬', '·');
 
    form1.Memo1.Text:=DData.Text;
  finally
    PageData.Free;
    DData.Free;
  end;
end;
0
0 / 0 / 2
Регистрация: 09.09.2013
Сообщений: 32
11.10.2013, 12:23  [ТС]
Цитата Сообщение от Игорь[Igor] Посмотреть сообщение
PageData.Text := form1.IdHTTP1.Get('http://www.soccer24.com/england/premier-league/results/');
И что после этого вызова в возврате уже все поля счетов извлечены? А где обещанный post?
В общем, что-то не верю я, что это работает, а ставить Delphi для проверки неохота, у сына на компе вроде стоит, может вечерком проверю
0
 Аватар для Игорь[Igor]
726 / 478 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
11.10.2013, 12:36
Смотрел HttpAnalizer небыло там пост запросов как я думал, вся страница загружалась сразу, и не увидел никакого динамического обновления, потому и нет тут пост запроса.
0
0 / 0 / 2
Регистрация: 09.09.2013
Сообщений: 32
11.10.2013, 12:46  [ТС]
Ну, не знаю, не знаю, как там работает этот IdHTTP дельфевский, может он и ожидает завершения выполнения скриптов, хотя, было бы странно. Скорее всего, просто повезло, что скрипт успел отработать. В любом случае, это не подходит, когда содержимое страницы меняется периодически
0
 Аватар для Игорь[Igor]
726 / 478 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
11.10.2013, 12:56
Ни какие скрипты не обрабатываются при этом.

Добавлено через 1 минуту
Идет по тому пути, срабатывает редирект, и страничка грузится
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
11.10.2013, 13:16
Цитата Сообщение от PIkarus Посмотреть сообщение
как там работает этот IdHTTP дельфевский
Поскольку он использует тот же самый компонент (IE), подозреваю, что просто ждет 'OnDocumentComplete'.
И, если это так, то совершенно не гарантирует окончание (асинхронной) работы скриптов.
0
0 / 0 / 2
Регистрация: 09.09.2013
Сообщений: 32
11.10.2013, 13:20  [ТС]
Цитата Сообщение от Игорь[Igor] Посмотреть сообщение
Ни какие скрипты не обрабатываются при этом.

Добавлено через 1 минуту
Идет по тому пути, срабатывает редирект, и страничка грузится
Это вам только кажется, что они не отрабатываются, на самом деле часть тела страницы заполняется JS скриптом.
Повторяю, я не знаю, как работает метод IdHTTP.Get, возможно он ожидает выполнения тех скриптов, которые должны вызываться сразу после загрузки страницы. А вот например WebBrowser.Navigate не ожидает и для него, чтобы увидеть в InnerHtml поля счетов придется еще дождаться события OnDocumentComplete.
Проблема в том, что страница может отрабатывать еще и другие скрипты, которые подгружают данные периодически и в вашем методе это решается только с риском быть забаненным

Добавлено через 2 минуты
Цитата Сообщение от gazlan Посмотреть сообщение
Поскольку он использует тот же самый компонент (IE), подозреваю, что просто ждет 'OnDocumentComplete'.
И, если это так, то совершенно не гарантирует окончание (асинхронной) работы скриптов.
Совершенно справедливо. Еще точнее выразил то, что я хотел сказать.
0
 Аватар для Игорь[Igor]
726 / 478 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
11.10.2013, 14:35
Никакой скрипт не обрабатывается этим компонентом, грузится только страница сформированная сервером
0
0 / 0 / 2
Регистрация: 09.09.2013
Сообщений: 32
11.10.2013, 14:44  [ТС]
Цитата Сообщение от Игорь[Igor] Посмотреть сообщение
Никакой скрипт не обрабатывается этим компонентом, грузится только страница сформированная сервером
Н-да, как все запущено... Почитайте хотя бы википедию http://ru.wikipedia.org/wiki/AJAX
0
 Аватар для Игорь[Igor]
726 / 478 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
11.10.2013, 15:04
Действительно запущенно, вам одно, вы другое, дальше думаю нет смысла что-то говорить, юзайте браузер, который и выполняет эти скрипты.
0
0 / 0 / 2
Регистрация: 09.09.2013
Сообщений: 32
11.10.2013, 17:47  [ТС]
Цитата Сообщение от Игорь[Igor] Посмотреть сообщение
Действительно запущенно, вам одно, вы другое, дальше думаю нет смысла что-то говорить, юзайте браузер, который и выполняет эти скрипты.
А вы все-таки почитайте, может что-то и прояснится в голове. Скрипты выполняет не браузер, а веб-сервер и выполняются они при любом извлечении страницы, хоть браузером, хоть IdHTTP.Get, т.к. вызов их прописан в коде страницы
0
 Аватар для Игорь[Igor]
726 / 478 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
11.10.2013, 18:09
Да сервером формируется страница, которая и загружается, но не выполняются динамически добавляемые контенты, я про это говорю. Но по данной ссылке я их не увидел где там динамически подгружаемые данные, вся страничка загружается разом, и что б было обновление, этого я не увидел. Мы наверное еще про разное говорим. и не понимаем полностью друг друга.
0
 Аватар для ksk
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
11.10.2013, 18:09
Цитата Сообщение от PIkarus Посмотреть сообщение
Это одна из проблем, о которой приходится думать. Но если для периодического извлечения динамически изменяющихся полей используется компонент браузера, проблема вроде бы снимается (в случае WebBrowser просто парсим текущее значение wb.Document.InnerHtml или текущее множество нод - wb.Document.All). Я правильно понимаю?
Не совсем так. я брал InnerHtml только целевого тега. А чтобы добраться до него, браузил DOM, то есть добирался до нужных множеств нод. Так оно проще мно показалось.

Цитата Сообщение от PIkarus Посмотреть сообщение
У меня уже есть такой вариант. Вопрос в том, какой использовали браузер? Меня не вполне устраивает скорость работы WB, который аналог IE, потому и пытаюсь смотреть в сторону Chromium и Gecko
Тот, который студия предлагает. Обёртка над IE. По скорости - наоборот ограничивать приходилось (о чём я уже писал, и на показанной мной картинке видно, как он ждёт, прежде, чем запросить очередную страницу по ссылке, найденной на текущей странице).
0
0 / 0 / 2
Регистрация: 09.09.2013
Сообщений: 32
11.10.2013, 18:50  [ТС]
Цитата Сообщение от Игорь[Igor] Посмотреть сообщение
Но по данной ссылке я их не увидел где там динамически подгружаемые данные, вся страничка загружается разом, и что б было обновление, этого я не увидел.
Ну не загружается она "разом", вы просто этого не видите, т.к. используете метод, который, скорее всего, возвращает данные после полной загрузки страницы, которая включает в себя вызов части данных с какого-то отдельно стоящего сервера (эти данные не прописаны в исходном HTML коде страницы). Чтобы убедиться в этом попробуйте вызвать эту страницу в C# компонентом WebBrowser, метод Naviagte и посмотрите, что будет в wb.Document.InnerHtml сразу после вызова. На месте таблицы счетов там бинарный код. Обновления данных там действительно нет, но это ведь я дал самый простейший случай. Обновление есть например на Live странице того же сайта

Добавлено через 10 минут
Цитата Сообщение от ksk Посмотреть сообщение
Не совсем так. я брал InnerHtml только целевого тега. А чтобы добраться до него, браузил DOM, то есть добирался до нужных множеств нод. Так оно проще мно показалось.
Так и я так же делаю - выбираю нужные ноды из wb.Document.All, но все равно, мне так кажется, это не вызывает дополнительных обращений к серверу, чего и следует опасаться

Цитата Сообщение от ksk Посмотреть сообщение
Тот, который студия предлагает. Обёртка над IE. По скорости - наоборот ограничивать приходилось (о чём я уже писал, и на показанной мной картинке видно, как он ждёт, прежде, чем запросить очередную страницу по ссылке, найденной на текущей странице).
В вашем случае может и приходилось. Но мне нужно обрабатывать Live события, там данные обновляются раза 3 в минуту, а полей данных м.б. несколько сотен. Это один из сценариев, а другой - не Live, но на странице много данных и IE компонент начинает тупить на их раскрытии вплоть до того, что идет сообщение "сценарий, выполняемый на этой странице замедляет чего то там и не хочешь ли ты его остановить", причем тот же эффект для этой страницы наблюдается и просто при вызове IE, а вот в хроме все работает нормально
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.10.2013, 18:50
Помогаю со студенческими работами здесь

Создать шаблон для всех страниц с подстановкой изменяющихся элементов
допустим у меня есть <div> <br> Привет юзернейм <br> (тут заполняем свой код) </div>

Парсинг динамически созданной страницы
Всем привет Можно ли как нибудь средствами vb.net получить исходный код динамически созданной страницы и в дальнейшем парсить его?...

Парсинг динамически создаваемого контента
Как осуществить парсинг к примеру таких сайтов http://plusminus.by/ , кде содержимое(коэффициенты) постоянно обновляется(подгружается js)?

парсинг страниц
как вырвать с этого сайта (https://sport-booking.ru/betting-odds/?q=%D1%87%D0%B5%D0%BC%D0%BF%D0%B8%D0%BE%D0%BD%D0%B0%D1%82+&s=) таблицу

Парсинг страниц
Здравствуйте, имеются страницы такого вида...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru