Чем вы проверяете массово доступность сайтов?

Dexio

Client
Регистрация
09.05.2014
Сообщения
1 251
Благодарностей
219
Баллы
63
Господа, может есть у вас работающие массовые утилиты?
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
540
Благодарностей
395
Баллы
63

Dexio

Client
Регистрация
09.05.2014
Сообщения
1 251
Благодарностей
219
Баллы
63
Что такое параллель? И зачем прокси для чека сайтов на доступность?
 

Шива

Client
Регистрация
05.02.2018
Сообщения
1 088
Благодарностей
341
Баллы
83
метрикой
 

Dexio

Client
Регистрация
09.05.2014
Сообщения
1 251
Благодарностей
219
Баллы
63
Я походу неправильно сформулировал. Задача-есть список доменов 500к
Нужно проверить сколько из них отвечают и открываются, чтобы на них зайти.
 

Шива

Client
Регистрация
05.02.2018
Сообщения
1 088
Благодарностей
341
Баллы
83
Вот тот шаблон что ты у меня по рефке купил отлично с этим справляется.
Парсер DNS.
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
540
Благодарностей
395
Баллы
63
Я походу неправильно сформулировал. Задача-есть список доменов 500к
Нужно проверить сколько из них отвечают и открываются, чтобы на них зайти.
Попробуй, если не лайт версия
Код:
var Success = project.Lists["SuccessSiteList"];//Домены с успехом
var Error = project.Lists["ErrorSiteList"];//Домены с ошибкой
var siteList = project.Lists["siteList"];//Домены без http|https

int Tcount = siteList.Count / 99;//делим список доменов на 99, чтоб весь список в 100 потоков расфасовать

Parallel.For(0, 100, x =>     //100 потоков
{
    List<string> TsiteList = new List<string>();
  
    lock (CommonCode.SyncObject)              
    {            
        for(int u = 0; u < Tcount; u++)//Тут берем нужное количество в список потока  
        {
              
            if(siteList.Count > 0)  
            {          
                TsiteList.Add(siteList[u]);
            }
            else
            {    
                break;
            }
          
        }      
    }
  
    
    if(TsiteList.Count > 0)  
    {
      
        for(int i = 0; i < TsiteList.Count; i++)
        {
              
            string SiteDomain = TsiteList[i];//Берем юпс              
            
            var ping = new System.Net.NetworkInformation.Ping();
            var result = ping.Send(SiteDomain);

            if (result.Status == System.Net.NetworkInformation.IPStatus.Success)
            {
                lock (CommonCode.SyncObject)              
                {
                    Success.Add(SiteDomain);
                }
            }
            else
            {
                lock (CommonCode.SyncObject)              
                {
                    Error.Add(SiteDomain);
                }
            }
        }
    }
  
});
 
  • Спасибо
Реакции: orka13

Шива

Client
Регистрация
05.02.2018
Сообщения
1 088
Благодарностей
341
Баллы
83
Попробуй, если не лайт версия
Код:
var Success = project.Lists["SuccessSiteList"];//Домены с успехом
var Error = project.Lists["ErrorSiteList"];//Домены с ошибкой
var siteList = project.Lists["siteList"];//Домены без http|https

int Tcount = siteList.Count / 99;//делим список доменов на 99, чтоб весь список в 100 потоков расфасовать

Parallel.For(0, 100, x =>     //100 потоков
{
    List<string> TsiteList = new List<string>();
 
    lock (CommonCode.SyncObject)             
    {           
        for(int u = 0; u < Tcount; u++)//Тут берем нужное количество в список потока 
        {
             
            if(siteList.Count > 0) 
            {         
                TsiteList.Add(siteList[u]);
            }
            else
            {   
                break;
            }
         
        }     
    }
 
   
    if(TsiteList.Count > 0) 
    {
     
        for(int i = 0; i < TsiteList.Count; i++)
        {
             
            string SiteDomain = TsiteList[i];//Берем юпс             
           
            var ping = new System.Net.NetworkInformation.Ping();
            var result = ping.Send(SiteDomain);

            if (result.Status == System.Net.NetworkInformation.IPStatus.Success)
            {
                lock (CommonCode.SyncObject)             
                {
                    Success.Add(SiteDomain);
                }
            }
            else
            {
                lock (CommonCode.SyncObject)             
                {
                    Error.Add(SiteDomain);
                }
            }
        }
    }
 
});
А можешь такое же сделать для whois?
 

