прокрутка страницы фейбук

vikas2006

Client
Регистрация
10.05.2019
Сообщения
62
Благодарностей
1
Баллы
8
Добрый день .
У меня есть страница на группу.

что бы пролистать всех участников до низа я набросал свой вариант кода

var tab = instance.ActiveTab;
var he = tab.FindElementByAttribute("div","id","bottomContent","text",0);
he.ScrollIntoView();

по дереву объектов это после дива где участники а значит должно прокрутить до конца самой страницы.
Но дело в том что прокрутка идет не до конца и надо так раз 15 код что бы всю страницу прокрутить вниз, что бы он ее загрузил.
Может кто знает как в фейбуке сделать прокрутку более правильную и эффективно.
Заранее спасибо
 

backoff

Client
Регистрация
20.04.2015
Сообщения
5 929
Благодарностей
6 389
Баллы
113
на сайте где-то был код/шаблон
короче говоря простая логика для шаблона
  1. берем высоту начальной страницы
  2. скролим вниз и берем высоту снова
  3. если они отличаются друг от друга, значит скролим дальше
  4. когда высоты совпадут - значит достигнут конец страницы
 
  • Спасибо
Реакции: Sergodjan

vikas2006

Client
Регистрация
10.05.2019
Сообщения
62
Благодарностей
1
Баллы
8
я находил вот этот но нет не работает так же как и мой вариант не вся страница прокручивается. и Главное это очень медленно.


42321
 

backoff

Client
Регистрация
20.04.2015
Сообщения
5 929
Благодарностей
6 389
Баллы
113

backoff

Client
Регистрация
20.04.2015
Сообщения
5 929
Благодарностей
6 389
Баллы
113
мой пример работает бесконечно, то есть пока не дойдет до самого конца, могут быть проблемы с оперативкой, если страница уж слишком большая...
можно добавить проверку на количество пролистываний...
но тут мне кажется надо лучше другой способ искать, типа api и пробовать парсить через него, либо попробовать на пост гетах, но тут так быстро не сделаешь :-)
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 386
Баллы
113
Я делал по похожему принципу, но считал не высоту страницы, а количество спаршенных результатов. случаи выравнивания этих показателей отправляли шаблон на циклические увеличения паузы до тех пор, пока не будет достигнуто необходимое количество результатов. То есть, зная, что нам надо спарсить 12К друзей, мой вариант будет крутиться до тех пор, пока не спарсит 12К без ошибок. Проверено
вот есть у тебя значение 1157. крути вниз, собирай и удаляй дубли до тех пор, пока не получишь 1157. паузы сразу выставь побольше, зная пределы своего железа
 

vikas2006

Client
Регистрация
10.05.2019
Сообщения
62
Благодарностей
1
Баллы
8
Alexmd
железо не очень. над идеей подумаю как ее реализовать.
 

vikas2006

Client
Регистрация
10.05.2019
Сообщения
62
Благодарностей
1
Баллы
8
мой пример работает бесконечно, то есть пока не дойдет до самого конца, могут быть проблемы с оперативкой, если страница уж слишком большая...
можно добавить проверку на количество пролистываний...
но тут мне кажется надо лучше другой способ искать, типа api и пробовать парсить через него, либо попробовать на пост гетах, но тут так быстро не сделаешь :-)
С апи пока не очень понимаю для меня это еще темный лес. попробую твой вариант сначала и возможность на большой группе погонять.
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 386
Баллы
113
железо не надо очень мощное. просто с 2гб оперативы лучше паузу поставить секунд 10, чтоб наверняка
 
  • Спасибо
Реакции: vikas2006

vikas2006

Client
Регистрация
10.05.2019
Сообщения
62
Благодарностей
1
Баллы
8
железо не надо очень мощное. просто с 2гб оперативы лучше паузу поставить секунд 10, чтоб наверняка
а есть способы более быстрые поставил на 5000 группу так блин он уже 2 минуты все грузит и грузит их
медленный процесс так шаб не стоит и делать с такой скоростью нужны другие варианты
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 386
Баллы
113

TwistDanceR

