Информация предоставлена в образовательных целях.
Contents
Что такое защита от ботов?
В контексте веб-поиска и посещения сайтов защита от ботов — набор методов, благодаря которым можно идентифицировать запрос отправленный роботом и заблокировать или изменить ответ. Эти способы присутствуют как с серверной, так и с клиентской стороны. Они могут воспрепятствовать спарсить или заспамить сайт веб-автономным системам. В редкостных случаях разработчики веб-роботов заставляют их ботов следовать инструкциям robots.txt. Например, Google bot.
Разница между запросами бота и настоящего пользователя
Почти каждый использует веб-браузеры для поиска информации. Когда пользователь переходит на веб-сайт из результатов органического поиска или напрямую, напечатав адрес сайта в строке поиска, браузер автоматически добавляет некоторые HTTP заголовки в GET запрос. Посмотрите полный список заголовков, которые могут быть в браузерных запросах. Также настоящие пользователи взаимодействуют с веб-страницей: клацают, скролят, меняют размер окна и т.д.
Самый распространенный вариант для определения запросов робота — это проверка HTTP заголовки: если, например, user-agent не установлен, то запрос точно отправлен не браузером(Chrome, Firefox и т.д.). То есть это наипростейший метод блокирования искусственных запросов: если один из стандартных заголовков отсутствует — игнорировать запрос на сервере.
Другой способ защиты от ботов — это отслеживание подозрительного поведения и выдача неполного контента. Например, отложить загрузку части разметки с контактной формой до тех пор, пока пользователь не выполнит какие-то действия (клацнет или заскролит) после выдачи основного контента. Отслеживание поведения — это задача клиентского JS кода.
Как убедить источник контента, что запрос отправлен человеком, а не роботом?
Очевидно, можно запрограммировать 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 и догружайте сайты, которые прошли через первый метод.