Reading mode

Информация предоставлена в образовательных целях.

Что такое защита от ботов?

В контексте веб-поиска и посещения сайтов защита от ботов — набор методов, благодаря которым можно идентифицировать запрос отправленный роботом и заблокировать или изменить ответ. Эти способы присутствуют как с серверной, так и с клиентской стороны. Они могут воспрепятствовать спарсить или заспамить сайт веб-автономным системам. В редкостных случаях разработчики веб-роботов заставляют их ботов следовать инструкциям 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 и догружайте сайты, которые прошли через первый метод.

Поделиться этой записью