Активный пользователь
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
а есть способы более быстрые поставил на 5000 группу так блин он уже 2 минуты все грузит и грузит их
медленный процесс так шаб не стоит и делать с такой скоростью нужны другие варианты
Есть идея такая (сложновато, но наверное сработает). Я заметил, что когда выбирал из "Парсить данные" последний результат (альтернатива прокрутке) - то срабатывает скрипт и догружается страница.
Т.о. чтобы не крутить бесконечно, если не получается, можно такой вариант реализовать циклом.

1) парсишь результаты
2) сохраняешь последний результат списка в переменную
3) наводишь мышку с помощью FullEmulationMouse на последний элемент спаршенной коллекции (href у тебя есть, findElementByAttribute должен сработать).
4) очищаешь результаты парсинга и парсишь снова
5) сравниваешь последний элемент списка с сохраненной переменной
а) если совпал - циклируешь с пунктом 3 для подгрузки ; б) если совпадает - значит все результаты спаршены - выгружаешь список в лист.
 

vikas2006

Client
Регистрация
10.05.2019
Сообщения
62
Благодарностей
1
Баллы
8
идея тоже не плохая я подумаю если что отпишусь что выходит или нет.
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 386
Баллы
113
Эмуляция мыши не работает быстрее, чем {END} в эмуляции клавиатуры. Тут человеку скорость нужна зачем-то.
Я удивляюсь таким людям(без обид) очень много таких на кворке/фрилансе стал встречать. Честно скажи, зачем тебе парсить молниеносно, если ты их все равно своим слабым железом будешь потом 3 дня обрабатывать? Ну соберешь ты линки за 10 минут, а не за минуту и Земля крутиться перестанет?
 

TwistDanceR

Активный пользователь
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
а есть способы более быстрые поставил на 5000 группу так блин он уже 2 минуты все грузит и грузит их
медленный процесс так шаб не стоит и делать с такой скоростью нужны другие варианты
C#:
var test = instance.ActiveTab.DomText;
Tab tab = instance.ActiveTab;
HtmlElement he = instance.ActiveTab.FindElementById("groupsMemberBrowser");
string height = he.GetAttribute("height");
int scroll = Convert.ToInt32(height);
string was = height;
int was1 = Convert.ToInt32(was);
tab.FullEmulationMouseWheel(0,scroll);
string now = he.GetAttribute("height");
int now1 = Convert.ToInt32(now);
if(now1>was1)
{
    was1 = now1;
    tab.FullEmulationMouseWheel(0,scroll);
}
else
{
var regex = @"\ href=""https://www\.facebook\.com/.*?hc_location=group";
var mylist = project.Lists["Список 1"];
mylist.AddRange(Regex.Matches(test,regex).Cast<Match>().Select(m=>m.Value));
project.SendInfoToLog("Домотались",true);
}
Вот тебе примерная идея. Я не стал разбираться в результатах, но у меня почему-то остановилась прокрутка на #430-ом пользователе, хотя я дальше смог пролистать вручную....Вообще MouseWheeling больше для эмуляции человека нужен, а так по сути самый лучший вариант будет скроллинг заменить на несколькократное нажатие {PGDOWN}, Пусть например раз 10 нажимает и сравнивает параметр по высоте div в который выводятся ссылки.

Как тебе такое? ) Можешь допиливать, у меня, к сожалению, время на самосовершенствование исчерпано.
 
  • Спасибо
Реакции: vikas2006

vikas2006

Client
Регистрация
10.05.2019
Сообщения
62
Благодарностей
1
Баллы
8
TwistDa
Спасибо идеи тоже хороша посмотрю обязательно погоняю ее
 

Igorii

Client
Регистрация
21.02.2015
Сообщения
369
Благодарностей
292
Баллы
63
Я сделал так:
1. Ставлю переменную rez1 на 0
2. Кубиком Эмуляции в котором штук 15 {END}, прокручиваю страницу. Возможен выход по красной, значит конец страницы, парсим результат в список.
3. Парсю DOM в список
4. Получаю количество строк в списке в переменную rez2
5. IF сравниваю rez2>rez1, если по красной, значит конец страницы, парсю окончательные результаты в список
6. Для rez1 устанавливаю значение rez2
7. Очищаю список, возвращаюсь к пункту 2

Работает довольно быстро и стабильно.
Пробовал сравнивать по высоте страницы, чёт не стабильно было.

Буду благодарен, если кто то из умельцев воплотит данный алгоритм в коде, пригодится во многих проектах
 
Последнее редактирование:
  • Спасибо
Реакции: vikas2006

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