Медленный поиск HtmlElement

Tiburon20

Client
Регистрация
14.03.2010
Сообщения
8
Благодарностей
1
Баллы
3
Медленный поиск HtmlElement

День добрый!

Давно не пользовался zenno, раньше такого не замечал - очень долго идет поиск элементов на странице.
Допустим, парсим сниппеты яндекса 50 штук (https://yandex.ru/search/?text=test&numdoc=50)

Код:
HtmlElementCollection serpItems = instance.ActiveTab.FindElementsByXPath("//ul[contains(@class, 'serp-list')]/li");

long milliseconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;

foreach (HtmlElement serpItem in serpItems) {
    string url = serpItem.FindChildByXPath(".//a[contains(@class, 'link_outer_yes')]", 0).GetAttribute("href").Trim();
    string title = serpItem.FindChildByXPath(".//a[contains(@class, 'organic__url')]", 0).InnerText.Trim();
    string snippet = serpItem.FindChildByXPath(".//div[contains(@class, 'organic__text')]", 0).InnerText.Trim();

//    string url = serpItem.FindChildByAttribute("a", "class", "linkt_outer_yes", "text", 0).GetAttribute("href").Trim();
//    string title = serpItem.FindChildByAttribute("a", "class", "organic__url", "text", 0).InnerText.Trim();
//    string snippet = serpItem.FindChildByAttribute("div", "class", "organic__text", "text", 0).InnerText.Trim();
   
    project.SendInfoToLog(url, false);
    project.SendInfoToLog(title, false);
    project.SendInfoToLog(snippet, false);
}

long diff = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond - milliseconds;

project.SendInfoToLog(diff.ToString(), false);
На моем машине (i7-4790k) парсинг занимает 4500-5000 милисекунд ^^

Вот точно такой же код на Python

Код:
import lxml.html
import time

filename = r'D:\Downloads\yandex.html' // html dom сохраненный из zenno
html = open(filename, 'rt').read()
doc = lxml.html.fromstring(html)

t = time.time()
serpItems = doc.xpath('//ul[contains(@class, "serp-list")]/li')
for serpItem in serpItems:
    url = serpItem.xpath('.//a[contains(@class, "link_outer_yes")]')[0].text_content().strip()
    title = serpItem.xpath('.//a[contains(@class, "organic__url")]')[0].text_content().strip()
    snippet = serpItem.xpath('.//div[contains(@class, "organic__text")]')[0].text_content().strip()

    print url
    print title
    print snippet

print (time.time() - t) * 1000
Парсинг занимает 7-9 милисекунд.
Что я делаю не так?

Пробовал вместо FindChildByXPath использовать FindChildByAttribute - результат такой же.
 

up_lvl

Client
Регистрация
02.09.2014
Сообщения
131
Благодарностей
53
Баллы
28
попробуй поменять цикл с foreach на for.
 

Tiburon20

Client
Регистрация
14.03.2010
Сообщения
8
Благодарностей
1
Баллы
3
Код:
HtmlElement serpItem;
HtmlElementCollection serpItems = instance.ActiveTab.FindElementsByXPath("//ul[contains(@class, 'serp-list')]/li");

long milliseconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;

for (int i = 0; i < serpItems.Count; i++) {
    serpItem = serpItems.Elements[i];
    string url = serpItem.FindChildByXPath(".//a[contains(@class, 'link_outer_yes')]", 0).GetAttribute("href").Trim();
    string title = serpItem.FindChildByXPath(".//a[contains(@class, 'organic__url')]", 0).InnerText.Trim();
    string snippet = serpItem.FindChildByXPath(".//div[contains(@class, 'organic__text')]", 0).InnerText.Trim();
   
    project.SendInfoToLog(url, false);
    project.SendInfoToLog(title, false);
    project.SendInfoToLog(snippet, false);
}

long diff = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond - milliseconds;

project.SendInfoToLog(diff.ToString(), false);
Результат такой же.
Не пойму - это только у меня так долго работает или это норма?
 

up_lvl

Client
Регистрация
02.09.2014
Сообщения
131
Благодарностей
53
Баллы
28
такое же время
 

Tiburon20

Client
Регистрация
14.03.2010
Сообщения
8
Благодарностей
1
Баллы
3
Подключил HtmlAgilityPack - тот же код отрабатывает за 120мс, что в 40 раз быстрее.

Печально, что стандратное решение работает так медленно -_-
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 311
Благодарностей
1 191
Баллы
113
Подключил HtmlAgilityPack - тот же код отрабатывает за 120мс, что в 40 раз быстрее.

Печально, что стандратное решение работает так медленно -_-
Ну так понятное дело почему медленно, так как используется для каждого действия WCF, если хочешь делать все быстро, то бери верхний элемент, добавляй все это в htmlagilitypack и там парси все остальные элементы. А любое обращение к Instance имеет немалые задержки
 

up_lvl

Client
Регистрация
02.09.2014
Сообщения
131
Благодарностей
53
Баллы
28
еще вариант выполнить джаваскрипт на странице и вернуть всю таблицу в переменную.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)