Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Авторедактирование списка url-ов на основе HTTP статус кодов
Goto page Previous  1, 2
 
Post new topic   Reply to topic    Total Commander Forum Index -> Программное обеспечение printer-friendly view
View previous topic :: View next topic  
Author Message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Fri Jan 27, 2017 22:05    Post subject: Reply with quote

Невозможно разрешить удаленное имя - вполне естественная ошибка, странно только, что с первым скриптом она не возникает на некоторых ссылках...
А если задать 1 поток (2, 3 потока) во втором скрипте, тоже результаты нестабильные?

Возможно, в консоли показываются только 300 строк из-за того, что остальные уже не вмещаются в консольный буфер. Попробуй запустить батник в консоли с выводом в файл:
Code:
UrlFilter.bat > output.txt

_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
Hjkma



Joined: 18 Apr 2015
Posts: 178

Post (Separately) Posted: Fri Jan 27, 2017 22:10    Post subject: Reply with quote

MVV
C 3 потоком скрипт возвращает количество ссылок, максимально ближе к общему числу работающих ссылок. С 2 и 1 потоком потестирую.
Про батник в консоли поподробнее, пожалуйста. Сразу после окончания процесса нужно вставить эту строку в конслоь?

Upd. С 2 потоком вернуло уже все работающие ссылки. Еще раз запустил - вернуло то же самое количество ссылок. Но скорость в целом не айс - на 1925 ссылок скрипт тратит в среднем 17 минут. Где-то 1,8 ссылок за одну секунду получается. С одним потоком результат думаю будет тоже самим - как с первым скриптом.

P.S. Можно ли внести в работе скрипта вот эту заплатку?

Quote:
сделать так, чтобы в конце работы скрипт еще раз обрабатывал ссылки, которые возвращают приведенный выше код ошибки. С одним потоком и увеличенным таймаутом.


Просто при 2 потоках скорость в 1,8 ссылок за одну секунду для меня является медленной. При 10 потоков скорость получается 5 ссылок за одну секунду, что уже приемлемо. Правда теряется часть работающих ссылок. В таком случае пусть скрипт в конце работы еще раз обработает те ссылки, которые возвращают коды "Невозможно разрешить удаленное имя" и "Время ожидания операции истекло". С одним потоком и увеличенным таймаутом. Тогда проблема, думаю, будет решена. Это возможно так сделать?
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Fri Jan 27, 2017 23:48    Post subject: Reply with quote

Незаслуженно забракованные ссылки располагаются подряд в выводе? Или хаотично? Как бы не было такого, что все ссылки с определенного момента бракуются - тогда повторные проходы вряд ли помогут...
А в консоль поочередно выводятся результаты работы каждого воркера.

Упомянутую мной команду надо запускать вместо запуска процесса кнопкой, это будет запуск того же самого процесса, но с выводом текста в файл.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
Hjkma



Joined: 18 Apr 2015
Posts: 178

Post (Separately) Posted: Sat Jan 28, 2017 00:07    Post subject: Reply with quote

MVV
Из тех 300 строк что я видел ссылки эти располагались хаотично. Впрочем нужно еще посмотреть полный файл лога.
Quote:
Упомянутую мной команду надо запускать вместо запуска процесса кнопкой, это будет запуск того же самого процесса, но с выводом текста в файл.

Сам батник находится по адресе
Quote:
e:\Users\Vova\Google Drive\Анализ папок и прочее\скрипты\validate web-adress.bat

Я просто зашел в папку "скрипты", где лежит этот батник, вызвал командную строку, в консоли уже был путь этой папки, я к ней дописал название батника и "> output.txt". Полностью эта строка выглядит так
Quote:
e:\Users\Vova\Google Drive\Анализ папок и прочее\скрипты\validate web-adress.bat > output.txt

Но при нажатии на Enter ничего не происходит, только создается еще одна строка пути этой папки и курсор перемещается к ней.
Я что-то не так сделал?
З.Ы. Уже разобрался, оказалось надо заключать в кавычки название батника, процесс пошел, потом отпишусь.

Upd. Итак вот что выяснилось. Запускал батник с 10 потоками и таймаутом на 10000. Основная причина отсева работающих ссылок - превышено время ожидания операции. Раньше когда когда таймаут был больше, были коды "не удалось разрешить удаленное имя". И такие ошибки разбросаны хаотически по всему списку, то есть не в какой-то момент, а на протяжении всего работы скрипта. Дальше еще раз запущу, но с увеличенным таймаутом. И посмотрю будут ли те же ссылки отбрасываться и поменяются ли коды ошибок.

