Пособие по журналистике данных 1.0
Loading

Получение данных из сети

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

  • Получить данные с помощью размещенных в сети API, например, с помощью интерфейсов, предоставляемых онлайновыми базами данных и многими современными веб-приложениями (в т. ч. такими, как Twitter, Facebook и многие другие). Это просто фантастический способ получения доступа к государственным или коммерческим данным, а также к данным на сайтах социальных СМИ.

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

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

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

В данном разделе мы рассмотрим самый простой пример «выскребания» данных из веб-страницы в формате HTML.

Что такое машиночитаемые данные?

Цель всех упомянутых методов заключается в получении машиночитаемых данных. Машиночитаемые данные создаются для их обработки компьютером, а не для их презентации пользователю-человеку. Структура таких данных связана с содержащейся в них информацией, а не с тем, как они представляются пользователю на экране. Примеры легких машиночитаемых форматов включают в себя файлы CSV, XML, JSON и Excel, в то время как такие форматы, как документы Word, страницы HTML и файлы PDF служат больше для визуального представления информации. Например, PDF — это язык, который создан непосредственно для принтера, он несет информацию главным образом о положении линий и точек на странице, а не об отдельных символах.

«Выскребание» веб-сайтов: зачем?

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

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

Что можно и что нельзя выскрести

Конечно, в процессе «выскребания» существуют некоторые ограничения. К факторам, затрудняющим «выскребание» данных с сайта, относятся:

  • Плохо отформатированный HTML-код, содержащий минимальное количество информации или не содержащий ее вовсе, например, старые сайты государственных органов.

  • Системы аутентификации, созданные для предотвращения автоматического доступа, например, введение кодов (CAPTCHA) или взимание оплаты.

  • Системы, отслеживающие по файлам cookies браузера, чем занимается пользователь в ходе данной сессии.

  • Отсутствие полного перечня элементов и возможности поиска с использованием групповых символов.

  • Блокирование масштабного доступа администраторами сервера.

Кроме того, существуют правовые ограничения: в некоторых странах признаются права на базы данных, которые могут ограничивать ваше право на использование информации, опубликованной в Интернете. В некоторых случаях вы можете проигнорировать эти положения и воспользоваться такой информацией — в зависимости от вашей юрисдикции вы можете обладать особыми правами как журналист. «Выскребание» свободно доступных официальных данных должно быть разрешено, но вы можете захотеть перепроверить их перед публикацией. Коммерческие организации и некоторые НПО менее терпимо относятся к «выскребанию» данных и могут подать жалобу на то, что вы «препятствуете» работе их систем. Использование другой информации может нарушать права физических лиц на неприкосновенность личной жизни и, таким образом, нарушать законы о неприкосновенности личной жизни или профессиональную этику.

Инструменты, помогающие в «выскребании» данных

Существует множество программ, с помощью которых можно извлекать массивы данных с веб-сайтов, в т. ч. дополнения для браузеров и определенные веб-сервисы. В зависимости от вашего браузера автоматизировать выполнение некоторых утомительных задач вам помогут такие инструменты, как Readability (который помогает извлекать из веб-страницы текст) или DownThemAll (который помогает загружать несколько файлов одновременно), а приложение для браузера Chrome Scraper extension было разработано специально для извлечения таблиц из веб-сайтов. Такие дополнения, как FireBug (для Firefox, оно же уже включено в Chrome, Safari и IE), позволят вам точно определить, как организован веб-сайт и какие коммуникации осуществляются между вашим браузером и сервером.

Веб-сайт ScraperWiki поможет вам встроить коды «скребков» в программы, написанные на различных языках, в т. ч. на Python, Ruby и PHP. Если вы хотите начать выскребать данные без утомительного настраивания программ на вашем компьютере, то это именно то место, которое вам нужно посетить. Произвести сбор данных с других веб-сайтов вам могут также помочь такие сервисы, как Google Spreadsheets and Yahoo! Pipes.

Как работает веб-скребок?

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

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

Показывая веб-сайт, ваш браузер практически всегда будет использовать две технологии: HTTP (это способ общения с сервером, необходимый для запроса конкретных ресурсов, например, документов, изображений или видео) и HTML (это язык, на котором строятся веб-сайты).

