Исключение на XPath

soprano

Client
Регистрация
25.08.2011
Сообщения
866
Благодарностей
948
Баллы
93
Пагинация на сайте меняется кнопкой next
C#:
    Active.FindElementByXPath("//div[contains(@direction, 'next')]", 0).Click();
до последней страницы кнопка активная.
Как только нажата последняя страница, кнопка next становится неактивной, но не исчезает.
И проект как бы отработан, но не завершён.
Как сделать завершение работы в таком случае?
XPath активной и XPath неактивной абсолютно одинаковы.
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 093
Благодарностей
6 496
Баллы
113
XPath активной и XPath неактивной абсолютно одинаковы.
у них должны быть разные классы, они не могут быть одинаковыми в принципе.
попробуй привязать xpath на уровень выше.
должны быть отличия, по идее у активной есть ссылка, у неактивной ее нет
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113

soprano

Client
Регистрация
25.08.2011
Сообщения
866
Благодарностей
948
Баллы
93
Вот что меняется. Вверху - когда активная, внизу - неактивная.
C#:
<div color="#8C1515" direction="next" class="mixnv3-1 kDAhyi">next &gt;</div>

<div color="#8C1515" direction="next" class="mixnv3-1 fGvp">next &gt;</div>
 

soprano

Client
Регистрация
25.08.2011
Сообщения
866
Благодарностей
948
Баллы
93
Родилась мысль - нужен такой сниппет,
если цикл больше чем на 60 секунд виснет - то выходишь из него.
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 093
Благодарностей
6 496
Баллы
113
не выдумывай, сделай привязку к номерам страниц, проще всего
ну или проверяй урл на изменение, если 5 раз не изменился, значит стоим на месте
но страницы лучше )
 
  • Спасибо
Реакции: Alexmd

soprano

Client
Регистрация
25.08.2011
Сообщения
866
Благодарностей
948
Баллы
93
Подскажи, как привязаться к нумерации такой
C#:
https://stanford.rimeto.io/search/ab?tab=all&start=NDI1
https://stanford.rimeto.io/search/ab?tab=all&start=NDQw
https://stanford.rimeto.io/search/ab?tab=all&start=MzIw
буквы генерируются на лету.
 

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113
fGvp всегда не активная, или там тоже разное бывает ? Походу всегда, and notcontains fGvp
 

soprano

Client
Регистрация
25.08.2011
Сообщения
866
Благодарностей
948
Баллы
93
fGvp - это динамическое значение, при другой вводной она другая будет.
Нужно креативное решение, там люди недаром $300.000 за обучение платят.
 

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113
то что я посмотрел неактивная всегда fgvp - дай пример где не так
 

soprano

Client
Регистрация
25.08.2011
Сообщения
866
Благодарностей
948
Баллы
93
Сегодня такая, а через несколько часов или завтра - будет другая.
 

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113
тогда к инер текст по регэкспу с номером, только в регексп ограничивай жестко конец $ и прибавляй
 
Последнее редактирование:

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113
Screen Shot 2021-02-24 at 00.30.47.png


C#:
HtmlElement he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("div", "innertext", "^1$", "regexp", 0);
if (he.IsVoid) return -1;
 
Последнее редактирование:

soprano

Client
Регистрация
25.08.2011
Сообщения
866
Благодарностей
948
Баллы
93

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113
Так не переходит на следующую.
ну логично, потому что это был пример поиска элемента, там еще и циферку надо прибавлять :-) мне что весь код за тебя писать ?

C#:
HtmlElement he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("div", "innertext", "^2$", "regexp", 0);
if (he.IsVoid) return -1;

// Задержка эмуляции
instance.WaitFieldEmulationDelay();
// Вызвать событие "click"
he.RiseEvent("click", instance.EmulationLevel);
 
  • Спасибо
Реакции: djaga и baracuda

soprano

Client
Регистрация
25.08.2011
Сообщения
866
Благодарностей
948
Баллы
93
Короче, проще всего регуляркой выпарсить значение
class
при активной и неактивной и сравнивать в цикле.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113
ну я бы сделал так. первым xpath получил бы у последнего элемента его class , а следующими xpath проверил бы его с предыдущим.
тоесть забирать так
72693


