Пособие по журналистике данных
Шрифт:
# Просмотреть все строки в таблице
# 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)
Вы видите работу простейшего «скребка»: он загружает веб–страницу,
Можно ли найти адрес ссылки, находящейся в заголовке каждого события?
Можно ли выбрать небольшой контейнер, который содержит дату и место, используя CSS–имя его класса, и затем извлечь текст этого элемента?
ScraperWiki предлагает небольшую базу данных для каждого «скребка», в которую вы можете сохранить ваши результаты (код), скопируйте соответствующий пример из документов ScraperWiki и адаптируйте его так, чтобы он сохранял названия, ссылки и даты событий.
Список событий включает в себя много страниц, можно ли осуществить наш поиск по всем страницам, чтобы получить информацию и о старых событиях?
Когда вы будете решать эти проблемы, изучите ScraperWiki: в имеющихся на этом ресурсе «скребках» можно найти много полезных примеров, а зачастую и довольно интересных данных. Таким образом, вам не обязательно создавать свой «скребок» с нуля: просто выберите подходящий и адаптируйте его под свои задачи.
— Фридрих Линденберг, Open Knowledge Foundation
Сеть как источник данных
Как можно узнать больше о том, что существует только в Интернете? Будь то адрес электронной почты, веб–сайт, изображение или статья в Википедии — в данной главе я расскажу вам об инструментах, которые помогут вам получить больше информации об этих элементах.
Веб–инструменты
Для начала назовем некоторые сервисы, с помощью которых можно узнать больше информации о веб–сайтах в целом.
Whois
Если вы посетите сайт whois.domaintools.com(или просто введете whois www.example.comв приложении Terminal.app, если вы работаете на компьютере Mac), вы получите базовую регистрационную информацию практически о любом сайте. В последние годы некоторые владельцы выбирают «приватную» регистрацию, которая не позволяет просматривать их данные, однако в большинстве случаев вы увидите имя, адрес, электронную почту и номер телефона лица, зарегистрировавшего сайт. Вы также можете ввести цифровой IP–адрес и получить данные об организации или физическом лице, являющихся владельцами этого сервера. Это особенно удобно, когда вы пытаетесь получить больше информации о лицах, которые, например, нарушают условия пользования каким–либо сервисом, так как большая часть веб–сайтов регистрирует IP–адрес своих посетителей.
Blekko
Поисковый движок Blekkoпредлагает необычно большой объем информации о внутренней статистике, которую он собирает в Интернете. Если вы введете доменное имя, и дополните его сочетанием «/seo», вы получите страницу с информацией об этом адресе. В первой табличке на Рис 57показано, какие другие сайты ссылаются на данный домен (в порядке популярности). Это может оказаться полезным, когда вы хотите понять, какое освещение получает сайт, и если вы хотите понять, почему он занимает высокие места в результатах поиска Google, так как эти результаты основываются именно на этих ведущих на сайт ссылках. Рис 59показывает, какие другие сайты размещаются на той же машине. Мошенники и спамеры нередко придают законный вид своей деятельности, создавая многочисленные сайты, которые ссылаются друг на друга. Внешне они выглядят как независимые домены и могут даже иметь разные регистрационные данные, однако зачастую они размещаются на одном и том же сервере, так как это значительно дешевле. Эта статистика позволит вам заглянуть внутрь скрытой бизнес–структуры исследуемого вами сайта.