Анатомия веб-страницы

Структура любой HTML-страница представляет собой иерархию контейнеров (которые задаются HTML-тэгами). Большой контейнер содержит в себе множество более мелких — например, таблицу, которая делится на более мелкие элементы: ряды и ячейки. Существует множество видов тегов, которые выполняют разные функции — некоторые создают контейнеры, другие оформляют таблицы, изображения или рисунки. Тэги могут иметь дополнительные свойства (например, они могут быть уникальными идентификаторами) и могут делиться на группы, называемые классами, что предоставляет возможность находить и захватывать определенные элементы в документе. Выбор необходимых элементов и извлечение их содержания играют определяющую роль в написании «скребка».

При просмотре элементов веб-страницы все ее содержимое может быть разбито на контейнеры внутри контейнеров.

Для «выскребания» веб-страниц вам необходимо узнать немного побольше о различных типах элементов, которые могут встречаться в HTML-документе. Например, элемент <table> охватывает всю таблицу, которая содержит в себе элементы <tr> (строка таблицы), которые формируют строки, а строки, в свою очередь, имеют элементы <td> (данные таблицы) для каждой ячейки. Наиболее часто вы будете сталкиваться с элементом <div>, который, по сути, обозначает какой-либо блок контента. Легче всего понять эти элементы можно, используя панель разработчика вашего браузера, которая позволит вам посмотреть, из чего состоит код, лежащий в основе той или иной части веб-страницы.

Тэги работают как разделители, обозначая начало и конец определенного блока. Например, <em> означает начало выделенного курсивом текста, а тэг </em> означает конец этого блока. Все просто.

Рис 55. The International Atomic Energy Agency’s (IAEA) portal (news.iaea.org)

Пример: сбор информации о происшествиях в ядерной отрасли с использованием кода на языке Python

NEWS — это портал Международного агентства по атомной энергии (МАГАТЭ), посвященный происшествиям в ядерной отрасли по всему миру (и являющийся уверенным кандидатом в члены Клуба роковых названий!). На этой веб-странице происшествия представлены в виде простого, похожего на блог списка, который может быть легко извлечен.

Для начала создайте новый «скребок» на языке Python на сайте ScraperWiki, в результате чего вы получите почти пустую область текста, в которой будет находиться только вспомогательный код. В другом окне откройте браузер, откройте там сайт МАГАТЭ и затем откройте в этом браузере панель разработчика. В режиме просмотра «Элементы» попытайтесь найти HTML-элементы заголовка одной из новостей. Панель разработчика браузера помогает связывать элементы веб-страницы с лежащим в их основе HTML-кодом.

Изучая эту страницу, вы поймете, что заголовки являются элементами <h4>, находящимися внутри элемента <table>. Каждое событие — это строка <tr>, которая также содержит описание и дату. Если мы хотим извлечь заголовки всех событий, мы должны найти способ, который позволит нам последовательно выбрать каждую строку таблицы и извлечь из них текст, находящийся внутри элементов, обозначающих заголовки.

Чтобы преобразовать этот процесс в код, мы должны понять для себя все все его шаги. Чтобы лучше понять, что это за этапы, давайте сыграем в простую игру. В окне ScraperWiki попробуйте написать для себя индивидуальные инструкции по каждому шагу, который вы собираетесь сделать в ходе написания этого «скребка», наподобие пунктов в кулинарном рецепте (отбейте каждую строку хэш-кодом, чтобы дать понять языку Python, что это не настоящий компьютерный код). Например:

# Просмотреть все строки в таблице
# Unicorn не должен выходить за левый край

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

Теперь, когда вы написали свой первый псевдо-код, давайте сравним его с реальным кодом нашего первого «скребка»:

import scraperwiki

from lxml import html

В этой первой части мы импортируем имеющийся функционал из библиотек — кусочки ранее написанных кодов. scraperwiki предоставит нам возможность скачивать веб-сайты, а lxml является инструментом структурного анализа HTML- документов. Хорошая новость: если вы пишете код «скребка» на языке Python с помощью сайта ScraperWiki, эти две строки всегда будут одинаковыми.

url = "http://www-news.iaea.org/EventList.aspx"

