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

  • Автор темы Автор темы soprano
  • Дата начала Дата начала

soprano

Client
Регистрация
25.08.2011
Сообщения
1 040
Реакции
1 267
Баллы
113
Пагинация на сайте меняется кнопкой next
C#:
Развернуть Свернуть Копировать
    Active.FindElementByXPath("//div[contains(@direction, 'next')]", 0).Click();
до последней страницы кнопка активная.
Как только нажата последняя страница, кнопка next становится неактивной, но не исчезает.
И проект как бы отработан, но не завершён.
Как сделать завершение работы в таком случае?
XPath активной и XPath неактивной абсолютно одинаковы.
 
XPath активной и XPath неактивной абсолютно одинаковы.
у них должны быть разные классы, они не могут быть одинаковыми в принципе.
попробуй привязать xpath на уровень выше.
должны быть отличия, по идее у активной есть ссылка, у неактивной ее нет
 
ну что то же в html меняется при разных видах кнопки ? вот за эти различия и надо хвататься.
 
Вот что меняется. Вверху - когда активная, внизу - неактивная.
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>
 
Родилась мысль - нужен такой сниппет,
если цикл больше чем на 60 секунд виснет - то выходишь из него.
 
не выдумывай, сделай привязку к номерам страниц, проще всего
ну или проверяй урл на изменение, если 5 раз не изменился, значит стоим на месте
но страницы лучше )
 
  • Спасибо
Реакции: Alexmd
Подскажи, как привязаться к нумерации такой
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
буквы генерируются на лету.
 
fGvp всегда не активная, или там тоже разное бывает ? Походу всегда, and notcontains fGvp
 
fGvp - это динамическое значение, при другой вводной она другая будет.
Нужно креативное решение, там люди недаром $300.000 за обучение платят.
 
то что я посмотрел неактивная всегда fgvp - дай пример где не так
 
Сегодня такая, а через несколько часов или завтра - будет другая.
 
тогда к инер текст по регэкспу с номером, только в регексп ограничивай жестко конец $ и прибавляй
 
Последнее редактирование:
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;
 
Последнее редактирование:
Так не переходит на следующую.
ну логично, потому что это был пример поиска элемента, там еще и циферку надо прибавлять :) мне что весь код за тебя писать ?

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
Короче, проще всего регуляркой выпарсить значение
class
при активной и неактивной и сравнивать в цикле.
 
ну я бы сделал так. первым 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
А никто не догадался, что под параметром start зашифрован offset в base64? Таким образом, можно просто рассчитать количество доступных страниц и проходить по ним без клика по этой чертовой кнопке.
И, если говорить, как бы сделал я, то это был бы один шаблон, который высчитывает количество человек по каждому фильтру по одной букве из алфавита и заносит в список нагенеренные ссылки на все страницы с результатами поиска, а второй шаблон многопоточно оттуда их берет и парсит мыла.
 
  • Спасибо
Реакции: djaga, baracuda и luk911
Сектор приз на барабане уходит зрителю в черном :) Ну у тебя глаз наметанный конечно :)
 
  • Спасибо
Реакции: Alexmd
Спасибо 8-) Я на парсерах собачку то съел. Всегда найду за что зацепиться, ведь у всего есть своя какая-то логика. Нужно просто проанализировать варианты прежде чем браться за дело.
 
Может имитация клика по картинке именно по активной next и когда станет невзрачным серым то не сработает?
 
Ну тогда парни новая загадка по xpath... https://developers.facebook.com/ квест по реге, там тоже много интересного кто хочет поупражняется, сначало кажется ну что такого, всё просто... а как начинает мышка не в те стороны крутится и кликать с каждым "проходом", вот тут реальный тупик...
 
А никто не догадался, что под параметром start зашифрован offset в base64? Таким образом, можно просто рассчитать количество доступных страниц и проходить по ним без клика по этой чертовой кнопке.
И, если говорить, как бы сделал я, то это был бы один шаблон, который высчитывает количество человек по каждому фильтру по одной букве из алфавита и заносит в список нагенеренные ссылки на все страницы с результатами поиска, а второй шаблон многопоточно оттуда их берет и парсит мыла.
Нет смысла 2 раза парсить, если нужные данные с первого раза получаешь.
 
Так, господа, меня озарило.
Можно сравнить ссылки в браузере через 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";
}

только как правильно это запихнуть в цикл?
 
Последнее редактирование:
  • Спасибо
Реакции: djaga
Нет смысла 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-ое суток.
 

Вложения

  • 1614155370303.png
    1614155370303.png
    6,4 KB · Просмотры: 153
  • Спасибо
Реакции: djaga и soprano

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