Ssmodey

Client
Регистрация
10.12.2016
Сообщения
128
Благодарностей
27
Баллы
28
Попробуй, если не лайт версия
Код:
var Success = project.Lists["SuccessSiteList"];//Домены с успехом
var Error = project.Lists["ErrorSiteList"];//Домены с ошибкой
var siteList = project.Lists["siteList"];//Домены без http|https

int Tcount = siteList.Count / 99;//делим список доменов на 99, чтоб весь список в 100 потоков расфасовать

Parallel.For(0, 100, x =>     //100 потоков
{
    List<string> TsiteList = new List<string>();
 
    lock (CommonCode.SyncObject)             
    {           
        for(int u = 0; u < Tcount; u++)//Тут берем нужное количество в список потока 
        {
             
            if(siteList.Count > 0) 
            {         
                TsiteList.Add(siteList[u]);
            }
            else
            {   
                break;
            }
         
        }     
    }
 
   
    if(TsiteList.Count > 0) 
    {
     
        for(int i = 0; i < TsiteList.Count; i++)
        {
             
            string SiteDomain = TsiteList[i];//Берем юпс             
           
            var ping = new System.Net.NetworkInformation.Ping();
            var result = ping.Send(SiteDomain);

            if (result.Status == System.Net.NetworkInformation.IPStatus.Success)
            {
                lock (CommonCode.SyncObject)             
                {
                    Success.Add(SiteDomain);
                }
            }
            else
            {
                lock (CommonCode.SyncObject)             
                {
                    Error.Add(SiteDomain);
                }
            }
        }
    }
 
});
Пишет
Компиляция кода Ошибка в действии "CS0103" "Имя "CommonCode" отсутствует в текущем контексте". [Строка: 10; Cтолбец: 11]
Компиляция кода Ошибка в действии "CS0103" "Имя "CommonCode" отсутствует в текущем контексте". [Строка: 41; Cтолбец: 23]
Компиляция кода Ошибка в действии "CS0103" "Имя "CommonCode" отсутствует в текущем контексте". [Строка: 48; Cтолбец: 23]
Что может быть не так?
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
540
Благодарностей
395
Баллы
63

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Есть неплохая утилита, но она на джаве, и для хорошего многопотока могут понадобится правки в конфигах:
Screaming Frog SEO Spider Tool & Crawler Software
Работает на запросах. Генерит неплохие отчеты таблицами с размером кода страницы, текстом ответов, заголовков и т.д. В итоге очень удобно отсортировать сайты по каким-то признакам невалидности, нерабочего хостинга, заглушки общей и т.д.
Можно поискать фулл версию по соответствующих порталах. А уже на основе ее функционала можно писать свои чекеры узконаправленные на зенке.
 
Последнее редактирование:

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 764
Благодарностей
1 391
Баллы
113
А чего там проверять то?? Весь шаб = один GET запрос с получением заголовков + проверка на содержание в ответе 200 OK ... если есть, то в один список кладем, если нет, то в другой .... вот и вся проверялка доступности. И юзай во сколько хочешь потоков
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 055
Благодарностей
6 483
Баллы
113
что за лол тут развели ...
шоканул просто от предложений :-)

гетом заголовки хватать и все
если 200 значит ОК
все что кроме 200 != ОК

шаб в 5 кубиков... в многопотом и без прокси
 

Ssmodey

Client
Регистрация
10.12.2016
Сообщения
128
Благодарностей
27
Баллы
28
Директивы using и общий код - должен быть кусок
public static object SyncObject = new object();
Есть. http://prntscr.com/ls1smz
Теперь пишет:
Выполнение действия CSharp OwnCode Произошла одна или несколько ошибок.

