Работаю на высоконагруженном сайте, нужна быстрая прогрузка страниц.
Работаю с домашними резидентскими проксями, стоит авторотация (5 мин) + смена прокси гет запросом или сменой порта
Логика следующая.
При каждой загрузке страницы включается таймер, если загрузка страница уложилась в определенное время, все ок, если нет, то нужно сменить прокси и загрузить еще раз. Текущий вариант, у меня не работает. Куки и кэш чистить не желательно.
Есть 2 функции.
1 для прогрузки страницы:
2 для смены прокси:
И собственно сам шаблончик, который работает очень криво)
Посмотрите плиз что не так с логикой.
Ошибки следующие. Грузится страница, грузится долго, сменяется прокси, якобы должна прерваться и загрузиться еще раз но уже с новым проксей, а страничка дальше грузится да грузится на старом проксе и загружается, чекается что все ок, хотя не ок и на выходе получаем якобы прогруженную быстро страницу на новом проксе, а по факту долгую прогрузку на страром проксе и хз какую загрузку на новом проксе, т.к. мы не проверяли новую проксю... надеюсь понятно объяснил....
Плиз подскажите, куда смотреть, где делаю ошибку, понимаю что аппаратно не все идеально, но все же, как мне решить мою задачку...
Спасибо
Работаю с домашними резидентскими проксями, стоит авторотация (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";
}
}
}
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";
Ошибки следующие. Грузится страница, грузится долго, сменяется прокси, якобы должна прерваться и загрузиться еще раз но уже с новым проксей, а страничка дальше грузится да грузится на старом проксе и загружается, чекается что все ок, хотя не ок и на выходе получаем якобы прогруженную быстро страницу на новом проксе, а по факту долгую прогрузку на страром проксе и хз какую загрузку на новом проксе, т.к. мы не проверяли новую проксю... надеюсь понятно объяснил....
Плиз подскажите, куда смотреть, где делаю ошибку, понимаю что аппаратно не все идеально, но все же, как мне решить мою задачку...
Спасибо