В этой первой части мы импортируем имеющийся функционал из библиотек — кусочки ранее написанных кодов. 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, вследствие чего каждый тэг
То же мы наблюдаем и в следующей строке (строка 7), в которой мы применяем другой селектор для поиска всех тэгов (обозначающих гиперссылку) внутри (заголовок). Здесь мы хотим искать только один элемент (в каждой строке имеется только один заголовок), поэтому мы должны извлечь его из вершины списка, созданного нашим селектором с помощью функции .pop.
Обратите внимание, что некоторые элементы в DOM содержат настоящий текст, т. е. текст, не являющийся частью языка разметки, который мы можем извлечь, воспользовавшись кодом [element].text, размещенным в строке 8. И, наконец, в строке 9 мы направляем этот текст в консоль ScraperWiki. Если вы теперь запустите ваш «скребок», то в меньшем по размеру окошке начнут появляться названия событий с сайта МАГАТЭ.
Рис 56. A scraper in action (ScraperWiki)
Вы видите работу простейшего «скребка»: он загружает веб–страницу, преобразует ее в DOM и затем предоставляет вам возможность выбирать и извлекать определенные элементы. На основе данного шаблона вы можете попробовать решить остальные вопросы, используя документацию ScraperWiki и языка Python:
Можно ли найти адрес ссылки, находящейся в заголовке каждого события?
Можно ли выбрать небольшой контейнер, который содержит дату и место, используя CSS–имя его класса, и затем извлечь текст этого элемента?
ScraperWiki предлагает небольшую базу данных для каждого «скребка», в которую вы можете сохранить ваши результаты (код), скопируйте соответствующий пример из документов ScraperWiki и адаптируйте его так, чтобы он сохранял названия, ссылки и даты событий.
Список событий включает в себя много страниц, можно ли осуществить наш поиск по всем страницам, чтобы получить информацию и о старых событиях?
Когда вы будете решать эти проблемы, изучите ScraperWiki: в имеющихся на этом ресурсе «скребках» можно найти много полезных примеров, а зачастую и довольно интересных данных. Таким образом, вам не обязательно создавать свой «скребок» с нуля: просто выберите подходящий и адаптируйте его под свои задачи.
—