Всем привет! Мы снова говорим об использовании электронных таблиц в работе 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 и подписывайтесь на наш блог!