ошибка в логике смены прокси "на лету", С#

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
Работаю на высоконагруженном сайте, нужна быстрая прогрузка страниц.
Работаю с домашними резидентскими проксями, стоит авторотация (5 мин) + смена прокси гет запросом или сменой порта
Логика следующая.
При каждой загрузке страницы включается таймер, если загрузка страница уложилась в определенное время, все ок, если нет, то нужно сменить прокси и загрузить еще раз. Текущий вариант, у меня не работает. Куки и кэш чистить не желательно.
Есть 2 функции.
1 для прогрузки страницы:
C#:
        public string load_page(string url, int max_load_ms=5000, string type_load = "main"){
            project.SendInfoToLog("Прогружаем страничку "+url);
            int count_load = 0;
            instance.ActiveTab.Navigate(url,"https://www.google.com");
            var start_time = Convert.ToInt64(DateTimeOffset.Now.ToUnixTimeMilliseconds());
            while(true){
                if(type_load=="main"){
                    string find_el = instance.ActiveTab.FindElementByAttribute("div","class","fm-SiteLink","regexp",0).GetAttribute("innertext");
                    if (find_el.Contains("result")){
                        var delta_time = Convert.ToInt64(DateTimeOffset.Now.ToUnixTimeMilliseconds()) - start_time;
                        project.SendInfoToLog(delta_time.ToString());
                        if(delta_time<max_load_ms) return "ok";
                        else return "long_time_to_load";
                    }
                    System.Threading.Thread.Sleep(100);
                    count_load++;
                    if (count_load==100) return "not_load";
                }
                else{
                    return "error_choice_type_load";
                }
            }
        }
2 для смены прокси:
C#:
        //смена прокси
        public string proxy_change (string provider_proxy, string link_reboot){
            //хз надо ли стопать, все равно не помогает)))
            instance.ActiveTab.Stop();
            //Регулярочки для json
            Regex get_200_Rgx = new Regex(@"(?<=HTTP/1\.1\ ).*(?=\ OK)");
            Regex get_429_Rgx = new Regex(@"(?<=HTTP/1\.1).*(?=Requests)");
            Regex json_Rgx = new Regex(@"\{[\w\W]*}");
            //Пробегаемся по поставщикам проксей
            if(provider_proxy=="socks") return "socks";
            else if(provider_proxy=="proxy"){
                project.SendInfoToLog("меняем проксю");
                if(!link_reboot.Contains("http")) link_reboot = "http://"+link_reboot;
                string resRequest = ZennoPoster.HTTP.Request(
                                         method: ZennoLab.InterfacesLibrary.Enums.Http.HttpMethod.POST,
                                        url:link_reboot,
                                        contentPostingType:"application/x-www-form-urlencoded",
                                        Encoding:@"UTF-8",
                                        respType:ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody,
                                        Timeout:30000,
                                        Cookies:string.Empty,
                                        UserAgent:project.Profile.UserAgent,
                                        UseRedirect:true,
                                        UseOriginalUrl:true,
                                        cookieContainer:project.Profile.CookieContainer,
                                        throwExceptionOnError: true
                                        );
                string json_resRequest = json_Rgx.Match(resRequest).ToString().Trim();
                var json = JObject.Parse(json_resRequest);
                string result_resRequest = get_200_Rgx.Match(resRequest).ToString().Trim();
                if (result_resRequest != "200"){
                    result_resRequest = get_429_Rgx.Match(resRequest).ToString().Trim();
                    // тут возвращает в left сколько секундн нужно подождать
                    if(result_resRequest.Contains("Too Many")) return "too_many&"+json["left"].ToString();
                    else return "error_request";
                }
                string ip = string.Empty;
                try{ip = json["IP"].ToString();}
                catch{ip = "";}
                project.SendInfoToLog(ip);
                if(ip!="") return "ok";
                else return "error_ip_change";
            }
            else return "error_provider";
        }
И собственно сам шаблончик, который работает очень криво)
C#:
//подключаем функции что написали выше
CommonCode comm = new CommonCode(project, instance);
//Устанавливаем прокси
instance.SetProxy(proxy);
int count_load = 0;
while(count_load!=5){
    result_step = string.Empty;
    result_step = comm.load_page(home_url,2000);
    //в резалте у нас ошибки если они есть
    project.SendInfoToLog("Прогруз страницы "+count_load+" "+result_step);
    if (result_step=="ok"){
        project.SendInfoToLog("Загрузились быстро, все ок.");
        break;
    }
    else if (result_step=="long_time_to_load" || result_step=="not_load"){
        result_step = string.Empty;
        result_step = comm.proxy_change(provider_proxy,link_reboot);
        if(result_step=="ok"){
            //если ок, то прокси сменился, гет запрос получили корректный
            instance.ClearProxy();
            instance.SetProxy(proxy);
            project.SendInfoToLog("Сменили прокси, все ок");
            System.Threading.Thread.Sleep(500);
            continue;
        }
        else if(result_step.Split('&')[0]=="too_many"){
            //тут мы спим столько сколько просит сервак
            int sleep_time = Convert.ToInt32(result_step.Split('&')[1]);
            project.SendInfoToLog(string.Format(@"Спим, {0} очень частые запросы", sleep_time.ToString()));
            System.Threading.Thread.Sleep(sleep_time*1000);
        }
    }
    else return "error_choice_type_load";
    count_load++;
}
if (count_load==5) return "error_load";