что за лол тут развели ...
шоканул просто от предложений :-)

гетом заголовки хватать и все
если 200 значит ОК
все что кроме 200 != ОК

шаб в 5 кубиков... в многопотом и без прокси
Гетом это понятно, только например те страницы которые я проверяю - очень массивные. И при загрузке в 15 потоков у меня проц забивается до 90%.
Вот и хотелось бы найти способ какой-то иной, чтобы разгрузить процессор или увеличить скорость работы.
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 055
Благодарностей
6 483
Баллы
113
пример такой массивной страницы скиньте
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
540
Благодарностей
395
Баллы
63

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Есть. http://prntscr.com/ls1smz
Теперь пишет:
Выполнение действия CSharp OwnCode Произошла одна или несколько ошибок.


Гетом это понятно, только например те страницы которые я проверяю - очень массивные. И при загрузке в 15 потоков у меня проц забивается до 90%.
Вот и хотелось бы найти способ какой-то иной, чтобы разгрузить процессор или увеличить скорость работы.
способ есть. Нужно отключить браузер в твоём "безбраузерном" чеккере
 
  • Спасибо
Реакции: WebBot

Ssmodey

Client
Регистрация
10.12.2016
Сообщения
128
Благодарностей
27
Баллы
28
пример такой массивной страницы скиньте
Например такой автоматически сформированный говнокод: https://www.hochschulteam-dresden.com/
В среднем где-то по 1млн символов получается на страницу.
using System.Threading.Tasks;
Это прописано: http://prntscr.com/ls1zw7

способ есть. Нужно отключить браузер в твоём "безбраузерном" чеккере
Это само собой разумеется сделал в первую очередь.
Правда, в том шаблоне, которые у меня чекает есть ещё два кубика с регуляркой и два if
Но я не думаю что из-за них может так нагружаться...
Суть в том, что я думал может можно как-то сделать пингатор без get запроса, чтобы отсеять лишние домены и не ждать, пока они ответят на get запрос
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Например такой автоматически сформированный говнокод: https://www.hochschulteam-dresden.com/
В среднем где-то по 1млн символов получается на страницу.

Это прописано: http://prntscr.com/ls1zw7


Это само собой разумеется сделал в первую очередь.
Правда, в том шаблоне, которые у меня чекает есть ещё два кубика с регуляркой и два if
Но я не думаю что из-за них может так нагружаться...
Суть в том, что я думал может можно как-то сделать пингатор без get запроса, чтобы отсеять лишние домены и не ждать, пока они ответят на get запрос
зависит от регулярки
 

Ssmodey

Client
Регистрация
10.12.2016
Сообщения
128
Благодарностей
27
Баллы
28

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113

backoff

Client
Регистрация
20.04.2015
Сообщения
6 055
Благодарностей
6 483
Баллы
113
может шаб в цикле?
через время весь проц забивает ...

при норм чеке думаю спокойно в 100 потоков залипить можно, с нагрузкой в 30-50%, смотря какой серв конечно
Обе вида (?<=<html\ lang=").*?(?=")
а что конкретно надо от страницы? зачем язык парсить?
надо узнать доступность страницы или что? чет этот момент не до конца понял
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 055
Благодарностей
6 483
Баллы
113
если правильно понял... то этот вариант должен подойти норм
в файл links.txt добавьте весь список ссылок и запустите
все что рабочее будет лежать в файле OK.txt
все что нет в файле bad.txt
 

Вложения

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

Ssmodey

Client
Регистрация
10.12.2016
Сообщения
128
Благодарностей
27
Баллы
28
может шаб в цикле?
через время весь проц забивает ...

при норм чеке думаю спокойно в 100 потоков залипить можно, с нагрузкой в 30-50%, смотря какой серв конечно

