Защита от парсинга

Эта статья написана специально для людей, которые привыкли работать топорно, а также для тех, кто хочет защититься от безудержного энтузиазма первых.

Если вы для решения каких-либо своих задач решили воспользоваться данными из открытых источников, то необходимо учитывать один важный момент: не всегда люди, публикующие данные в сети для всеобщего доступа, рассчитывают на их автоматизированный сбор.

Применение технических средств сбора данных может привести к повышенной нагрузке на сервера поставщиков информации, что создает затруднения для доступа к этой информации со стороны других пользователей. Естественной реакцией владельца контента является желание защитить свой сайт от парсинга, чтобы обеспечить ему возможность нормально функционировать.

Способы защиты

Первый, и самый простой способ защиты - это ограничение количества запросов в единицу времени, выделяемое на одного пользователя. Обычный пользователь спокойно посещает страницы сайта, используя при этом одно-два открытых окна браузера. Время между повторными кликами на странице обычно составляет десятки секунд, а то и минуты, если пользователь читает интересную статью. Парсер же может терзать сайт сразу в несколько потоков, создавая десятки, а то и сотни запросов в секунду. Если владелец парсера делает это с одного IP-адреса, то бан по IP практически 100% гарантирован.

Организация защиты по количеству запросов в единицу времени лучше всего реализуется на уровне сервера Nginx. Также можно организовать подсчет "хитов" с одного IP на базе серверного ПО с дальнейшим занесением "нарушителя режима" в базу блокировки iptables. Есть и более изощренные системы, позволяющие формировать замысловатую фильтрацию посетителей по признакам и даже организовывать сетевые "ловушки" для нерадивых ботов, например haproxy.

От такого способа защиты не застрахован ни один парсер. Если вы не хотите провоцировать владельца сайта на введение ограничений против вашего IP-адреса, не используйте многопоточный режим парсинга.

Если вам все-таки крайне необходимо получить информацию в максимально сжатые сроки, то воспользуйтесь proxy-серверами. Создайте видимость посещения сайта множеством пользователей, но следите при этом за самочувствием сайта. Если время ответов стало слишком большим или появились ошибки отказа в обслуживании (с кодами 500, 502, 503), то немедленно прекратите парсинг и сократите количество потоков в два раза!

Также перед началом парсинга необходимо обратить внимание на среднюю посещаемость сайта. Если в результате парсинга владелец ресурса заметит резкий аномальный скачек трафика, то он заподозрит неладное и попытается отсечь как минимум часть нетипичных для сайта посетителей (например, с зарубежных IP-адресов, характерных для proxy-серверов), а то и вовсе выключит сайт до выяснения обстоятельств.

Очевидно, что данный способ не защищает контент сайта от воровства, а всего-лишь обеспечивает техническую возможность нормального функционирования сайта. Защитить контент от воровства в сети Интернет можно только юридически, но никак не технически!

Второй способ защиты основан на особенностях работы современных браузеров. Простой парсер отличить от современного браузера довольно просто: парсер считывает только HTML-страницу, но не считывает картинки, не использует таблицы стилей и не исполняет JavaScript.

В серверное ПО можно заложить проверку: если пользователь зашел на страницу, но при этом не загрузил картинку с этой страницы, то он робот и его можно смело банить. Более изящную проверку можно применить с использованием JavaScript, в котором картинка подгружается динамически. Если этого не произошло, значит клиент по какой-то непонятной причине не исполняет JavaScript (вероятнее всего, потому что он - бот!)

Этот способ уже действительно позволяет защитить контент сайта от воровства при помощи парсера. Однако чудес не бывает, и ничто не сможет защитить сайт от целеустремленного копи-пастера!

Третий способ защиты вытекает из второго, и если предыдущий способ позволяет боту скушать перед баном хотя бы одну страницу, то этот способ не дает боту ни единого байта полезной информации! Основан способ все на тех же особенностях современных браузеров и их отличие от примитивных парсеров.

Когда браузер еще только загружает страницу, он уже начинает формировать дерево DOM-элементов. Если при формировании дерева ему попадается внешний подгружаемый ресурс (таблица стилей, скрипт или еще что-то, что участвует в отображении страницы), то браузер открывает новый поток и начинает грузить этот внешний ресурс, не дожидаясь полной загрузки страницы.

В заголовок страницы внедряется специальный код-маркер, который сразу же начнет грузить нормальный браузер и не начнет старинный парсер. По началу загрузки этого кода со стороны сервера можно принять решение, продолжить ли отдавать загружающуюся страницу или выдать боту вместо страницы "шиш с маслом" и отправить его в бан.

Но для реализации такой защиты требуется асинхронный сервер, процессы которого умеют взаимодействовать друг с другом. Довольно легко такой способ защиты реализуется на базе сервера Node.js. В нем процесс, отдающий страницу, начинает выгрузку ее клиенту, и после отдачи кода-маркера начинает ожидать сигнала от второго процесса, отдающего этот маркер. Если сигнал поступил, то это нормальный клиент и страницу отдаем как обычно. Если по прошествии таймаута сигнал так и не поступил, значит наш сайт парсят!

Защита от Parsio

К сожалению для владельцев сайтов и к счастью для пользователей Parsio, не существует защиты от парсеров на базе браузерных движков! Ведь нет никакой возможности отличить браузер человека от браузера робота. И тот и другой используют один и тот же браузер.

Единственный вариант - поймать парсер на превышении числа запросов в единицу времени. Именно поэтому мы призываем пользователей Parsio работать аккуратно и не создавать технических проблем для владельцев сайтов, накидываясь на него сразу несколькими потоками.

Прочие попытки "вычислить" ботов среди браузерных пользователей по каким-то косвенным признакам мало того, что технически весьма сложны, но и могут приводить к ошибочной блокировке живых людей - ваших потенциальных клиентов.

Зачем мы все это понаписали?

Мы считаем, что требуется определенная культура поведения в современном информационном пространстве, причем как со стороны потребителей информации, так и со стороны ее издателей.

Потребители должны уважительно относится к создателям контента и не злоупотреблять их доверием.

Производители контента в свою очередь должны осознавать, что мы живем в век сетевых технологий, в котором лучшим способом защиты контента от воровства является отказ от его публикации.

Мы за свободное распространение информации. Любые попытки остановить распространение информации совершенно не способствуют прогрессу человечества в целом. Опыт подсказывает нам, что производители действительно качественного контента не бояться воровства, а напротив, всячески способствуют распространению своего опыта и знаний, ведь человек заинтересованный все равно рано или поздно вынужден будет обратиться к первоисточнику. Если же этого не происходит, то стоит задуматься, действительно ли вы производите что-то ценное и являетесь ли вы экспертом в этой области?

Насколько бы глубоко не был раскрыт материал, у человека всегда появляются дополнительные вопросы. Обычный вор никогда не сможет ответить на них, потому как он не является экспертом. В итоге вор становится бесплатной PR-площадкой для настоящего эксперта, которого всегда найдет его благодарная аудитория.