проверять так ((//div[contains(@direction, 'next')]/parent::*/div/div[last()][@class="mixnv3-3 hAoTsj"]/preceding-sibling::*)[last()][@class!="mixnv3-3 hAoTsj"]/preceding-sibling::*)[last()][@class!="mixnv3-3 hAoTsj"]

72695


итого получается что последний xpath сработает только при условии что последний class не будет равен предыдущим 2-м.
в xpath естесно надо подставить спарсенное значение из первого xpath. примерно так будет

отсюда //div[contains(@direction, 'next')]/parent::*/div/div[last()] парсим class в var1
сюда подставляем ((//div[contains(@direction, 'next')]/parent::*/div/div[last()][@class='var_1']/preceding-sibling::*)[last()][@class!='var_1']/preceding-sibling::*)[last()][@class!='var_1']
и чекаем что найдет. если нашел элемент, то все приплыли. если нет, то можно кликать дальше :-)
 
  • Спасибо
Реакции: djaga, baracuda и soprano

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 423
Баллы
113
А никто не догадался, что под параметром start зашифрован offset в base64? Таким образом, можно просто рассчитать количество доступных страниц и проходить по ним без клика по этой чертовой кнопке.
И, если говорить, как бы сделал я, то это был бы один шаблон, который высчитывает количество человек по каждому фильтру по одной букве из алфавита и заносит в список нагенеренные ссылки на все страницы с результатами поиска, а второй шаблон многопоточно оттуда их берет и парсит мыла.
 
  • Спасибо
Реакции: djaga, baracuda и luk911

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113
Сектор приз на барабане уходит зрителю в черном :-) Ну у тебя глаз наметанный конечно :-)
 
  • Спасибо
Реакции: Alexmd

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 423
Баллы
113
Спасибо 8-) Я на парсерах собачку то съел. Всегда найду за что зацепиться, ведь у всего есть своя какая-то логика. Нужно просто проанализировать варианты прежде чем браться за дело.
 

kagorec

Client
Регистрация
24.08.2013
Сообщения
994
Благодарностей
540
Баллы
93
Может имитация клика по картинке именно по активной next и когда станет невзрачным серым то не сработает?
 

baracuda

Client
Регистрация
19.06.2013
Сообщения
802
Благодарностей
284
Баллы
63
Ну тогда парни новая загадка по xpath... https://developers.facebook.com/ квест по реге, там тоже много интересного кто хочет поупражняется, сначало кажется ну что такого, всё просто... а как начинает мышка не в те стороны крутится и кликать с каждым "проходом", вот тут реальный тупик...
 

soprano

Client
Регистрация
25.08.2011
Сообщения
866
Благодарностей
948
Баллы
93
А никто не догадался, что под параметром start зашифрован offset в base64? Таким образом, можно просто рассчитать количество доступных страниц и проходить по ним без клика по этой чертовой кнопке.
И, если говорить, как бы сделал я, то это был бы один шаблон, который высчитывает количество человек по каждому фильтру по одной букве из алфавита и заносит в список нагенеренные ссылки на все страницы с результатами поиска, а второй шаблон многопоточно оттуда их берет и парсит мыла.
Нет смысла 2 раза парсить, если нужные данные с первого раза получаешь.
 

Zhekaz

Client
Регистрация
14.03.2016
Сообщения
107
Благодарностей
55
Баллы
28

soprano

Client
Регистрация
25.08.2011
Сообщения
866
Благодарностей
948
Баллы
93

soprano

Client
Регистрация
25.08.2011
Сообщения
866
Благодарностей
948
Баллы
93
Так, господа, меня озарило.
Можно сравнить ссылки в браузере через 10 секунд.
Если ссылка не меняется - завершаем цикл.
C#:
var url1 = instance.ActiveTab.URL.ToString();
Thread.Sleep(10000);
var url2 = instance.ActiveTab.URL.ToString();

if(url1.Contains(url2))
{
    project.SendInfoToLog("Финиш");
    return "stop";
}
только как правильно это запихнуть в цикл?
 
Последнее редактирование:

backoff

Client
Регистрация
20.04.2015
Сообщения
6 093
Благодарностей
6 496
Баллы
113
  • Спасибо
Реакции: djaga

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 423
Баллы
113
Нет смысла 2 раза парсить, если нужные данные с первого раза получаешь.
Для особо "неозаряемых" придется объяснить на пальцах, раз уж я потратил свое время на анализ сайта.
1 шаблон переходит всего на 26 таких вот страниц https://stanford.rimeto.io/search/a?tab=all, https://stanford.rimeto.io/search/b?tab=all, .... , https://stanford.rimeto.io/search/z?tab=all
Получает число человек отсюда(смотреть скриншот во вложении). Путем простого математического действия вычисляет, сколько всего страниц придется мотать. В данном случае int allPages = 40324%15 == 0 ? 40324 / 15 : 40324 / 15 + 1; и генерирует 2629 ссылок на все страницы и складывает их в список для второго шаблона. Со значениями параметра start еще нужно поиграться - там есть своя особенность с пробелами, но ее нетрудно отследить и повторить.
Второй шаблон будет брать ссылки из этого списка многопоточно. Нет проблем с поиском кнопки, случайным ее неотображением, с отвалом прокси, отключением света и множеством других возможных проблем.
Ориентировочная скорость работы первого шаблона до 2-х минут и запустить его надо всего 1 раз.
Второй ограничивается только доступными ресурсами для запуска потоков.
Таким образом, чтобы собрать 40К мыл по этому фильтру, допустим в 20 потоков, может уйти около 1-1,5 часов, а не 2-ое суток.
 

Вложения

  • Спасибо
Реакции: djaga и soprano

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