а что конкретно надо от страницы? зачем язык парсить?
надо узнать доступность страницы или что? чет этот момент не до конца понял
Нет, не в цикле, уже понял почему процессор забивается.
По сути как делает мой шаб:
1. get запрос содержимого
2. Проверка наличия поля с языком. Если нет - завершает, если есть идёт дальше. Тем самым идёт и проверка на доступность и язык страницы, который мне понадобиться. (язык именно в такой структуре)
3. Проверка наличия ещё одного значения.
4. По if'у раскидывает в два списка.

Сайтов много и много из них недоступно, поэтому я подумал что можно как-то их быстро пропинговать сначала, а уже потом рабочие парсить. Но, это как оказалось лишнее действие, т.к. узкое место которое забивает процессор не сам get запрос (как я раньше думал), а регулярки проверки языка и проверки наличия текста.

За пример шаблона благодарен, т.к. именно он и показал, что поиск значения в 5000 символов (если искать по заголовкам) и по 700.000 символов (если искать по коду страницы) имеет просто колоссальную разницу :-)

Немного оффтопа... Я не очень разбираюсь в регулярках, но можно ли как-то сделать, чтобы поиск текста был не по всему коду страницы, а до определённого момента? (количества строк или количества символов)
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 055
Благодарностей
6 483
Баллы
113
ну можно так сделать
1. пропинговать страницы моим шабом он быстро вытянет рабочие
2. можно использовать этот сниппет, он удаляет ненужные символы, которые нагружают поиск и следовательно проц
Код:
string Test = project.Variables["get_info"].Value;
string regexTest = System.Text.RegularExpressions.Regex.Replace(Test, @"[{}]", "");
return regexTest;
get_info - это имя переменной куда кладется гет запрос
3. использовать регулярку уже по исправленному тексту

или

регуляркой вырезать первые 30-50 строк (туда обязательно попадут все заголовки и языки)
и уже из этого текста брать регулярку
 
  • Спасибо
Реакции: Ssmodey

Ssmodey

Client
Регистрация
10.12.2016
Сообщения
128
Благодарностей
27
Баллы
28
ну можно так сделать
1. пропинговать страницы моим шабом он быстро вытянет рабочие
2. можно использовать этот сниппет, он удаляет ненужные символы, которые нагружают поиск и следовательно проц
Код:
string Test = project.Variables["get_info"].Value;
string regexTest = System.Text.RegularExpressions.Regex.Replace(Test, @"[{}]", "");
return regexTest;
get_info - это имя переменной куда кладется гет запрос
3. использовать регулярку уже по исправленному тексту

или

регуляркой вырезать первые 30-50 строк (туда обязательно попадут все заголовки и языки)
и уже из этого текста брать регулярку
Благодарю, попробую
 

vadim4ukr

Client
Регистрация
10.06.2016
Сообщения
217
Благодарностей
48
Баллы
28

ТРОН

Client
Регистрация
31.07.2016
Сообщения
336
Благодарностей
381
Баллы
63
Суть в том, что я думал может можно как-то сделать пингатор без get запроса
Код:
var Domains = project.Lists["Domains"];//Входящий список с доменами
var goodList = project.Lists["good"];
var badList = project.Lists["Bad"];
System.Net.NetworkInformation.PingReply pingReply = null; 
project.SendInfoToLog(string.Format("Пингуем домены. Кол-во: {0} шт.", Domains.Count), true);
    System.Threading.Tasks.Parallel.For(0, Domains.Count, i => {
            string domain = Domains[0];
            Domains.RemoveAt(0);
            try
            {
                System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
                pingReply = ping.Send(domain);
                project.SendInfoToLog(string.Format("Домен: {0} ответ есть. IP адрес: {1}", domain, pingReply.Address.ToString()), true);
                  goodList.Add(domain);
            }

            catch
            {
                if (domain != "")
                {
                    project.SendInfoToLog("Домен: "+ domain + " не отвечает", true);
                    badList.Add(domain);
                }
            }
           
            });
 
Последнее редактирование:
  • Спасибо
Реакции: udder и Ssmodey

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