Інформація на сторінці тільки для освітніх цілей.

Що таке захист від ботів?

У контексті веб-пошуку та відвідування сайтів захист від ботів – це набір методів, завдяки яким можна встановити запит відправлений роботом та заблокувати відповідь або змінити її. Ці засоби використовують як серверну, так і клієнтську частину коду. Вони можуть завадити спарсити або заспамити сайт веб-автономним системам. У рідкісних випадках розробники веб-роботів змушують їх ботів повинуватися тому, що написано у robots.txt. Наприклад, Google bot.

Яка різниця між запитами людини та бота?

Майже всі використовують веб-браузери для пошуку інформації. Коли користувач переходить на веб-сайт із результатів органічного пошуку або напряму, надрукувавши адресу сайту у пошуковій стрічці, браузер автоматично добавляє деякі HTTP заголовки до GET запиту. Погляньте на повний список заголовків, які можуть бути у браузерних запитах. Також справжні користувачі якось вза’ємодіють із веб-сторінкою: клацають, скролять, змінюють розмір вікна тощо.

Найпоширеніший шлях до виявлення запитів робота – це перевірити HTTP заголовки: якщо, наприклад, user-agent відсутній, то запис насправді здійснений не браузером(Chrome, Firefox і т.д.). Отже, це найлегший метод блокування штучних запитів: якщо один із стандартних головків відсутній – ігнорувати запит у бекенді.

Інший спосіб захисту від ботів – це відстежити підозрілу поведінку та сховати частину контенту. Наприклад, відкласти завантаження частини з контактною формою до тих пір, поки користувач не виконає якісь дії (клацне або заскролить) після зображення основного контенту. Відстеження поведінки – це задача клієнтського JS коду.
Protection From Bots

Як переконати джерело контенту, що запит здійснено людиною, а не роботом?

Очевидно, можна запрограмувати http-клієнт додавати стандартні заголовки до запитів. У більшості випадків достатньо додати User-Agent, Accept-Language та Referer. Приклад із c# .Net Framework класом HttpWebRequest:

public string ReadResp(string url)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Referer = "https://www.google.com/";
                ServicePoint sp = request.ServicePoint;
                ServicePointManager.DefaultConnectionLimit = 10;
                ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, ssl) = > true;
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
                request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate | DecompressionMethods.None;
                request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36";
                request.Accept = "text/html,application/xhtml+xml,application/xml;";
                request.Headers.Add(HttpRequestHeader.AcceptLanguage, "ru-RU,ru;q=0.5,en-US;q=0.9,en;q=0.8,uk;");
                sp.CloseConnectionGroup(request.ConnectionGroupName);
                sp.ConnectionLeaseTimeout = 60000;
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream stream = response.GetResponseStream();
                StreamReader reader = new StreamReader(stream);
                string htmlR = reader.ReadToEnd();
                reader.Close();
                stream.Close();
                response.Close();
                request.Abort();
                return htmlR;
            }
            catch
            {
                return null;
            }
        }

Таким чином можливо обійти захист у бекенді та отримати відповідь на запит. Але у разі, якщо є захист у клієнтській частині також, робот повинен вміти симулювати людську поведінку. Не секрет, що простий http клієнт не може клацати у вебсторінці та виконувати javascript код… Тому нам знадобиться підключити браузер. По-перше, браузер додаватиме заголовки автоматично (нема потреби піклуватися про User-Agent та інших). По-друге, він завантажить та виконає javascript. Врешті-решт, якщо він запрограмований на виконання дій притаманних для людей (клацати, наприклад), він може отримати контент, що схований від інших ботів.

Також є один мінус: цей спосіб працює значно повільніше тому, що він використовує цілий браузер, який, на відміну від простого клієнта, завантажує всі зовнішні ресурси та виконує js.

Для запрограмовування браузера використовується WebDriver. Виконайте необхідні умови для використання Selenium WebDriver у .Net.

Приклад метода, який використовує WebDriver для симуляції роботи людини та завантаження HTML коду сторінки, на c#:

public string ReadRespWithWebDriver(string url)
{
   IWebDriver driver;

   ChromeOptions options = new ChromeOptions();
                options.AddArguments(new List < string > () { "headless", "disable-gpu" });
                var chromeDriverService = ChromeDriverService.CreateDefaultService();
                chromeDriverService.HideCommandPromptWindow = true;
                driver = new ChromeDriver(chromeDriverService, options);
                driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);

  Actions action = new Actions(driver);
                action.MoveByOffset(5, 5).MoveByOffset(10, 15).MoveByOffset(20, 15);

  driver.Navigate().GoToUrl(url);
                    action.Perform();
                    return driver.PageSource;
}

Що використовувати для обходу захисту бід ботів?

Ви отримаєте найбільший ефект у продуктивності, використовуючи і http-клієнт і webdriver для парсингу сторінок. Спочатку запускайте найшвидший метод – простий http-клієнт. Під кінець вмикайте WebDriver та довантажуйте сайти, які пройшли через перший метод.

Share this Post