return "okkk";
Посмотрите плиз что не так с логикой.
Ошибки следующие. Грузится страница, грузится долго, сменяется прокси, якобы должна прерваться и загрузиться еще раз но уже с новым проксей, а страничка дальше грузится да грузится на старом проксе и загружается, чекается что все ок, хотя не ок и на выходе получаем якобы прогруженную быстро страницу на новом проксе, а по факту долгую прогрузку на страром проксе и хз какую загрузку на новом проксе, т.к. мы не проверяли новую проксю... надеюсь понятно объяснил....
Плиз подскажите, куда смотреть, где делаю ошибку, понимаю что аппаратно не все идеально, но все же, как мне решить мою задачку...
Спасибо
 

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
Вот логи, так может чуть понятнее будет
83367
Прогружаем страничку, тут все понятно
получили время прогрузки 2301 мс, у нас стоит до 2000 мл, значит грузится долго
Видим сообщение long_time, и меняем проксю
Получили новую проксю ее тоже видим
Ниже сообщение что сменили проксю и все ок
Заново прогружаем страничку
Видим 268 мс, или 0.268с, так страница не грузится, а по факту дозагрузилась предыдущая
Учитывая что 268 по времени ок, меньше 2000, получаем сообщение что все ок
Якобы мы загрузились быстро, а по факту нет. Т.к. когда мы получили сообщение okkk страница еще раз прогружается, видимо как раз после смены прокси))
Програмно видимо все ок, а аппаратно что то не так делаю...
Спс
 

volody00

Client
Регистрация
06.09.2016
Сообщения
900
Благодарностей
925
Баллы
93
Попробуй добавить закрытие вкладки (если медленно грузится) и потом уже переход
 
  • Спасибо
Реакции: arbplv

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 710
Баллы
113
То что будет найден контрольный элемент на странице, не означает что страница уже загрузилась. это значит, что можно с ним работать.
Не найденный контрольный элемент на странице, не означает что страница не загрузилась. это значит что она грузится (а при уставке 2с. это 100%) и он может появится через 50 секунд.
В коде нет установки таймаута загрузки страницы
Нет принудительной остановки загрузки

Собственно говоря вообще непонятная идея. Чекается скорость загрузки страницы ? или чекается работоспособность прокси ?
Такие интервалы проверки 2-5 секунд не будут работать на практике, в силу особенности работы браузера. он шлет кучу запросов паралельно, а чекается элемент на странице. это примерно как кидаем камень в воду, а результат падения проверяем по лодке в 3-х метрах , качнулась или нет :bk:
Как по мне так лучше найти снипет от Михаила, по проверке прокси через гет запросы и перед работай с сайтом чекать прокси именно им с уставкой нужного таймаута.
 
  • Спасибо
Реакции: arbplv

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
Попробуй добавить закрытие вкладки (если медленно грузится) и потом уже переход
Интересная идея, попробую. Я еще думал в сторону isbusy или похожие какие то методы...
 

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
То что будет найден контрольный элемент на странице, не означает что страница уже загрузилась. это значит, что можно с ним работать.
Не найденный контрольный элемент на странице, не означает что страница не загрузилась. это значит что она грузится (а при уставке 2с. это 100%) и он может появится через 50 секунд.
В коде нет установки таймаута загрузки страницы
Нет принудительной остановки загрузки

Собственно говоря вообще непонятная идея. Чекается скорость загрузки страницы ? или чекается работоспособность прокси ?
Такие интервалы проверки 2-5 секунд не будут работать на практике, в силу особенности работы браузера. он шлет кучу запросов паралельно, а чекается элемент на странице. это примерно как кидаем камень в воду, а результат падения проверяем по лодке в 3-х метрах , качнулась или нет :bk:
Как по мне так лучше найти снипет от Михаила, по проверке прокси через гет запросы и перед работай с сайтом чекать прокси именно им с уставкой нужного таймаута.
Спасибо за много букв. Если я тебя правильно понял, то чуть не так...
В рамках текущей задачи, мне именно нужно ждать прогрузки конкретного элемента, поэтому в моем случае это сработает. в коде есть старт отчета и конец отчета, и дельта это и есть разница в мс сколько грузилось. Возможно не самый лучший способ, но считает) Принудительной действительно нет, но есть максимальное время, которое задается кол-вом проходов в цикле.
У меня прокся умирают достаточно быстро, и скорость у них тоже меняется достаточно часто, прокси же резиденсткие, домашние (на девайсы пользователй ставится софт, они соглашаются пропускать через себя трафф, и если они рядом с вайфаем, то скорость норм, если отошли, то скорость упала, и мой сайт прогружается очень долго...) Поэтому мне важно чекать именно прогрузку страницы, а прокси это второстепенно уже.
Ну видимо потому у меня и не работает эта логика, выше предложили закрыть вклаку и открыть новую, интересная идея, сейчас затестирую. Гет запросами чекать это тоже вариант, надо сравнит если ли прямолинейная корреляция между проверкой гет запросом и временем загрузки именно моего сайта. Подскажи что за снипет михаила, и как его найти, интересно посмотреть, что он там чекает.
 

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
Попробуй добавить закрытие вкладки (если медленно грузится) и потом уже переход
В целом проблемка вот так и решилась, отрабатывает относительно нормально... Ты красавчик)
 
  • Спасибо
Реакции: volody00

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