|
|
|
.NET 4.x Сравнение производительности веб-парсинга разными способами13.07.2012, 21:14. Показов 3295. Ответов 18
Метки нет (Все метки)
В процессе разработки очередной программы, цель которой отпарсить определенный список страниц, обработать и выдать результат, я задумался - а какой метод будет более быстрым, удобным или коротким? Решил сделать тестер и показать результаты эксперимента сюда. В качестве таймера я использовал QueryPerformanceCounter и QueryPerformanceFrequency из библиотеки Kernel32.dll. Вроде как по отзывам достаточно точно определяет затраченное время. Было сделано по 10 независимых тестов на каждый метод парсинга. Все времена указаны в секундах.
Цель эксперимента: вывести временные затраты при парсинге страницы. Парсируемая страница: "https://www.google.ru/search?&q=Как+производить+замер+времени" Необходимо: загрузить страницу в память, найти выданные ссылки, вывести на экран ссылки (название, описание и сам линк). Методы: 1. Загружаем данные в виртуальный webbrowser, парсим через класс HtmlElement. Плюсы: Приятный вид парсинга и загрузки данных, очень понятный и достаточно удобный и короткий. Минусы: Необходимо создавать ивент для ожидания загрузки страницы в WebBrowser. Возможно на странице с каким-то мультимедийным контентом будет ещё дольше "висеть". Крайне мало настроек подключения (точнее их нет). Среднее время на парсинг: 0,019997724; Среднее время на инициализацию компонента и загрузку содержимого в память: 2,52409373; Минимальное время на -//-: 2,140337; Максимальное время на -//-: 3,079691; Разница: 0,939354. 2. Загружаем данные через класс HTTPWebRequest в строку, парсим ручками. Плюсы: Очень тонкие настройки соединения, GET/POST запросов, кукисов, всего чего только можно, в т.ч. кодировки. Минусы: Ужасный вид кода парсинга ручками, очень тяжело работать в кривом коде HTML, большой код для парсинга загруженных данных. Возможно, если использовать RegEx, то вид парсинга будет более оптимальный и не такой большой (не занимался ещё RegEx'ом). Так же необходимо создавать дополнительные методы (функции) для очистки HTML кода от мусора (<em>/<br>/<b>) и подобных для вывода чистого текста. А так же очень ненадёжный вид и тяжело понимаемый. Среднее время на парсинг: 0,018322276 (чуточку быстрее первого метода); Среднее время на инициализацию компонента и загрузку содержимого в память: 0,38945552 (топ); Минимальное время на -//-: 0,3817242; Максимальное время на -//-: 0,3990794; Разница: 0,0173552. 3. Загружаем данные через HtmlAgilityPack, парсим через методы HtmlAgilityPack Плюсы: Весьма удобный и короткий вид загрузки данных, очень короткий код на парсинг, не надо ничего нового придумывать, есть немного настроек соединения. Минусы: Очень непривычный и местами неудобный (а местами очень даже удобный) синтаксис (если позволите так сказать) парсинга. Чистый адрес ссылки мне так и не удалось вытащить, почему-то куча мусора приплюсовалась, но это лишь неприятная мелочь. Хотя я впервые знакомлюсь с HtmlAgilityPack, может быть он лучше и удобнее чем кажется. Среднее время на парсинг: 0,006282992 (топ); Среднее время на инициализацию компонента и загрузку содержимого в память: 0,44985426; Минимальное время на -//-: 0,384168; Максимальное время на -//-: 0,6345674; Разница: 0,2503994. ВЕРДИКТ: Первый метод хорош только видом парсинга. Ужасно долго по сравнению с другими методами происходит получение данных от сервера. Второй идеален для тонкой настройки подключения или цепочки соединений. Если найти хороший способ парсинга текста (обработки полученного кода), то, я думаю, это будет лучший способ для меня (надо бы RegEx почитать). Третий способ для эстетов - всё довольно аккуратно и чётко. Но лично для меня он: непривычный и неудобный. Прошу Ваших комментариев! P.S. Я не рассматривал возможность асинхронной загрузки данных. P.P.S. К сообщению приложил архив с проектом.
3
|
|
| 13.07.2012, 21:14 | |
|
Ответы с готовыми решениями:
18
INSERT разными способами |
|
|
|
| 14.07.2012, 09:37 [ТС] | |
|
Кстати, надо будет попробовать сделать загрузку кода страницы через HTTPWebRequest, а потом загнать код в WebBrowser в надежде, что конкретно этот процесс не займёт времени. Тогда парсить будет очень легко (ну вот не понравился мне HtmlAgilityPack - Хочется обойтись родными библиотеками). Или всё-таки использовать Regex - как я убедился, он очень крут, но тяжело читаем (для меня пока что).
0
|
|
|
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
|
|
| 14.07.2012, 10:50 | |
|
WebBrowser еще скачивает картинки, CSS и JS
1
|
|
|
Неадекват
1499 / 1236 / 247
Регистрация: 02.04.2010
Сообщений: 2,807
|
|||||||||||
| 14.07.2012, 12:13 | |||||||||||
|
А что мешает совместить второй и третий способ?
Как нибудь так:
1
|
|||||||||||
|
Неадекват
1499 / 1236 / 247
Регистрация: 02.04.2010
Сообщений: 2,807
|
|
| 14.07.2012, 13:02 | |
|
Нормально составленные регулярки пошустрее будут. Тем не менее зря вы так на HtmlAgilityPack косо смотрите, гибкий и удобный инструмент. Работа с регулярными выражениями - возня со строками. НАР - возня с объектами. ИМХО объекты удобнее.
В плюс HtmlAgilityPack также можно засчитать то, что он парсит страничку один раз. Для извлечения множества разнородной информации он подойдет лучше.
0
|
|
|
|
||||||
| 14.07.2012, 13:09 [ТС] | ||||||
|
Ну так-то да, с объектами всегда проще и удобнее (всё-таки у нас объектно-ориентированная среда). И грамотнее. Но беда в том, что при попытке получить код ссылки при парсе гугла, допустим, текста "Привет! Как дела?", гугл даёт такую ссылку: "v k . c o m /privetkakdelagroup" (пробелы поставил чтоб линк не делался). Точно так же я получаю ссылку через HtmlElement и ручной парс (и, думаю, получу с регулярки так же). А вот HAP выдал мне такое: "http : // ww w.g oogl e.r u/u rl?sa=t&rct=j&q=&esrc=s&source=web&cd=2& ved=0CE0QFjAB&url=http%3A%2F%2Fvk.com%2F privetkakdelagroup&ei=UTYBUIj0Ks_P4QS6mJ mlCA&usg=AFQjCNGKu_7uUwICKQFHTE-tvjjcb-HrFg". И теперь мне надо тогда отпарсить как-то вот этот кусок "url=http%3A%2F%2Fvk.com%2Fprivetkakdela group" (плюс, перекодировать url в понятный вид). Честно НЕ ЗНАЮ почему именно так HAP мне выдал ссылку, но я полчаса мучался и забил в итоге (цель была всё-таки получить время на получение результатов запроса). Хотя линк я добывал вроде правильно:
0
|
||||||
|
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
|
|
| 14.07.2012, 13:32 | |
|
HAP спарсил все правильно, вот как выглядит ссылка в гугле
http://puu.sh/Irm6
1
|
|
|
|
|
| 14.07.2012, 13:39 [ТС] | |
|
Да?
![]() Значит я что-то не так сделал. Позже на досуге проверю. А заодно попробую соединить разные методы коннекта+парса. Заодно засеку по времени (QueryPerformance'ом и Stopwatch'ем). Дело-то плёвое, а интересно! И приведу примерный вид парса для оценки удобности на нескольких сайтах для разнообразия =). Планирую сделать программу для парса и сбора ответов с разных поисковых систем (т.к. надоело по 5-7 окон держать только с поисковиками), вот и исследую различные методы, т.к. в интернете свежей (да и не свежей) комплексной информации с учетом различных методов не нашел. Даже если она и есть - не бросать же дело, надо добивать, совершенствовать, выяснять )). Вечерком или завтра )
0
|
|
|
Неадекват
1499 / 1236 / 247
Регистрация: 02.04.2010
Сообщений: 2,807
|
||||||
| 14.07.2012, 14:25 | ||||||
|
Yukikaze, все правильно сказал. Гугл собирает историю поиска, поэтому все ссылки с редиректом.
Вот примитив для извлечения прямых ссылок:
1
|
||||||
|
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
|
||||||
| 14.07.2012, 14:29 | ||||||
Сообщение было отмечено как решение
Решение
Ну и я тогда приколюху выложу
3
|
||||||
|
Неадекват
1499 / 1236 / 247
Регистрация: 02.04.2010
Сообщений: 2,807
|
|
| 14.07.2012, 15:17 | |
|
Генератор? Я думал ими никто уже не пользуется с появления LINQ
0
|
|
|
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
|
|
| 14.07.2012, 16:04 | |
|
freeba, в LINQ нет души
0
|
|
|
|
|||
| 15.07.2012, 00:55 [ТС] | |||
![]() freeba, Я делать так не стал, т.к. боялся что амперсанд (amp может быть и в самой ссылке и в ссылке редиректа. Но я не заострял внимание на этом. Щас займусь. . Мне кажется, что неправильно от "q=" до первого "&" выбирать. Есть ли гарантия что символ "&" не будет относиться к той ссылке которую нужно получить? То есть, может быть, в получаемой ссылке тоже есть всякие "php" плюшки, которые не желательно выкидывать?
0
|
|||
|
Неадекват
1499 / 1236 / 247
Регистрация: 02.04.2010
Сообщений: 2,807
|
|||
| 15.07.2012, 01:16 | |||
|
Не по теме:
0
|
|||
|
|
|||||||
| 15.07.2012, 01:31 [ТС] | |||||||
|
И-так. Делаем Френкенштейна:
1) Соединим 1 и 2 способы. Загружаем данные через HttpWebRequest, стринг с кодом загоняем в webBrowser.DocumentText. Итого: ничего хорошего. Даже при отключении появления ошибок о скриптах, он все равно ругается на всякие xjs скрипты. При этом, парсинг не проходит. Fail. 2) Будем соединять 2 и 3 способы. Загружаем данные через HttpWebRequest, ответ напрямую получает HAP. Как и ожидалось - лучшая скорость загрузки страницы, лучшая скорость парса. Yukikaze, скажите, а что даёт "n/a"? И ещё, я укоротил этот кусок:
Замерил время выполнения StopWatch'ем. Получил: Среднее время соединения - 462,8 мс (миллисекунд) Среднее время парса - 6,6 мс Так же заметил разницу между замерами QueryPerformance и StopWatch. Разницу я наблюдал 0-5%.
0
|
|||||||
|
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
|
|
| 15.07.2012, 01:39 | |
|
Mans7, у вас какой-то бракованый гугл, дает чистые ссылки, без редиректа
0
|
|
|
|
|||||||||||
| 15.07.2012, 03:56 [ТС] | |||||||||||
|
Ну, какой есть )
А теперь ещё фишка - сделал то чего боялся и не хотел. Парсинг RegEx'ом . Паттерн получился такой:
Я составлять регулярки не умею толком, так что наверняка её можно слегка упростить. Добавлено через 10 минут Из вышесказанного можно сказать что парсинг регулярками имеет: Плюсы: - очень производительный (быстрый); - имеет короткий код; - не нужно загружать сторонние библиотеки. Минусы: - почти нечитабельный (нужно глаз набивать); - индивидуальный под каждую страницу; - опять-таки местами где надо вывести чистый текст надо чистить код от мусора (<b><br><em>...), но можно Replace сделать; - в случае изменения кода на странице, скорее всего, регулярку тоже надо будет корректировать. Добавлено через 2 минуты Позже, если ничего нового не придумаю, подведу общие итоги всех этих исследований. Хотя надо что-нибудь ещё придумать, хочется по-глубже залезть в вопросы парсинга. Добавлено через 26 минут А теперь заценим асинхронную загрузку кода страницы.
Средняя скорость получения данных StopWatch: 453 мс Средняя скорость получения данных QueryPerformance: 0,446738 Для единичной загрузки страницы скорость меньше чем при использовании HttpWebRequest/Response. А вот если делать это в потоках, то, возможно эффект будет более положительным для Async. Плюс, насколько я заметил, основной поток не подвисает во время получения ответа. То есть получен тот же мини-тред.
0
|
|||||||||||
| 15.07.2012, 03:56 | |
|
Помогаю со студенческими работами здесь
19
Сортировка массивов разными способами Интегрирование функции разными способами Определенные интегралы разными способами Сортировка массивов разными способами
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|