doc_text = scraperwiki.scrape(url)

doc = html.fromstring(doc_text)

Далее код вводит имя (переменную): url и в качестве его значения устанавливает URL-адрес страницы МАГАТЭ. Это говорит «скребку» о том, что такой объект существует, и что мы хотим уделить ему внимание. Обратите внимание, что URL-адрес находится в кавычках, так как он является не частью программного кода, а строкой, последовательностью символов.

Затем мы используем переменную url в качестве вводной для функции scraperwiki.scrape. Эта функция будет выполнять некую определенную работу — в данном случае она будет загружать веб-страницу. Когда эта работа будет выполнена, ее результаты будут переданы другой переменной, doc_text. doc_text теперь будет содержать актуальный текст веб-сайта — не тот, который вы видите в браузере при посещении страницы, а исходный код, включая теги. Так как осуществлять структурный анализ такого текста не совсем просто, мы используем другую функцию, html.fromstring, для создания особого представления, в котором мы можем легко находить элементы, так называемую объектную модель документа (document object model, DOM).

for row in doc.cssselect("#tblEvents tr"):

link_in_header = row.cssselect("h4 a").pop()

event_title = link_in_header.text

print event_title

На этом последнем этапе мы используем DOM для поиска каждой строки в нашей таблице и извлечения из нее заголовка события. Здесь используются две новые концепции: петля и выбор элементов (.cssselect). Петля делает то, что и подразумевается ее названием: она обходит список блоков, назначая каждому из них временное имя (в данном случае это строки) и затем выполняет для каждого из них намеченные действия.

Вторая новая концепция, выбор элементов, использует специальный язык для поиска элементов в документе. Для добавления к HTML-элементам информации о их расположении обычно используются CSS-селекторы, и их же можно использовать для точного отбора этих элементов на странице. В данном случае (строка 6) мы выбираем #tblEvents tr, вследствие чего каждый тэг <tr> в элементе таблицы будет сопоставляться с ID tblEvents (хэш здесь просто обозначает ID). В результате мы получим список элементов <tr>.

То же мы наблюдаем и в следующей строке (строка 7), в которой мы применяем другой селектор для поиска всех тэгов <a> (обозначающих гиперссылку) внутри <h4> (заголовок). Здесь мы хотим искать только один элемент (в каждой строке имеется только один заголовок), поэтому мы должны извлечь его из вершины списка, созданного нашим селектором с помощью функции .pop().

Обратите внимание, что некоторые элементы в DOM содержат настоящий текст, т. е. текст, не являющийся частью языка разметки, который мы можем извлечь, воспользовавшись кодом [element].text, размещенным в строке 8. И, наконец, в строке 9 мы направляем этот текст в консоль ScraperWiki. Если вы теперь запустите ваш «скребок», то в меньшем по размеру окошке начнут появляться названия событий с сайта МАГАТЭ.

Рис 56. A scraper in action (ScraperWiki)

Вы видите работу простейшего «скребка»: он загружает веб-страницу, преобразует ее в DOM и затем предоставляет вам возможность выбирать и извлекать определенные элементы. На основе данного шаблона вы можете попробовать решить остальные вопросы, используя документацию ScraperWiki и языка Python:

  • Можно ли найти адрес ссылки, находящейся в заголовке каждого события?

  • Можно ли выбрать небольшой контейнер, который содержит дату и место, используя CSS-имя его класса, и затем извлечь текст этого элемента?

  • ScraperWiki предлагает небольшую базу данных для каждого «скребка», в которую вы можете сохранить ваши результаты (код), скопируйте соответствующий пример из документов ScraperWiki и адаптируйте его так, чтобы он сохранял названия, ссылки и даты событий.

  • Список событий включает в себя много страниц, можно ли осуществить наш поиск по всем страницам, чтобы получить информацию и о старых событиях?

Когда вы будете решать эти проблемы, изучите ScraperWiki: в имеющихся на этом ресурсе «скребках» можно найти много полезных примеров, а зачастую и довольно интересных данных. Таким образом, вам не обязательно создавать свой «скребок» с нуля: просто выберите подходящий и адаптируйте его под свои задачи.

Фридрих Линденберг, Open Knowledge Foundation