я бы не запрещал парсинг, а подсовывал боту левак. но не отличимый внешне.
тк еще не было проектов откуда парсинг бы запретили на 100процентов. да усложнить и сделать парсинг дороже можно, но если на сайте есть инфа без пароля - ее заберут. будет сложно - закажут у школоты ручной парсинг и все.
Это хорошая идея сама по себе, и она мне нравится, но данный конкретный бот делает все, чтобы его было не отличить от нормального посетителя. Просто в логах потом видишь, что с каждого из указанных мной в первом комментарии IP-адреса скачали по 46 раз HTML-страницу моего сайта с перебором определенных параметров в HTML-форме через метод GET. Собственно, только после просмотра лога и становится понятно, что это был бот. Он даже страницу моего сайта запрашивает специально с задержкой на случайное число минут от 1 до 3 примерно, чтобы максимально имитировать поведение человека. То есть не выдает все 46 запросов серверу сразу, а специально растягивает этот процесс на час-два. Вот такой вот бот.
ищите другие закономерности помимо юзер-агента и ip.
Тут советуют капчу - ставьте не для всех, а после например, 50 просмотров разных страниц за час с одного ip. Потом еще 50.
Думаю, можно вот так сделать, компромиссно: юзер (с уникальным IP) зашел на страницу с формой и капчей, ввел ее правильно - все, при последующем обращении к форме капча ему больше никогда не выдается. Но если ввел неправильно, то капча при последующих обращениях к странице к форме будет показываться всегда. Да, при опечатке будет страдать нормальный юзер, но зато это отсечет программу. Чтобы разрулить это, можно раз в сутки очищать массив IP с результатами ввода капчи.
Вот такое коротенькое решение реализовал, если кому интересно:
global $post;
$IP = $_SERVER['REMOTE_ADDR'];
if (isset($_SERVER['HTTP_CLIENT_IP'])) {
$IP = $_SERVER['HTTP_CLIENT_IP'];
}
elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$IP = $_SERVER['HTTP_X_FORWARDED_FOR'];
};
$IP = preg_replace('/[^0-9a-zA-Z\.\:]/', '', $IP);
// инициализируем массив запросов
$requests = array();
// загружаем лог для IP в массив
$file_name = '/xxx/logs/IP/'.$IP.'.log';
$file_name_blocked = '/xxx/logs/IP/'.$IP.'.blocked';
if (@file_exists($file_name_blocked)) {
header("Location: /403.php");
die();
};
$result = @file_get_contents($file_name);
if ($result != FALSE) {
$lines = explode(PHP_EOL, $result);
$i = 0;
while ($i < (count($lines)-1)) {
$requests[] = array(
'date' => str_ireplace('DATE: ', '', $lines[$i]),
'URL' => str_ireplace('URL: ', '', $lines[$i+1]),
'postID' => str_ireplace('ID: ', '', $lines[$i+2]),
);
$i = $i+3;
};
};
// добавляем в массив новый запрос
$requests[] = array(
'date' => date('Y-m-d H:i:s'),
'URL' => $_SERVER['REQUEST_URI'],
'postID' => $post->ID,
);
// записываем массив в лог
$file = @fopen($file_name, 'w');
if ($file != FALSE) {
foreach($requests as $r)
@fwrite($file, 'DATE: '.$r['date'].PHP_EOL.'URL: '.$r['URL'].PHP_EOL.'ID: '.$r['postID'].PHP_EOL);
@fclose($file);
};
// Анализируем и блокируем
// Правило 1: обращение к advanced-search (ID=84889) три раза подряд с интервалом менее 5 секунд
for($i=0;$i<count($requests);$i++) {
$found = FALSE;
if ($i >= 2) {
if ($requests[$i-2]['postID'] == 84889 && $requests[$i-1]['postID'] == 84889 && $requests[$i]['postID'] == 84889)
$found = TRUE;
};
if ($found) {
$time1 = $requests[$i-2]['date'];
$time2 = $requests[$i-1]['date'];
$time3 = $requests[$i]['date'];
$diff_21 = strtotime($time2) - strtotime($time1);
$diff_32 = strtotime($time3) - strtotime($time2);
if ($diff_21 < 5 && $diff_32 < 5)
@rename($file_name, $file_name_blocked);
};
};
Еще и вот этих в брандмауэре пришлось забанить сразу диапазонами, ибо тоже с них лезли и качали чуть ли не весь сайт, создавая нагрузку на процессор:
34.*.*.* - Google Cloud
35.*.*.* - Google Cloud
132.145.*.* - Oracle Public Cloud
140.238.*.* - Oracle Public Cloud
152.67.*.* - Oracle Public Cloud
47.128.*.* - Amazon Data Services Singapore
47.129.*.* - Amazon Data Services Singapore
47.130.*.* - Amazon Data Services Singapore
47.131.*.* - Amazon Data Services Singapore
47.235.*.* - Alibaba Cloud
47.236.*.* - Alibaba Cloud
47.237.*.* - Alibaba Cloud
47.238.*.* - Alibaba Cloud
47.239.*.* - Alibaba Cloud
47.240.*.* - Alibaba Cloud
47.241.*.* - Alibaba Cloud
47.242.*.* - Alibaba Cloud
47.243.*.* - Alibaba Cloud
47.244.*.* - Alibaba Cloud
47.245.*.* - Alibaba Cloud
47.246.*.* - Alibaba Cloud
видимо хорошо вы инфу на сайте собрали, раз люди так стараются.
все же очень хотелось накормить бы его леваком)
У меня на сайте в базе более 5000 страниц с информацией об изделиях.
Еще и боты официальные всякие лезут (не вредоносные которые) и много запрашивают страниц, но от них я избавился:
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^.*(Custom-AsyncHttpClient|ZoominfoBot|SurdotlyBot|AwarioBot|Go-http-client|ias_crawler|IABot|Amazonbot|AmazonAdBot|HeadlessChrome|GPTBot|ChatGLM-Spider|MJ12bot|OAI-SearchBot|SeznamBot|CriteoBot|ias-ie|ias-jp|ias-or|ias-va|AhrefsBot|BLEXBot|SemrushBot|DotBot).*$ [NC]
RewriteRule .* - [F,L]
я бы не запрещал парсинг, а подсовывал боту левак. но не отличимый внешне.
тк еще не было проектов откуда парсинг бы запретили на 100процентов. да усложнить и сделать парсинг дороже можно, но если на сайте есть инфа без пароля - ее заберут. будет сложно - закажут у школоты ручной парсинг и все.
ищите другие закономерности помимо юзер-агента и ip.
Тут советуют капчу - ставьте не для всех, а после например, 50 просмотров разных страниц за час с одного ip. Потом еще 50.
А если весь Macintosh в бан? Не вариант? Ко мне, например, с него пользователи почти не ходят.
Я думаю, что это бесплатный контент, раз уж там характеристика изделий.
если это целевой сбор
Это целевой сбор, я это знаю достоверно.
Вам бурж трафик нужен? Парсят с зарубежный проксей.
========================
У меня англоязычный сайт.
CAPTCHA