что такое парсер паролей
Что такое парсинг и как правильно парсить
Что такое парсинг данных должен знать каждый владелец сайта, планирующий серьёзно развиваться в бизнесе. Это явление настолько распространено, что рано или поздно с парсингом может столкнуться любой. Либо как заказчик данной операции, либо как лицо, владеющее объектом для сбора информации, то есть ресурсом в Интернете.
К парсингу в российской бизнес-среде часто наблюдается негативное отношение. По принципу: если это не незаконно, то уж точно аморально. На самом деле из его грамотного и тактичного использования каждая компания может извлечь немало преимуществ.
Что такое парсинг
Глагол “to parse” в дословном переводе не означает ничего плохого. Делать грамматический разбор или структурировать — действия полезные и нужные. На языке всех, кто работает с данными на сайтах это слово имеет свой оттенок.
Парсить — собирать и систематизировать информацию, размещенную на определенных сайтах, с помощью специальных программ, автоматизирующих процесс.
Если вы когда-либо задавались вопросом, что такое парсер сайта, то вот он ответ. Это программные продукты, основной функцией которых является получение необходимых данных, соответствующих заданным параметрам.
Законно ли использовать парсинг
После выяснения что такое парсинг, может показаться, что это нечто, не соответствующее нормам действующего законодательства. На самом деле это не так. Законом не преследуется парсинг. Зато запрещены:
Парсинг законен, если он касается сбора информации, находящейся в открытом доступе. То есть всего, что можно и так собрать вручную.
Парсеры просто позволяют ускорить процесс и избежать ошибок из-за человеческого фактора. Поэтому «незаконности» в процесс они не добавляют.
Другое дело, как владелец свежесобранной базы распорядится подобной информацией. Ответственность может наступить именно за последующие действия.
Для чего нужен парсинг
Что такое парсить сайт разобрались. Переходим к тому, зачем же это может понадобиться. Здесь открывается широкий простор для действий.
Основная проблема современного Интернета — избыток информации, которую человек не в состоянии систематизировать вручную.
Парсинг используется для:
Сквозная аналитика
Достоинства парсинга
Они многочисленны. По сравнению с человеком парсеры могут:
Ограничения при парсинге
Есть несколько вариантов ограничений, которые могут затруднить работу парсера:
Какую информацию можно парсить
Спарсить можно всё, что есть на сайте в открытом доступе. Чаще всего требуются:
Изображения с сайтов технически спарсить тоже можно, но, как уже упоминалось выше, если они защищены авторским правом, лучше не нужно. Нельзя собирать с чужих сайтов личные данные их пользователей, которые те вводили в личных кабинетах
Модуль е-коммерс
Алгоритм работы парсинга
Принцип действия программы зависит от целей. Но схематично он выглядит так:
Способы применения
Основных способов применения парсинга существует два:
Обычно оба варианта работают в тесной связке друг с другом. Например, анализ ценовых позиций у конкурентов отталкивается от имеющегося диапазона на собственном сайте, а обнаруженные новинки сопоставляются с собственной товарной базой и т. п.
Что такое парсер и как он работает
Чтобы поддерживать информацию на своем ресурсе в актуальном состоянии, наполнять каталог товарами и структурировать контент, необходимо тратить кучу времени и сил. Но есть утилиты, которые позволяют заметно сократить затраты и автоматизировать все процедуры, связанные с поиском материалов и экспортом их в нужном формате. Эта процедура называется парсингом.
Давайте разберемся, что такое парсер и как он работает.
Что такое парсинг?
Начнем с определения. Парсинг – это метод индексирования информации с последующей конвертацией ее в иной формат или даже иной тип данных.
Парсинг позволяет взять файл в одном формате и преобразовать его данные в более удобоваримую форму, которую можно использовать в своих целях. К примеру, у вас может оказаться под рукой HTML-файл. С помощью парсинга информацию в нем можно трансформировать в «голый» текст и сделать понятной для человека. Или конвертировать в JSON и сделать понятной для приложения или скрипта.
Но в нашем случае парсингу подойдет более узкое и точное определение. Назовем этот процесс методом обработки данных на веб-страницах. Он подразумевает анализ текста, вычленение оттуда необходимых материалов и их преобразование в подходящий вид (тот, что можно использовать в соответствии с поставленными целями). Благодаря парсингу можно находить на страницах небольшие клочки полезной информации и в автоматическом режиме их оттуда извлекать, чтобы потом переиспользовать.
Ну а что такое парсер? Из названия понятно, что речь идет об инструменте, выполняющем парсинг. Кажется, этого определения достаточно.
Какие задачи помогает решить парсер?
При желании парсер можно сподобить к поиску и извлечению любой информации с сайта, но есть ряд направлений, в которых такого рода инструменты используются чаще всего:
Серый парсинг
Такой метод сбора информации не всегда допустим. Нет, «черных» и полностью запрещенных техник не существует, но для некоторых целей использование парсеров считается нечестным и неэтичным. Это касается копирования целых страниц и даже сайтов (когда вы парсите данные конкурентов и извлекаете сразу всю информацию с ресурса), а также агрессивного сбора контактов с площадок для размещения отзывов и картографических сервисов.
Но дело не в парсинге как таковом, а в том, как вебмастера распоряжаются добытым контентом. Если вы буквально «украдете» чужой сайт и автоматически сделаете его копию, то у хозяев оригинального ресурса могут возникнуть вопросы, ведь авторское право никто не отменял. За это можно понести реальное наказание.
Добытые с помощью парсинга номера и адреса используют для спам-рассылок и звонков, что попадает под закон о персональных данных.
Где найти парсер?
Добыть утилиту для поиска и преобразования информации с сайтов можно четырьмя путями.
При отсутствии разработчиков в штате я бы советовал именно десктопную программу. Это идеальный баланс между эффективностью и затратами. Но если задачи стоят не слишком сложные, то может хватить и облачного сервиса.
Плюсы парсинга
У автоматического сбора информации куча преимуществ (по сравнению с ручным методом):
Так что нет никакого смысла «парсить» руками, когда можно доверить эту операцию подходящему ПО.
Минусы парсинга
Главный недостаток парсеров заключается в том, что ими не всегда удается воспользоваться. В частности, когда владельцы чужих сайтов запрещают автоматический сбор информации со страниц. Есть сразу несколько методов блокировки доступа со стороны парсеров: и по IP-адресам, и с помощью настроек для поисковых ботов. Все они достаточно эффективно защищают от парсинга.
В минусы метода можно отнести и то, что конкуренты тоже могут использовать его. Чтобы защитить сайт от парсинга, придется прибегнуть к одной из техник:
Но все методы защиты легко обходятся, поэтому, скорее всего, придется с этим явлением мириться.
Алгоритм работы парсера
Парсер работает следующим образом: он анализирует страницу на наличие контента, соответствующего заранее заданным параметрам, а потом извлекает его, превратив в систематизированные данные.
Процесс работы с утилитой для поиска и извлечения найденной информации выглядит так:
Естественно, процедура парсинга через специализированное ПО описана лишь в общих чертах. Для каждой утилиты она будет выглядеть по-разному. Также на процесс работы с парсером влияют цели, преследуемые пользователем.
Как пользоваться парсером?
На начальных этапах парсинг пригодится для анализа конкурентов и подбора информации, необходимой для собственного проекта. В дальнейшей перспективе парсеры используются для актуализации материалов и аудита страниц.
При работе с парсером весь процесс строится вокруг вводимых параметров для поиска и извлечения контента. В зависимости от того, с какой целью планируется парсинг, будут возникать тонкости в определении вводных. Придется подгонять настройки поиска под конкретную задачу.
Иногда я буду упоминать названия облачных или десктопных парсеров, но использовать именно их необязательно. Краткие инструкции в этом параграфе подойдут практически под любой программный парсер.
Парсинг интернет-магазина
Это наиболее частый сценарий использования утилит для автоматического сбора данных. В этом направлении обычно решаются сразу две задачи:
В первом случае стоит воспользоваться утилитой Marketparser. Указать в ней код продукта и позволить самой собрать необходимую информацию с предложенных сайтов. Большая часть процесса будет протекать на автомате без вмешательства пользователя. Чтобы увеличить эффективность анализа информации, лучше сократить область поиска цен только страницами товаров (можно сузить поиск до определенной группы товаров).
Во втором случае нужно разыскать код товара и указать его в программе-парсере. Упростить задачу помогают специальные приложения. Например, Catalogloader – парсер, специально созданный для автоматического сбора данных о товарах в интернет-магазинах.
Парсинг других частей сайта
Принцип поиска других данных практически не отличается от парсинга цен или адресов. Для начала нужно открыть утилиту для сбора информации, ввести туда код нужных элементов и запустить парсинг.
Разница заключается в первичной настройке. При вводе параметров для поиска надо указать программе, что рендеринг осуществляется с использованием JavaScript. Это необходимо, к примеру, для анализа статей или комментариев, которые появляются на экране только при прокрутке страницы. Парсер попытается сымитировать эту деятельность при включении настройки.
Также парсинг используют для сбора данных о структуре сайта. Благодаря элементам breadcrumbs, можно выяснить, как устроены ресурсы конкурентов. Это помогает новичкам при организации информации на собственном проекте.
Обзор лучших парсеров
Далее рассмотрим наиболее популярные и востребованные приложения для сканирования сайтов и извлечения из них необходимых данных.
В виде облачных сервисов
Под облачными парсерами подразумеваются веб-сайты и приложения, в которых пользователь вводит инструкции для поиска определенной информации. Оттуда эти инструкции попадают на сервер к компаниям, предлагающим услуги парсинга. Затем на том же ресурсе отображается найденная информация.
Преимущество этого облака заключается в отсутствии необходимости устанавливать дополнительное программное обеспечение на компьютер. А еще у них зачастую есть API, позволяющее настроить поведение парсера под свои нужды. Но настроек все равно заметно меньше, чем при работе с полноценным приложением-парсером для ПК.
Наиболее популярные облачные парсеры
Похожих сервисов в сети много. Причем как платных, так и бесплатных. Но вышеперечисленные используются чаще остальных.
В виде компьютерных приложений
Есть и десктопные версии. Большая их часть работает только на Windows. То есть для запуска на macOS или Linux придется воспользоваться средствами виртуализации. Либо загрузить виртуальную машину с Windows (актуально в случае с операционной системой Apple), либо установить утилиту в духе Wine (актуально в случае с любым дистрибутивом Linux). Правда, из-за этого для сбора данных потребуется более мощный компьютер.
Наиболее популярные десктопные парсеры
Это наиболее востребованные утилиты для парсинга. У каждого из них есть демо-версия для проверки возможностей до приобретения. Бесплатные решения заметно хуже по качеству и часто уступают даже облачным сервисам.
В виде браузерных расширений
Это самый удобный вариант, но при этом наименее функциональный. Расширения хороши тем, что позволяют начать парсинг прямо из браузера, находясь на странице, откуда надо вытащить данные. Не приходится вводить часть параметров вручную.
Но дополнения к браузерам не имеют таких возможностей, как десктопные приложения. Ввиду отсутствия тех же ресурсов, что могут использовать программы для ПК, расширения не могут собирать такие огромные объемы данных.
Но для быстрого анализа данных и экспорта небольшого количества информации в XML такие дополнения подойдут.
Наиболее популярные расширения-парсеры
Вместо заключения
На этом и закончим статью про парсинг и способы его реализации. Этого должно быть достаточно, чтобы начать работу с парсерами и собрать информацию, необходимую для развития вашего проекта.
Парсеры, обработка текста. Просто о сложном. CFG, BNF, LL(k), LR(k), PEG и другие страшные слова
Введение
Итак, вопрос, о чём же конкретно эта статья? Здесь я постараюсь помочь читателю с наименьшими потерями выходить из ситуации, когда надо разобрать какой-то текстовый формат, а библиотекой воспользоваться не получится. То есть решать абсолютно конкретную задачу общими средствами.
Сразу оговорюсь, тема сама по себе мало того, что ОЧЕНЬ непростая, так еще и до невозможности обширная и все охватить в рамках одной статьи просто не получится. Поэтому я начну от общего и буду переходить к частному, конкретно в этой статье давая скорее обзор инструментария (который, однако, может использоваться для решения вполне конкретных задач парсинга), чем погружаться вглубь концепций. Возможно, если читатели будут заинтересованы, статья превратится в цикл, в котором я могу раскрыть какие-то конкретные вопросы более подробно.
Написать её я решил потому, что имеющаяся по теме информация разрознена и зачастую не полна, на русском источников вообще очень мало, а те что есть, подразумевают достаточно приличное знакомство читателя с весьма специфической математикой. Поэтому, чтобы далекий от темы читатель не испытывал боль от сознания своей (мнимой) неполноценности, я и решил попытаться описать эту тему максимально просто.
Крепитесь, статья большая, некоторые места будут не очень интересными, но без них может быть непонятно.
Основные понятия
Перед разговором по теме стоит определиться с основными понятиями, чтобы не было разночтений. Это глоссарий данной статьи. Он может совпадать с общепринятой терминологией, но вообще говоря, не обязан, поскольку показывает картину, формирующуюся в голове автора.
Итак:
Варианты разбора
Когда мы сталкиваемся с задачей создания парсера, решение сводится, как правило, к 4 основным вариантам:
Решаем задачу парсинга
Пойдем по-порядку, варианты brute-force и regexp пропускаем.
Вот и настало время чуть подробнее остановиться на алгоритмах разборщика, вернее на используемых ими грамматиках. Итак, наиболее часто встречаются GLR (до O(L^3) или до O(L^4), как говорят некоторые источники (antlr)), LR, LALR и LL — все в пределах O(L). Наибольшей “прожорливостью” обладает GLR — она способна лучше обрабатывать неоднозначности грамматики, но за счет этого и более медленна. То есть если рассматривать “размер” класса обрабатываемых парсером грамматик(назовем его мощностью парсера), то при прочих равных, мощности распределятся так GLR > LR > LALR > SLR > LL. Потребление ресурсов, соответственно, близко к обратному. Но вернемся к грамматикам.
Составление или поиск грамматики для LR-парсера в целом достаточно просто и высок шанс, что составленный вами “на коленке” BNF будет спокойно воспринят парсером и обработан. Главное, грамматика должна быть полной, то есть описывать все возможные ситуации входного потока, кроме того попробуйте сами понять навскидку, можно ли зная k следующих символов (в зависимости от выбранного LR-парсера) однозначно определить, какое именно правило должно применяться.
Для LR-парсера могут возникать конфликты следующего вида:
Итак, что мы будем решать?
Ну, допустим, это будет простой калькулятор:
Если читатель попробует найти грамматику калькулятора в интернете, он увидит что часто операции сложения/вычитания и умножения/деления обрабатываются разными грамматическими конструкциями. Это сделано специально, чтобы учесть в грамматике такой момент, как приоритет операций (а также раскрыть неоднозначности грамматики). Мы это сделаем дальше по ходу статьи.
Пробуем найти нативное Python-решение, находим их много.
Переформулируем наш калькулятор так, как просит parglare
Достаточно? Сохраним в calc.pg и воспользуемся cli-tool
Упс! кажется, что-то лишнее. Бинго! я зачем-то вставил | = после “/” (нет, я-то знаю, откуда он там (но к теме статьи это не относится) ). Главное в том, что программа нам четко на это указала. Далее после исправления программа поругается еще на отсутствие; в конце обозначения нетерминала и на скобочку в правиле INT. Переформулированный вариант будет выглядеть так:
В итоге, pglr все нравится и он нам скажет:
Ну, а выше по выводу debug можно прочитать их красивое (и понятное) описание. Ну что ж, давайте подумаем. Во первых, давайте не будем самыми умными и выкинем нафиг positive_digit. Если кто-то напишет 0034 — во первых, он сам себе злобный буратино, а во вторых, большинство ЯП, в том числе Python при конвертации этого в число не скажут нам ничего и просто выдадут 34. Прекрасно, это сильно поможет. Во-вторых, нафиг отсюда разделение на int/float, для простоты предположим что все числа с плавающей точкой. Также, pglr понимает регулярные выражения в BNF, воспользуемся этим. Получим:
Ну, как бы то ни было, грамматика
Попробуем реально распарсить что-нибудь.
можем получить result.children и далее по дереву. Можем заодно подсчитать итоговое выражение, но делать это здесь не будем. Важно, что мы получили доступ к дереву объектов, для терминальных символов так же их “значение” и можем делать с этим все, что пожелаем.
Если мы хотим поправить конфликтные ситуации, как еще можно разрешить конфликты грамматики?
Есть несколько вариантов:
В этом случае решение более частное, но в ряде случаев более удобное. Parglare предоставляет хороший инструментарий для приоритезации правил, к примеру, для арифметических выражений можно выставить приоритет операции и ассоциативность (с какой стороны выполняется данная операция — слева направо или справа налево) чем приоритет выше, тем операция выполнится раньше (относительно остальных), к примеру, наша грамматика в такой нотации может выглядеть вот так:
Парсится, но работает не правильно. Например, для
получаем (при не-древовидном парсинге)
что, очевидно, не соответствует ожидаемому результату:
Мораль — лучше использовать стандартные описанные в BNF моменты. Блестящие и прикольные штуки блестят и прикольны, но не всегда работают. Или я не умею их готовить. А большинство библиотек парсинга — имеют версию alpha | beta.
По словам автора об этом баге, он происходит из-за того, что, по сути своей, ассоциативность (left) парсера на уровне алгоритма означает — предпочитать reduce, а не shift. То есть, по сути, если есть возможность “обрубить” правило, или продолжить в его рамках — лучше обрубить. Поскольку парсинг идет слева направо, это и означает левую ассоциативность. Причина же ошибки в том, что не определена приоритетность для правил внутри ADDOP/MULOP, что ломает все правило.
Однако, даже если мы зададим приоритетность (например:
ADDOP: “+” <1>
| “-” <1>), работать все равно не будет, уже из-за другой ошибки.
Напоследок пример с инлайн-функциями, привязываемыми непосредственно к правилам, из документации parglare.
Установка довольно простая, для linux это
Для того, чтобы работать на python2, нужно еще доустановить
Дальше попробуем сделать для него грамматику. У него чуть отличается формат, поэтому двойные кавычки заменим на одинарные и чуть перепишем регулярное выражение, а так же добавим обозначение для WS, который в предыдущем инструменте задавался по умолчанию. Левую рекурсию в нашем случае можно устранить просто переписав на правую.
Важный момент! В ANTLR есть правила парсера и грамматические правила. К появлению узла в результирующем AST ведут правила парсинга. Кроме того, существует некоторое различие, что можно/нельзя в грамматических/правилах парсинга. В частности, в правилах парсинга нет регулярных выражений. Кроме того, парсер должен получить входное правило, стартовый нетерминал (вообще, все несколько сложнее, но в нашем случае вполне хватает и этого). Вообще, стоит заметить, что ANTLR имеет довольно мощный синтаксис, так же поддерживает инлайн функции (пусть и несколько в ином формате) и “не попадающие в дерево” нетерминалы и кое-что еще. В итоге, наша грамматика выглядит так:
Файл при этом называется calc.g4 (Это важно! название файла должно совпадать с названием грамматики внутри).
Далее, мы можем навесить на грамматику листенеры и наслаждаться.
… Наслаждаться неправильно работающей программой. Вернее, правильно, но неожиданно.
И я признаю свою неудачу. Да, задача решаема. Но пользуясь только документацией и поиском на общие темы, мне её решить не удалось. Причины… Во-первых, исключая книгу по ANTLR, доступные в сети источники не отличаются подробностью и выразительностью. Во-вторых, в сети масса материалов по разным (не совместимым) версиям ANTLR. Нет, я все понимаю, развитие и прочее. Но почему-то в процессе знакомства с инструментом у меня сложилось ощущение, что о понятии обратной совместимости автор даже не слышал. В общем, грустно.
Update
Как верно замечено, одна голова хорошо, а две лучше.
Переформулирование грамматики с право-ассоциативной на левую выполняется буквально «щелчком пальцев» (Спасибо Valentin Nechayev netch80 за дополнение) — нужно всего лишь заменить
Левую рекурсию в данном случае ANTLR обрабатывает без вопросов (видимо, благодаря каким-то оптимизациям). Вывод простых листенеров в этом случае
Итак, перейдем к практике.
Используем Arpeggio от автора parglare:
Дальше разбираемся с документацией и узнаем, что рекомендованным для работы с AST для этой библиотеки является шаблон посетитель (visitor), весьма похожий на рекомендованный в ANTLR слушатель (listener). К счастью, здесь для всего эксперимента мне хватило часа, все оказалось не сложно:
При запуске выведет следующее:
Если есть желание посмотреть, как посетитель обходит дерево, можно раскомментировать debug
Как мы видим, грамматика претерпела небольшие, но важные изменения. В частности, если мы обратим внимание на правила stmt и term, то будет понятно, что они имеют произвольное число элементов. Соответственно, благодаря этому, обработка ассоциативности математических операций целиком и полностью на нашей совести. Несмотря на эти изменения, программа остается простой и понятной.
Общие выводы
На самом деле, выводов несколько:
Заключение
В заключение хочется сказать, что это было интересное исследование. Я попытался описать свои выводы максимально просто и понятно, надеюсь, мне удалось написать эту статью так, чтобы тема стала понятна даже далеким от математики программистам, хотя бы в общих чертах, достаточных для пользования существующим инструментарием.
Можно задавать любые вопросы, если какие-то подробности по теме будут волновать многих, они могут послужить для написания других статей.
Как и обещал, несколько полезных ссылок по теме статьи:
Парсинг — это законно?
В двух словах: законно, но нужно помнить о куче «подводных камней».
В начале марта появилась новость, что в России запретили парсинг общедоступных персональных данных. В целом это действительно так, но правовые вопросы, связанные с парсингом, не сводятся только к персональным данным. Поэтому я решил написать о парсинге с юридической точки зрения.
Парсинг — не совсем точное название. На самом деле автоматизированный сбор информации лучше называть скрейпингом, а парсинг — это этап скрейпинга, на котором из скачанных данных извлекается нужная информация (так сказано, например, на второй странице в статье «Legality And Ethics of Web Scraping»). Но в русскоязычных источниках мне чаще попадается слово «парсинг», и используется оно как синоним скрейпинга без терминологических нюансов, так что буду в этой статье писать «парсинг», имея в виду автоматизированный сбор данных в целом, а не какую-то его технологическую часть. Кстати, в законах наверняка не написали бы ни о «парсинге», ни о «скрейпинге», потому что заимствования там не любят. Вместо этого придумали бы что-то вроде «автоматизированного сбора общедоступной информации в сети «Интернет».
В российских законах напрямую о парсинге не говорится ничего: нет какого-то раздела под заголовком «Парсинг» с определением и десятком-другим правил, из которых сразу было бы понятно, что можно, а что нельзя. Это проблема: рассуждать о юридической стороне какого-либо явления проще всего, когда о нём давным-давно известно (желательно — со времён римского права), когда об этом десять раз написано в законах и есть куча судебных решений, официальных разъяснений и разного рода теоретических работ. В случае с парсингом всё не так: римские юристы о нём не знали, в законах ничего конкретно не сказано, судебной практики и научных статей немного, официальных разъяснений я не встречал. Что делать? Лучше всего подумать, какие нормы права в принципе можно применить к парсингу и каким образом.
Краткое, но почти полное изложение статьи
Начать нужно со статьи 29 Конституции: каждый вправе свободно искать и получать информацию любым законным способом. Далее, в Законе об информации говорится: по общему правилу, информация является общедоступной, и каждый вправе использовать такую информацию по своему усмотрению. Казалось бы, всё просто: информация в интернете общедоступная, поэтому её можно свободно парсить. Всё так, не будь различных ограничений, установленных другими законами. Есть ещё несколько блоков правовых норм, которые касаются парсинга и содержат эти самые ограничения.
Рассмотрим каждый из этих пунктов подробнее. Уточню: говорить буду в основном о российском праве и лишь изредка ссылаться на зарубежный опыт, когда без этого не обойтись. О других странах нужно писать отдельно, потому что в них будут свои тонкости. Правда, указанная выше пятёрка тематических блоков, скорее всего, никуда не денется, то есть по этой схеме можно рассмотреть законодательство многих государств.
Вред имуществу и убытки
Начнём с нетипичных и неочевидных вариантов. Казалось бы, при чём здесь вред имуществу, когда речь о программах, делающих что-то в интернете? На самом деле такой подход к вопросу нельзя исключать. Да, информация, сайты, программы — это нематериальные объекты, но серверы, на которых всё работает — вполне себе материальные. Если из-за парсинга что-то случится с сервером, то вполне можно говорить о вреде имуществу. Грубо говоря, если кто-то станет парсить сайт так активно, что сервер задымится и сломается, то можно будет поставить вопрос о возмещении вреда, причинённого имуществу.
Разумеется, сгоревший сервер — это крайне маловероятно. Впрочем, парсинг всё же может привести к убыткам для владельца сайта. Представим себе интернет-магазин, который «упал» на пять часов из-за нагрузки от парсера. В течение пяти часов покупатели не могли сделать заказ, и владелец сайта не получил деньги, которые он иначе получил бы — это называется упущенная выгода. Можно ли потребовать возмещения таких убытков? Здесь всё непросто: по общему правилу, нужно доказать четыре обстоятельства: первый — есть правонарушение, второй — есть вред, третий — есть причинно-следственная связь между нарушением и вредом, четвёртый — есть вина нарушителя. По каждому из этих пунктов возникнут сложности:
нужно как-то оценить вред и доказать, что его размер не взяли с потолка, а посчитали правильно;
нужно доказать, почему парсинг действительно является правонарушением (тут тоже всё не так просто, но некоторые возможные обоснования будут в следующих разделах статьи);
нужно доказать, что вред возник именно из-за парсинга (а не из-за кривой конфигурации сервера и плохой защиты от ботов);
наконец, нужно доказать, что даже если нарушитель и не хотел ничего плохого (то есть не было умысла), но всё равно по-хорошему он мог бы предвидеть последствия, если бы подумал хотя бы в рамках «здравого смысла» (юридически это будет называться «лёгкая неосторожность»).
Кроме того, нарушителя ещё нужно найти, а это тоже та ещё задачка: «я тебя по IP вычислю» — не более чем мем, а в реальности нужно будет в исковом заявлении указать почтовый адрес, причём полиция не подскажет: они розыском по гражданским делам не занимаются. Словом, хотя в теории привлечь к ответственности можно, на практике это один из самых трудных вариантов.
Когда серверы были слабее, вариант с причинением вреда смотрелся чуть реалистичнее. В частности, в конце 1990-х одна американская компания парсила Ebay. Ebay обратился в суд. Основание — парсер делал 100 тысяч запросов в сутки, что составляло 1,5% от общего трафика на сайт. Это привело к дополнительным расходам на обслуживание серверов — следовательно, финансовые потери должны быть возмещены, а парсинг прекращён. Дело в итоге закончилось мировым соглашением (пример я взял из книги «Web Scraping with Python»). Сейчас серверы намного мощнее, так что вряд ли парсинг реально «положит» сайт или как-то ещё приведёт к убыткам для владельца.
Уголовная ответственность
Звучит страшно: за парсинг могут посадить. Почему бы и нет: предположим, что доступ к некоторым страницам сайта запаролен, и парсер взламывает пароль. Это попадает под состав преступления «Неправомерный доступ к компьютерной информации» (статья 272 Уголовного кодекса): оно небольшой тяжести, но всё равно можно получить штраф до двухсот тысяч рублей или отправиться в колонию на два года. А ещё в той статье есть пункты 2–4, и там наказания куда более суровые.
Впрочем, взлом пароля при парсинге — это редкость. Значит, опасности нет? Не совсем. Вернёмся к статье 272 УК:
неправомерный доступ к охраняемой законом компьютерной информации, если это деяние повлекло уничтожение, блокирование, модификацию либо копирование компьютерной информации, наказывается…
Теперь анализируем. Как гласит примечание к этой статье, «под компьютерной информацией понимаются сведения (сообщения, данные), представленные в форме электрических сигналов, независимо от средств их хранения, обработки и передачи». Таким образом, парсинг — это работа с компьютерной информацией. Влечёт ли он копирование такое информации? Да, ради этого и парсят. Является ли информация «охраняемой законом»? Ясного ответа на этот вопрос нет, но нужно понимать: речь не только о государственной тайне. Под определение «охраняемой законом» могут попасть и персональные данные, и коммерческая тайна, и информация, содержащая результаты интеллектуальной деятельности. Остаётся вопрос с «неправомерным доступом», и с ним опять всё сложно. Допустим, в условиях использования сайта написано, что парсинг запрещён. Означает ли это, что парсинг становится «неправомерным доступом»? На первый взгляд, да. Но с другой стороны, условия использования — это гражданское право, а преступления — это уголовное право, поэтому терминология может различаться.
Для понимания «неправомерного доступа» можно вспомнить, что в США за парсинг иногда пытаются привлечь к ответственности по так называемому CFAA — Computer Fraud and Abuse Act. Он о киберпреступлениях, то есть в какой-то мере аналогичен статьям Уголовного кодекса России. В CFAA говорится о наказании за «unauthorized access» — неавторизованный доступ к компьютерной информации (сравните с «неправомерным»). Американские суды тоже столкнулись с вопросом, что же такое «неавторизованный доступ». Появилась такая аргументация: неавторизованный доступ следует понимать по аналогии со «взломом и вторжением» в жилище, то есть с обезвреживанием средств защиты и устранением препятствий. Следовательно, само по себе нарушение условий использования сайта — это не «неавторизованный доступ», поэтому CFAA тут не применяется. По-видимому, в теории что-то подобное нужно использовать и в России. Однако американские судебные прецеденты (и судебный прецедент вообще) в России — не источник права, поэтому сослаться на них нельзя. Так что вопрос о «неправомерноом доступе» всё равно остаётся. Кроме того, как быть, если парсинг заблокирован технически, а парсер обходит блокировку — будет ли это «неправомерным доступом»?
Помимо статьи 272, есть статья 273 — «Создание, использование и распространение вредоносных компьютерных программ»:
создание, распространение или использование компьютерных программ либо иной компьютерной информации, заведомо предназначенных для несанкционированного уничтожения, блокирования, модификации, копирования компьютерной информации или нейтрализации средств защиты компьютерной информации, наказывается…
Она тоже может касаться парсинга: состав преступления — это использование компьютерных программ, предназначенных для несанкционированного копирования компьютерной информации. Вопрос опять же в толковании термина «несанкционированное копирование» — ситуация такая же неопределённая, как и в случае с «неправомерным доступом». Кроме того, в статье говорится о «нейтрализации средств защиты компьютерной информации» — при желании под эту формулировку можно подвести обход блокировки парсинга. А ещё обратите внимание, что статья касается не только тех, кто использует «компьютерные программы для несанкционированного копирования компьютерной информации», но и тех, кто их «создаёт и распространяет». То есть теоретически отвечать будет не только тот, кто запустил парсер, но и тот, кто его разработал.
Словом, риск уголовной ответственности тоже есть. Я бы не сказал, что он слишком высокий: всё же попытка отнести парсинг к преступлениям выглядит натянутой, и цель указанных статей Уголовного кодекса — это борьба с хакерами и вирусописателями, а не с теми, кто просто собирает данные с сайтов. Впрочем, правоприменение в России иногда довольно своеобразное, а нормы кодекса достаточно неопределённые для того, чтобы при желании под них можно было подвести и парсинг. Вопрос скорее в том, что связываться с правоохранительными органами «потерпевший» вряд ли захочет, потому что гораздо проще забанить пользователя за нарушение пользовательского соглашения.
Нарушение пользовательского соглашения
На некоторых сайтах есть условия использования или пользовательские соглашения. Это те самые документы, которые «прячутся» в «подвале» и которые редко читают. А зря: в пользовательском соглашении может оказаться пункт, запрещающий парсинг. Следовательно, тот, кто парсит, нарушает пользовательское соглашение, и это плохо. Но «плохо» — это моральная оценка. Что говорит право?
Пользовательское соглашение — это, по сути, договор, а договоры должны исполняться. Если не исполняются, можно привлечь к гражданско-правовой ответственности. Например, если в пользовательском соглашении написано: «Штраф за парсинг — 1 миллион рублей», то в наказание за парсинг, исходя из условий договора, действительно можно потребовать миллион.
А заключён ли договор? Договор должен исполняться, но только в том случае, если пользователь его, упрощённо говоря, подписал. Заходя на сайт, никто никаких договоров обычно не подписывает. Максимум мы нажимаем «ОК» на уведомление о cookie, но это не пользовательское соглашение. Пользовательское соглашение по-прежнему лежит где-то на задворках сайта. Мы предполагаем, что оно есть, но фактически его не видим и не ищем. Кроме того, если мы просто зашли на сайт без регистрации, то нам никто о пользовательском соглашении и не говорит. Так должны ли мы ему подчиняться?
Есть два типа соглашений: click-wrap и browse-wrap. Click-wrap — это когда нужно нажать кнопку или поставить галочку «Я согласен с условиями». Browse-wrap — это когда договор находится на какой-то странице сайта, и нужно самому зайти туда и прочитать. С click-wrap всё сравнительно просто: человек жмёт на кнопку или ставит галочку и тем самым «подписывает» договор. С browse-wrap ситуация куда сложнее. Для заключения договора требуется, чтобы субъект выразил свою волю. Когда договор просто лежит где-то на сайте, невозможно понять, выразил ли субъект свою волю. Следовательно, если пользователь просто зашёл на сайт, то без дополнительных доказательств вряд ли можно сказать, что договор заключён. Нет договора — нет обязанностей.
Если парсит зарегистрированный пользователь, то с заключённостью договора проблем меньше: при регистрации нужно согласиться с условиями использования. Если эти условия запрещают парсинг, то владелец сайта может применить санкции, предусмотренные договором. Простейшая санкция — это бан, который юридически может являться приостановлением оказания услуг или расторжением договора в одностороннем порядке.
Интеллектуальная собственность
К интеллектуальной собственности относится много чего: произведения науки, литературы и искусства, компьютерные программы, базы данных, изобретения, селекционные достижения, товарные знаки, ноу-хау и ещё с десяток разных объектов. При парсинге обычно приходится сталкиваться только с произведениями науки, литературы и искусства, а также с базами данных.
Контент сайта — тексты, фото, аудио, видео — иногда относится к произведениям науки, литературы или искусства. Такие произведения охраняются авторским правом «по умолчанию» — просто потому, что они существуют, и без каких-либо формальностей. При парсинге контент копируется. С юридической точки зрения, копирование — это «воспроизведение» объекта интеллектуальных прав. Без разрешения автора оно запрещено.
Если контент распространяется на условиях открытой лицензии (например, Creative Commons, как в «Википедии»), которая разрешает копирование, то парсинг сам по себе не нарушает авторские права. Однако не всё в интернете находится под открытой лицензией. То, что кто-то выложил контент в открытый доступ, вовсе не означает, что он теперь не охраняется авторским правом — напротив, по общему правилу, он всегда охраняется. Таким образом, парсинг может приводить к нарушению авторских прав, если парсер собирает такой контент, который охраняется авторским правом и не распространяется на условиях открытой лицензии, разрешающей копирование.
Впрочем, авторское право действует не всегда. Как я написал выше, «тексты, фото, аудио и видео» иногда относятся к произведениям науки, литературы или искусства. Иногда, но не всегда: объектом авторского права считается результат творческого труда, а контент иногда может быть «нетворческой» информацией. Новостные сообщения, курсы валют, акций и облигаций, прогноз погоды, результаты матчей, объявления о продаже чего-либо, цены на товары — всё это авторским правом не охраняется. Ещё не охраняются авторским правом произведения народного творчества, официальные документы государственных органов и некоторые другие виды объектов — все они указаны в ст. 1259 ⋅ 6 Гражданского кодекса. Следовательно, в плане авторского права их можно парсить спокойно. Однако авторским правом дело не ограничивается.
Помимо произведений есть другой объект интеллектуальных прав — база данных. Этот термин может ввести в заблуждение. Под базой данных в праве понимается не то же самое, что в программировании, хотя кое-что общее есть. База данных, с юридической точки зрения — это совокупность самостоятельных материалов, систематизированных так, что их можно найти и обработать с помощью компьютера (я немного упростил определение из статьи 1260 Гражданского кодекса). Наверное, многие базы данных в «техническом» смысле тоже попадут под это определение, но важно вот что: для права не имеет значения, используется PostrgeSQL или Redis, Hadoop или ClickHouse, табличка в Экселе или набор текстовых файлов, разложенных по папочкам в пять уровней — если есть множество самостоятельных материалов, которые систематизированы и которые можно обработать на компьютере, то это база данных. Сайт, таким образом, вполне можно признать базой данных (даже если там не используется СУБД). А права на базу данных охраняются сами по себе. То есть база данных может сплошь состоять из неохраняемых материалов, но при этом быть объектом интеллектуальной собственности.
Бывают креативные базы, а бывают инвестиционные. Или творческие и нетворческие. Креативные — это такие, в которых при подборе и расположении материалов применили какой-то оригинальный подход так, что она сама по себе стала «художественным произведением». Например, сайт с произведениями философов Античности, которые автор собрал и распределил по категориям, тегам, хронологии и подборкам, можно назвать креативной базой данных, потому что страницы сайта не сброшены в кучу, а организованы оригинальным способом (хотя, конечно, творческий характер работы — это оценочное понятие). Инвестиционные — это такие, где особого творческого подхода не было, а просто собрали очень много материалов. Например, база объявлений на «Хабр Фрилансе» — это скорее инвестиционная база данных, потому что набор категорий типовой, и материалы создаются не владельцем сайта, но материалов довольно много.
Для инвестиционных баз данных есть особые правила. Во-первых, охраняются только те базы, для создания которых потребовались «существенные затраты». Подтвердить затраты должен изготовитель базы данных. Не подтвердил — нет охраны. Однако есть послабление: если в базе больше 10 тысяч материалов, то считается, что существенные затраты есть, и база данных охраняется правом. Во-вторых, из базы данных при некоторых условиях можно извлекать материалы, не нарушая права изготовителя базы данных. Эти условия написаны в статье 1335.1 Гражданского кодекса:
лицо, правомерно пользующееся обнародованной базой данных, вправе без разрешения обладателя исключительного права — изготовителя базы данных и в той мере, в которой такие действия не нарушают авторские права изготовителя базы данных и других лиц, извлекать из базы данных материалы и осуществлять их последующее использование:
в целях, для которых база данных ему предоставлена, в любом объеме, если иное не предусмотрено договором;
в личных, научных, образовательных целях в объеме, оправданном указанными целями;
в иных целях в объеме, составляющем несущественную часть базы данных.
Что важного в этом правиле? Во-первых, извлекать материалы можно, если не нарушаются авторские права, то есть если контент не охраняется авторским правом или распространяется по открытой лицензии. Во-вторых, пользоваться нужно обнародованной базой данных, и пользоваться правомерно, то есть не нарушая условий использования. В-третьих, объём материалов, которые можно извлечь, зависит от целей. Многие понятия из процитированного пункта являются оценочными, так что в зависимости от конкретных обстоятельств парсинг может как быть правомерным, так и нарушать закон.
Словом, выглядит всё не очень радостно: сразу на «входе» в парсинг поджидают авторские права, а если они вдруг не действуют, то сталкиваешься с правами на базы данных — в этом лабиринте интеллектуальных прав легко запутаться. Впрочем, как минимум на базы данных есть одна альтернативная точка зрения. Я натолкнулся на неё в статье М. А. Рожковой об онлайн-классифайдах. Там задаётся вопрос: можно ли считать, что посетитель сайта пользуется базой данных? Нет, он пользуется сервисом, разработанным на основе базы данных, а не самой базой данных. Следовательно, правила о базах данных к парсингу вообще не применяются. Вместо них работают нормы об использовании общедоступной информации — такую информацию можно собирать свободно. Конечно, это не означает, что снимаются вопросы с авторскими правами на контент, но использовать правила о базах данных для запрета парсинга владелец сайта уже не сможет. Несмотря на то что М. А. Рожкова — авторитетный специалист по праву интеллектуальной собственности и ИТ-праву, нужно помнить, что научные работы в России — не источник права: в суде можно сослаться только на закон. Закон, конечно, можно понимать по-разному, так что точку зрения из научной статьи всё же можно использовать, чтобы обосновать свой вариант толкования. Возможно, когда-то идея о том, что пользование сайтом — это не использование базы данных, станет доминирующей, и суды с ней начнут соглашаться.
Персональные данные
Месяц назад мне пришлось бы долго рассуждать на тему общедоступных персональных данных. С 1 марта 2021 года всё стало просто: чтобы законно собирать персональные данные из интернета, нужно получить согласие каждого человека, чьи данные собираются. То, что человек сам разместил свои данные в открытом доступе, больше не имеет значения. На Хабре есть статья о законе, который де-факто запретил парсинг общедоступных персональных данных, поэтому долго рассуждать на эту тему не буду. Кроме того, есть статья на Roem.ru, где объясняются возможные причины принятия этого закона.
Есть один вариант, при котором собирать общедоступные персональные данные всё же можно без согласия каждого конкретного человека: сайт, на котором размещены такие данные, взял у человека согласие на распространение. Иначе говоря, если условный «ВКонтакте» попросит у всех пользователей согласие не только на обработку, но и на распространение персональных данных, то парсинг профилей ВКонтакте снова станет законным — во всяком случае, с точки зрения персональных данных. Однако вряд ли ВКонтакте станет так делать: по делу «ВК против Дабл» можно сделать вывод, что социальная сеть, наоборот, была бы рада максимально затруднить парсинг.
Заключение
Я рассмотрел пять правовых аспектов парсинга. По большей части речь шла о запретах и рисках. В каком-то смысле я сделал так намеренно. Общее правило, которое следует из Конституции и Закона об информации — каждый вправе собирать информацию любым законным способом. Так что по общему правилу парсинг — это законно. Однако нужно помнить о многочисленных ограничениях и нюансах. Иногда они приводят к фактическому запрету парсинга, иногда создают дополнительные сложности, а иногда правомерность парсинга зависит от конкретных обстоятельств.