Всем привет! Мы снова говорим об использовании электронных таблиц в работе OSINT-аналитиков. В первой части нашего цикла статей мы обсуждали автоматизацию генерации дорков (расширенных операторов поисковых запросов). Во второй — коснулись интеграции API для исследования данных. Сегодня раскроем тему скрапинга: разберем основы, сделаем сервис для пробива судимостей и чтения RSS, а также интегрируем поисковые выдачи с сайтов в наши Таблицы.

Что такое скрапинг?

Веб-скрейпинг (или скрепинг, или скрапинг от англ. web scraping) — это технология получения веб-данных путем извлечения их со страниц веб-ресурсов. Скрапинг широко применяется для отслеживания цен и товаров, конкурентной разведки, мониторинга новостей или контента, а также извлечения контактной или иной значимой информации.

Начнем издалека. Следующий скрипт позволит нам запросить статус той или иной страницы в сети:

function getPageStatus(url) {

  try {

    var response = UrlFetchApp.fetch(url, {

      'muteHttpExceptions': true 

    });

    var statusCode = response.getResponseCode();

    return " " + statusCode + " " + (statusCode == 200 ? "FOUND" : "NOT FOUND");

  } catch (e) {

    return "Error: " + e.message;

  }

} 

На выходе мы получим сведения о доступности страницы (код 200), о ее отсутствии (404), превышении сроков ожидания (429) или ошибках в записях DNS. Нам это пригодится для различных задач — от проверки никнеймов в социальных сетях до сканирования веб-ресурсов. 

Теперь непосредственно к скрапингу. За его запуск в Google Sheets отвечает функция =IMPORTXML. Для начала давайте попробуем скопировать данные из описания нашего Telegram-канала, расположенного по адресу https://t.me/tomhunter. 

Создаем новую таблицу... К слову, для этого можно просто ввести sheet.new в адресной строке браузера Chrome. В ячейку A2 помещаем адрес https://t.me/tomhunter. Теперь ставим в ячейку B2 функцию:

=IMPORTXML(A2; "//title")

Это позволит нам скопировать в таблицу заголовок веб-страницы. 

Попробуем использовать другую функцию:

=IMPORTXML("https://web.archive.org/cdx/search/cdx?url=t.me/tomhunter"; "//body")

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

=JOIN(CHAR(10); IMPORTXML(A2; "//html/body"))

Почистим полученные данные. Для этого создадим следующую формулу:

=MID(B4;1;SEARCH(" var ";B4)-1)

С ее помощью мы удалим текст, содержащийся в ячейке, начиная с определенного символа или слова. В нашем случае, это ‭«var», с которого начинается техническая информация веб-страницы. 

Теперь вытащим из полученных данных контакты, которые указаны в описании канала. Для этого мы используем формулу =REGEXEXTRACT, а также регулярные выражения. Регулярное выражение — это шаблон, который обработчик регулярных выражений пытается сопоставить с введенным текстом. Так, например, регулярное выражение, по которому программа распознает в тексте адрес электронной почты, будет следующим:

[A-z0-9._%+-]+@[A-z0-9.-]+\.[A-z]{2,4}

А формула, которую мы вставим в ячейку:

=REGEXEXTRACT(B4; "[A-z0-9._%+-]+@[A-z0-9.-]+\.[A-z]{2,4}")

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

Скрапинг по судам и физлицам

Теперь давайте попробуем применить описанное выше на примере канала в Telegram для обмена данными с сайтом судебных решений:

  • https://sudact.ru/

Это позволит нам загружать в таблицу сведения об уголовных, административных и гражданских делах физлица. Вспомним нашу первую статью и сгенерируем готовую гиперссылку, которая будет содержать страницу поиска https://sudact.ru/regular/doc/?regular-txt= и запрос типа ‭«Фамилия И.О.». Проиллюстрирую на примере уже известного нам Бабеля Михаила Александровича, находящегося в федеральном розыске. 

  • https://sudact.ru/regular/doc/?regular-txt=Бабель М.А.

Теперь сформируем для этой веб-страницы формулу:

=JOIN(CHAR(10); IMPORTXML(A2; "//html/body"))

Получилась куча неструктурированных данных. Чтобы разделить ее, воспользуемся формулой =SPLIT. Например:

=SPLIT(A3; "~")

Это позволит нам разнести данные из ячейки A3 по другим ячейкам в том случае, если между блоками в тексте будет присутствовать символ ~

Попробуем и здесь очистить поисковую выдачу. Предположим, что нас интересует получение только номеров судебных дел. В таком случае, мы можем составить следующую формулу:

=MID(D3;1;SEARCH(" от ";D3)-1)

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

Скрапинг по коду сайта

Перейдем к более сложным формам скрапинга. Итак, у нас есть поисковая выдача со страницы https://sudact.ru/regular/doc/?regular-txt=Бабель М.А. Зайдем на эту страницу, кликнем правой кнопкой мыши и выберем функцию ‭«Просмотреть код». В правой части экрана откроется код веб-страницы. Нажимаем ‭«Элементы»  —  ‭«Выбрать элементы на странице для проверки». Далее кликаем на элемент, который выводит все результаты найденных судебных решений. Копируем адрес нужного элемента в формате Xpath. Должно получиться что-то похожее:

/html/body/div[1]/div[6]/div/div[2]/div[3]/ul

Теперь пишем новую формулу:

=IMPORTXML(A1; "/html/body/div[1]/div[6]/div/div[2]/div[3]/ul")

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

=IMPORTXML(A1; "//html/body/div[2]/div[2]/div/div[4]")

Использование формулы позволило выгрузить построчно описание канала в нашу таблицу. Теперь распространим формулу для исследования группы каналов. Для этого можно ее растянуть в таблице.

Хочу также отметить, что в нашу таблицу мы можем импортировать и RSS-фиды. За это отвечает функция =IMPORTFEED. Допустим, что мы сгенерировали RSS-поток при помощи Google Alerts. Вывести его в таблицу можно при помощи следующей формулы:

=IMPORTFEED ("https://www.google.be/alerts/feeds/16150513236241462639/7461767585858944553")

Или при помощи такой:

=IMPORTFEED ("https://www.google.be/alerts/feeds/16150513236241462639/6304816192407876741")

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

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

Комментарии (0)