Добрый день! Уважаемые читатели и гости портала. В конце ноября я наконец-то решил для себя поиграться с тем, чтобы по закрывать доступ к сайту различным ботам, парсерам, краулерам и всевозможным системам AI. Уже сейчас я вижу снижение нагрузки на 50% к базе данных и самому сайту и понимаю. что это работает. Каждый день я выделяю минут по 10-15 для анализа событий из журналов доступа к сайту. В среднем это от 150к до 200к строк. Так как была проведена огромная работа по блокировке, мне хотелось чтобы все эти события уже не отображались в файле. Делать вручную это неудобно, поэтому я написал простой скрипт, которым решил поделиться с вами.
Почитать мою борьбу по блокировке сетей Битерики и не только, можно по ссылке
Формирование списка исключений
В данный список у меня входят боты поисковых систем, которые я не блокирую, бота ИИ, SEO боты и им подобные, боты социальных сетей, хостингов, строки с кодом 403, так как это уже заблокировано. Вот текущий пример, но он постоянно расширяется.
- 403
- Nextcloud Server Crawler
- TerraCotta
- screeenly-bo
- Googlebot-Image
- perplexity.ai
- PerplexityBot
- perplexity
- YandexBot
- mazonbot
- AhrefsBot
- YandexImages
- YandexUserproxy
- Applebot
- bingbot
- Pinterestbot
- HaloBot
- YandexRenderResourcesBot
- YandexUserproxy
- Googlebot
- YandexRCA
- keys-so-bot
- DuckDuckBot
- SeznamBot
- archive.org_bot
- WebartexBot
- DataForSeoBot
- SERankingBacklinksBot
- TelegramBot
- Instapaper
- YandexAccessibilityBot
- «WordPress/
- .well-known
- YandexMetrika
- DotBot
- LinkupBot
- ClaudeBot
- DuckAssistBot
- ZoominfoBot
- NetcraftSurveyAgent
- mj12bot
- Twitterbot
Все это добро, я копирую в обычный текстовый файл с именем list.txt
Скрипт по очистке журналов доступа к сайту
- Первое, что делает скрипт, это берет файл с журналом доступа
- Далее Подгружается файл со списком для удаления из журнала
- Выгружается конечный файл с результатами обработки. Я делаю это в CSV, чтобы мне потом удобнее было его анализировать и фильтровать.
- Будет показан результат сколько строк было удалено
Данный скрипт проще всего запускать через PowerShell ISE
$xlsxPath = «C:Tempaccess_log»
$txtPath = «C:Templist.txt»
$outputPath = «C:Tempresult.csv»# Проверяем существование файлов
if (-not (Test-Path $xlsxPath)) {
Write-Error «Файл XLSX не найден: $xlsxPath»
exit 1
}if (-not (Test-Path $txtPath)) {
Write-Error «Текстовый файл не найден: $txtPath»
exit 1
}# Получаем список слов для поиска
$searchPatterns = Get-Content $txtPath | Where-Object { $_ -match ‘S’ } | ForEach-Object { $_.Trim() }Write-Host «Найдено шаблонов для поиска: $($searchPatterns.Count)»
# Создаем COM-объект Excel
try {
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false$workbook = $excel.Workbooks.Open($xlsxPath)
$worksheet = $workbook.Worksheets.Item(1)$usedRange = $worksheet.UsedRange
$rowCount = $usedRange.Rows.Count
$colCount = $usedRange.Columns.CountWrite-Host «Загружено строк: $rowCount»
# Переход по строкам снизу вверх (чтобы удаление не сбивало нумерацию)
$rowsToDelete = @()for ($row = $rowCount; $row -ge 1; $row—) {
# Собираем все ячейки строки в одну строку
$rowContent = «»
for ($col = 1; $col -le $colCount; $col++) {
$cellValue = $worksheet.Cells.Item($row, $col).Text
$rowContent += «$cellValue «
}# Проверка на совпадение с любым шаблоном
$found = $false
foreach ($pattern in $searchPatterns) {
if ($rowContent -match [regex]::Escape($pattern)) {
$found = $true
break
}
}if ($found) {
$rowsToDelete += $row
}
}# Удаляем строки
foreach ($row in $rowsToDelete) {
$worksheet.Rows($row).Delete() | Out-Null
}Write-Host «Удалено строк: $($rowsToDelete.Count)»
Write-Host «Осталось строк: $($rowCount — $rowsToDelete.Count)»# Сохраняем результат
$workbook.SaveAs($outputPath, 6) # 6 = CSV формат# Закрываем
$workbook.Close($false)
$excel.Quit()[System.Runtime.Interopservices.Marshal]::ReleaseComObject($worksheet) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()Write-Host «Результат сохранен в: $outputPath» -ForegroundColor Green
} catch {
Write-Error «Ошибка при работе с Excel: $_»
exit 1
}
Для демонстрации беру логи с сервера за треть дня. На входе:
Найдено шаблонов для поиска: 37
Загружено строк: 52534
Удалено строк: 8242
Осталось строк: 44292
Результат сохранен в: C:Tempresult.csv
Согласитесь, что минус 20% от общего количество строк сделает более эффективным последующий анализ журналов доступа. Из приятного стало снижаться среднее время ответа при доступе к сайту. Ресурсы высвободились и серверу стало легче обслуживать настоящих посетителей.