Upd2. Запустил батник с 10 потоками и таймаутом на 100000. Результаты теперь такие. Всего есть две коды ошибок у работающих ссылок - "Невозможно соединиться с удаленным сервером" и "Невозможно разрешить удаленное имя". В этот раз ссылки, которых скрипт отбросил, совсем другие, чем те который в предыдущий раз были отброшены. И расположенны эти ссылки хаотически по всему списку ссылок. И они нормально открываются в браузере.


Last edited by Hjkma on Sat Jan 28, 2017 01:52; edited 1 time in total
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Sat Jan 28, 2017 01:34    Post subject: Reply with quote

В общем, наворотил я многопроходность, число проходов и таймауты регулируются массивом $passTimeouts (сколько там таймаутов, столько и проходов).
Code:
@echo off
set "ARG_0=%~dpnx0"
powershell.exe -STA -NoProfile "iex (([IO.File]::ReadAllText($Env:ARG_0)) -replace '^(.*\n)*?.*<::::>.*\n', '')" & goto :EOF


Add-Type -Assembly System.Windows.Forms;


$workerCount = 8;
$passTimeouts = @(2000, 5000, 10000, 20000);


function testUrls($defs, $timeout, $workerCount = 1) {
   $job = @{
      queue = [Collections.Queue]::Synchronized((New-Object Collections.Queue (, $defs)));
      timeout = $timeout;
   };
   $script = {
      $job = $args[0];
      while (1) {
         try { $def = $job.queue.Dequeue(); } catch { return; }
         try {
            $req = [Net.WebRequest]::Create($def.url);
            $req.Method = 'HEAD';
            $req.Timeout = $job.timeout;
            $rsp = $req.GetResponse();
            $def.err = '';
         }
         catch {
            $e = $_.Exception;
            while ($e -and $e -isnot [Net.WebException]) { $e = $e.InnerException; }
            $rsp = $e.Response;
            $def.err = $e.Message;
         }
         if ($rsp) {
            $def.code = [int]$rsp.StatusCode;
            $rsp.Close();
         }
      }
   };
   if ($workerCount -gt 1) {
      $workers = @((1 .. $workerCount) | % { $w = [PowerShell]::Create().AddScript($script).AddArgument($job); @{ ps = $w; r = $w.BeginInvoke() } });
      $workers | % { $_.ps.EndInvoke($_.r) };
   }
   else {
      . $script $job;
   }
}


$defs = @([Windows.Forms.Clipboard]::GetText() -split '\r?\n' | ? { $_ -match '^\w+://' } | % { @{ url = $_; } });
$leftDefs = $defs;
$startTime = [DateTime]::Now;

Write-Host "Validating $($defs.Length) urls using $workerCount workers...`n";

$testDef = @{ url = 'http://google.com' };
testUrls @($testDef) 10000 1;
if (!$testDef.code) {
   Write-Host "Oops, self-check failed!";
   $host.SetShouldExit(1);
   return;
}

for ($step = 0; $step -lt $passTimeouts.Length -and $leftDefs.Length; ++$step) {
   $passStartTime = [DateTime]::Now;
   Write-Host "Executing pass #$step using timeout $($passTimeouts[$step])...";
   testUrls $leftDefs $passTimeouts[$step] $workerCount;
   $leftDefs = @($leftDefs | ? { !$_.code; if ($_.code) { Write-Host "$($_.url): $($_.code)" } });
   Write-Host "Pass #$step done in $([int]([DateTime]::Now - $passStartTime).TotalSeconds) seconds, $($leftDefs.Length) urls left.";
   '';
}

if ($leftDefs) {
   Write-Host 'Unresolved urls:';
   $leftDefs | % { Write-Host "$($_.url): $($_.err)" };
   '';
}

$goodUrls = @($defs | ? { $_.code -ge 200 -and $_.code -le 399 } | % { $_.url });
Write-Host "Validation done in $([int]([DateTime]::Now - $startTime).TotalSeconds) seconds.";
if ([Windows.Forms.MessageBox]::Show("Click OK to copy $($goodUrls.Length) good urls.", 'Url Validator', 1) -eq 1) {
   [Windows.Forms.Clipboard]::SetText(($goodUrls -join "`n") + "`n");
}


Каждая ссылка тестируется, пока не будет получен код статуса (который при таймаутах и ошибках DNS недоступен). После каждого прохода в консоль выводятся коды ссылок, полученные на этом проходе, и в конце выводятся ссылки без кодов статуса.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…


Last edited by MVV on Sat Jan 28, 2017 17:45; edited 1 time in total
Back to top
View user's profile Send private message
Hjkma



Joined: 18 Apr 2015
Posts: 178

Post (Separately) Posted: Sat Jan 28, 2017 02:05    Post subject: Reply with quote

Отлично, все работающие ссылки успешно скопировались. Большое вам спасибо за скрипт!
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Программное обеспечение All times are GMT + 4 Hours
Goto page Previous  1, 2
Page 2 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group