Авторедактирование списка url-ов на основе HTTP статус кодов
Select messages from
# through # FAQ
[/[Print]\]
Goto page Previous  1, 2  :| |:
Total Commander -> Программное обеспечение

#16:  Author: MVVLocation: Ростов-Дон PostPosted: Fri Jan 27, 2017 22:05
    —
Невозможно разрешить удаленное имя - вполне естественная ошибка, странно только, что с первым скриптом она не возникает на некоторых ссылках...
А если задать 1 поток (2, 3 потока) во втором скрипте, тоже результаты нестабильные?

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

#17:  Author: Hjkma PostPosted: Fri Jan 27, 2017 22:10
    —
MVV
C 3 потоком скрипт возвращает количество ссылок, максимально ближе к общему числу работающих ссылок. С 2 и 1 потоком потестирую.
Про батник в консоли поподробнее, пожалуйста. Сразу после окончания процесса нужно вставить эту строку в конслоь?

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

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

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


Просто при 2 потоках скорость в 1,8 ссылок за одну секунду для меня является медленной. При 10 потоков скорость получается 5 ссылок за одну секунду, что уже приемлемо. Правда теряется часть работающих ссылок. В таком случае пусть скрипт в конце работы еще раз обработает те ссылки, которые возвращают коды "Невозможно разрешить удаленное имя" и "Время ожидания операции истекло". С одним потоком и увеличенным таймаутом. Тогда проблема, думаю, будет решена. Это возможно так сделать?

#18:  Author: MVVLocation: Ростов-Дон PostPosted: Fri Jan 27, 2017 23:48
    —
Незаслуженно забракованные ссылки располагаются подряд в выводе? Или хаотично? Как бы не было такого, что все ссылки с определенного момента бракуются - тогда повторные проходы вряд ли помогут...
А в консоль поочередно выводятся результаты работы каждого воркера.

Упомянутую мной команду надо запускать вместо запуска процесса кнопкой, это будет запуск того же самого процесса, но с выводом текста в файл.

#19:  Author: Hjkma PostPosted: Sat Jan 28, 2017 00:07
    —
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

#20:  Author: MVVLocation: Ростов-Дон PostPosted: Sat Jan 28, 2017 01:34
    —
В общем, наворотил я многопроходность, число проходов и таймауты регулируются массивом $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 недоступен). После каждого прохода в консоль выводятся коды ссылок, полученные на этом проходе, и в конце выводятся ссылки без кодов статуса.


Last edited by MVV on Sat Jan 28, 2017 17:45; edited 1 time in total

#21:  Author: Hjkma PostPosted: Sat Jan 28, 2017 02:05
    —
Отлично, все работающие ссылки успешно скопировались. Большое вам спасибо за скрипт!



Total Commander -> Программное обеспечение


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page Previous  1, 2  :| |:
Page 2 of 2

Powered by phpBB © 2001, 2005 phpBB Group