Ви перепробували все що могли, але не спромоглися отримати потрібні вам дані. Ви знайшли ці дані в Інтернеті, але, на жаль, нема можливості їх завантажити, а операція «скопіювати/вставити» не спрацювала. Нічого страшного, є й інші способи вилучення даних. Наприклад, ви можете:
• Отримати дані з веб-орієнтованих інтерфейсів прикладних програм (API) – таких як інтерфейси онлайнових баз даних та багатьох сучасних веб-програм (включно з Твіттером, Фейсбуком та багатьома іншими). Це фантастичний спосіб доступу до урядових чи комерційних даних, так само як і до даних із сайтів соціальних медіа.
• Вилучити дані з PDF-файлів. Це дуже складно, тому що PDF – це мова опису сторінок, призначена для принтерів, і вона не подає багато інформації про структуру даних у самому документі. Вилучення інформації з PDF не входить до тем цієї книги, але існують інструменти та посібники, спроможні допомогти вам у цьому.
• Вилучити дані з екранів веб-сайтів (скрин-скрейпінг, screen scraping – прим.). Під час скрин-скрейпінгу ви вилучаєте структурований контент із звичайної веб-сторінки або за допомогою програми-утиліти, або написавши невелику за обсягом програму. Попри те, що цей метод є дуже потужним і широко застосовується, він вимагає певного розуміння того, як працює веб.
При наявності всіх цих передових технічних можливостей не слід забувати про прості варіанти: часом є сенс витратити трохи часу на пошук файла з даними, придатними для машинного зчитування, або зателефонувати в установу, де є потрібні вам дані.
В цьому розділі ми розглянемо дуже простий приклад вилучення даних з веб-сторінки у форматі HTML.
Що таке дані, придатні для машинного зчитування?
Мета більшості цих методик – отримати доступ до даних, придатних для машинного зчитування. Ці дані створені для обробки на комп’ютері, а не для представлення користувачеві-людині. Структура цих даних пов’язана з інформацією, що в них міститься, а не з остаточною формою представлення цих даних. Приклади даних, що придатні для машинної обробки – це файли в форматі CSV, XML, JSON та Excel, тоді як формати на зразок документів Word, сторінок HTML та PDF більше зосереджені на візуальному представленні інформації. PDF, наприклад, це мова, яка безпосередньо адресована вашому принтеру, вона відображує розташування ліній та точок на сторінці, а не окремих символів.
Скрейпінг веб-сайтів: навіщо?
Всі це колись робили: ви заходите на веб-сайт, бачите цікаву таблицю і намагаєтеся скопіювати її до таблиці Excel, щоб ви могли додати до неї якісь цифри або зберегти її на потім. Але часто це не спрацьовує так як треба, або ж інформація, якої ви потребуєте, розкидана по великій кількості веб-сайтів. Копіювання вручну часто стає дуже марудним, тож є сенс написати трохи програмного коду, який це зробить за вас.
Перевага скрейпінгу в тому, що ви можете робити це з буквально будь-яким веб-сайтом – від сайтів з прогнозом погоди до сайтів з урядовими витратами, навіть якщо ці сайти не мають інтерфейсу API для доступу до «сирих» даних.
Що можна вилучити, а що ні
Звісно, у скрейпінгу є обмеження. Ось деякі фактори, що ускладнюють це завдання:
• Погано відформатований HTML-код, з малою кількістю структурованої інформації або взагалі без неї. Наприклад, старі урядові веб-сайти.
• Системи автентифікації користувачів, мета яких – перешкодити автоматичному доступу. Наприклад, системи кодів CAPTCHA або системи платного доступу.
• Системи, що працюють в режимі сесій і використовують куки (cookies) браузера, щоб стежити за тим, що робить користувач.
• Відсутність повних списків даних та можливостей для пошуку за груповими (шаблонними ) символами.
• Блокування системними адміністраторами доступу до масиву даних.
Ще один набір обмежень – це законодавчі бар’єри: у деяких країнах існують авторські права на бази даних, які можуть обмежити ваше право на повторне використання опублікованої в онлайні інформації. Іноді ви можете прийняти рішення ігнорувати цю ліцензію і все одно робити своє – залежно від вашого законодавства, у вас можуть бути на це особливі права як у журналіста. Скрейпінг урядових сайтів з вільним доступом не становить проблем, але перед публікацією варто все ретельно перевірити. Комерційні організації – та певні неурядові організації – реагують менш толерантно і можуть спробувати заявити, що ви «шкодите» їхнім системам. Інша інформація може зачіпати права на захист приватності осіб і тому порушувати законодавство про приватність даних або про професійну етику.
Інструменти, які допоможуть вам вилучати дані
Існує багато програм, які можна використати для вилучення масивів даних із веб-сайтів, зокрема, розширення до браузерів та деякі веб-сервіси. Залежно від вашого браузеру, інструменти на зразок Readability (допомагає вилучати текст із веб-сторінки) абоDownThemAll (дає змогу завантажити багато файлів за один раз) можуть стати в пригоді під час автоматизації деяких марудних завдань. Розширення Scraper до браузера Chrome було створене спеціально для вилучення таблиць із веб-сайтів. Орієнтовані на розробників розширення на зразок FireBug (для браузера Firefox, аналогічні вже входять до складу браузерів Chrome, Safari та IE) дають вам змогу точно відстежувати, як структурований веб-сайт і які комунікації відбуваються між вашим браузером та сервером.
ScraperWiki – це веб-сайт, який дозволяє вам кодувати програми-скрейпери на різних мовах програмвання, включно з Python, Ruby та PHP. Якщо ви хочете почати скрейпінг без клопотів із встановленням відповідного програмного оточення на вашому комп’ютері, це саме цей спосіб. Інші веб-сервіси, такі як Google Spreadsheets та Yahoo! Pipes, також дозволяють вам здійснювати певне вилучення інформації з інших веб-сайтів.
Як працює веб-скрейпер?
Веб-скрейпери – це зазвичай маленький за об’ємом код, написаний на мові програмування, такій як Python, Ruby чи PHP. Обрання правильної мови – це загалом питання, пов’язане із тією спільнотою, до якої у вас є доступ: якщо у вашій редакції чи місті є хтось, хто вже використовує одну зі вказаних мов, тоді є сенс застосувати саме її.
Хоч деякі зі згаданих вище інструментів скрейпінгу, що працюють по принципу «виділення мишкою», можуть стати в пригоді на початку, реальна складність із скрейпінгом веб-сайту – це звернення до потрібних сторінок та потрібних елементів на цих сторінках з метою вилучення потрібної інформації. Це завдання стосується не програмування, а радше розуміння структури веб-сайту та бази даних.
Показуючи веб-сайт, ваш браузер майже завжди використовує одну з двох технологій: протокол http є способом зв’язку із сервером та запитів про специфічні ресурси, такі як документи, зображення чи відео. HTML – це мова, за допомогою якої скомпоновані веб-сайти.
Анатомія веб-сторінки
Будь-яка HTML-сторінка структурована як ієрархія компонентів (які у HTML визначаються як теги (“tags”)). Великий компонент може включати значне число менших – наприклад, таблиця має багато менших елементів: рядки та колонки. Є багато типів тегів, що виконують різні функції – деякі створюють клітини, інші – таблиці, зображення чи лінки. Теги також можуть мати додаткові властивості (тобто, бути унікальними ідентифікаторами), і можуть належати до груп під назвою «класи», що дає змогу визначати та вилучати індивідуальні елементи у документі. Пошук відповідних елементів у такий спосіб та вилучення їхнього змісту – це ключ до написання програми-скрейпера.
Перегляд елементів веб-сторінки: все можна розкласти на «клітини», що входять до складу інших «клітин».
Для того, щоб вилучати інформацію з веб-сторінок, вам треба дещо знати про різні типи елементів, які можуть бути в HTML документі. Наприклад, елемент table обрамляє всю таблицю, у якій є елементи tr (table row, рядок таблиці) для рядків, а ті, в свою чергу, містять елемент td (table data, дані таблиці) для кожної клітини. Найпоширеніший тип елемента, який вам трапиться, - це div, який може означати буквально будь-який блок контенту. Найпростіший спосіб отримати відчуття цих елементів – це використатипанель інструментів веб-розробника у вашому браузері: вони дадуть вам змогу «зависати» над будь-якою частиною веб-сторінки і бачити, як виглядає код, що відповідає за цю частину.
Теги працюють як закладки, позначаючи початок та кінець блока. Наприклад, тег em i позначає частину тексту, виділеного курсивом, а /i /em позначає кінець цієї секції. Все просто.
Ілюстрація 57. Портал Міжнародної агенції з атомної енергії, IAEA (news.iaea.org)
Приклад: вилучення даних про атомні інциденти за допомогою мови програмування Python
Портал Міжнародної агенції з атомної енергії, присвячений радіаційним інцидентам в усьому світі, має назву NEWS (і ця назва є потужним претендентом на членство в Клубі Дивних Назв!). Веб-сторінка подає списки інцидентів у простому, схожому на блог стилі, який легко піддається скрейпінгу.
Для початку, створіть новий скрейпер мовою Python на ScraperWiki, і ви отримаєте текстову область, яка загалом порожня, за винятком деякого «шаблонного» коду. В іншому вікні браузера відкрийте сайт IAEA та увімкніть панель інструментів веб-розробника у вашому браузері. У режимі перегляду “Elements” (елементи) спробуйте знайти HTML-елементи, які позначають один із заголовків новин. Панель інструментів розробника у вашому браузері допоможе вам пов’язати елементи на веб-сторінці з HTML-кодом, який відповідає цим елементам.
Дослідження цієї сторінки покаже, що заголовки позначені елементами h4 в межах тегу table. Кожна подія – це рядок, позначений тегом
, який також містить опис та дату. Якщо ми хочемо вилучити заголовки всіх інцидентів, нам треба знайти спосіб почергово виділяти кожен рядок у колонці і брати з нього весь текст, що міститься в елементах заголовка.
Щоб перетворити цей процес у код, нам слід усвідомити всі потрібні для цього кроки. Відчути ці необхідні кроки можна за допомогою простої гри: у вікні вашої ScraperWiki спробуйте написати окремі інструкції для себе, для кожної операції, яку ви збираєтеся виконати під час створення цього скрепера, подібно до інструкцій в кулінарному рецепті (на початку кожного рядка ставте символ «хеш» (#), щоб повідомити Python про те, що це не справжній комп’ютерний код. Наприклад:
# Переглянути всі рядки в таблиці
Намагайтеся бути настільки точними, наскільки це можливо, і не думайте, що програма знає хоч щось про сторінку, з якої ви збираєтеся вилучати інформацію.
Якщо ви написали цей псевдо-код, давайте порівняємо його з дійсним кодом нашого першого скрейпера:
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, і цій змінній в якості значення присвоюється інтернет-адреса веб-сторінки IAEA. Це повідомляє скрейперу, що така сторінка існує і ми збираємося присвятити їй увагу. Зверніть увагу, що інтернет-адреса сама по собі вказана в лапках, бо це не частина програмного коду, а текстовий рядок, послідовність символів.
Після цього ми використовуємо змінну під назвою url як параметр, що передається до функції scraperwiki.scrape. Ця функція виконає певну визначену роботу – в даному випадку, вона завантажить веб-сторінку. Коли ця операція завершена, результат буде присвоєно іншій змінній, doc_text. Ця змінна doc_text тепер міститиме весь текст веб-сайта – не у візуальній формі, яку ви бачите у вашому браузері, а як початковий код, включно з усіма тегами. Оскільки таку форму представлення не дуже просто розбирати на складові, ми використаємо ще одну функцію, html.fromstring, щоб згенерувати особливу форму представлення, де ми можемо легко звертатися до елементів, так звану об’єктну модель документа (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, щоб знайти кожен рядок у нашій таблиці і вилучити з її заголовка назву інциденту. Тут застосовані два нові концепти – оператор циклу for та елемент вибірки (.cssselect). Оператор циклу for виконує те, що зрозуміло з його назви; він по черзі обходить список елементів, присвоюючи кожному тимчасовий псевдонім (у цьому випадку – row), і після цього виконує для кожного елемента список інструкцій.
Інший новий концепт, елемент під назвою selection, застосовує спеціальну мову для пошуку елементів у документі. Т.зв. селектори CSS (каскадних стилів документа) зазвичай застосовуються для того, щоб додавати інформацію про формат до HTML-елементів, і їх можна використати для того, щоб точно вилучити певний елемент із веб-сторінки. У цьому випадку (рядок 6) ми обираємо #tblEvents tr, який відповідає кожному тегові tr у елементі table з ідентифікатором (ID) tblEvents (хеш-символ # просто позначає ID). Зверніть увагу, що це видасть список елементів tr.
Як видно з наступного рядка (рядок 7), ми застосовуємо новий селектор, щоб знайти будь-які теги a (які позначають гіперлінк) у тегах (заголовок). Та нам потрібен лише один елемент (є лише один заголовок у рядку), тому нам слід взяти його з вершини списку, який видасть наш селектор, за допомогою функції .pop().
Зверніть увагу, що деякі елементи у DOM містять звичайний текст, тобто, текст, який не є частиною мови розмітки сторінок, і ми можемо отримати доступ до нього за допомогою виразу [element].text (рядок 8). І насамкінець, у рядку 9 ми друкуємо цей текст у консоль ScraperWiki. Якщо ви натиснете «пуск» у вашому скрейпері, у меншому вікні почергово будуть з’являтися назви атомних інцидентів, отримані з веб-сайту IAEA.
Ілюстрація 58. Скрейпер у роботі (ScraperWiki)
Тепер ви бачите, як діє простий скрейпер: він завантажує веб-сторінку, перетворює її у формат DOM, і після цього дає вам змогу вибирати та вилучати певні елементи змісту. Маючи цей шаблон, ви можете спробувати знайти вирішення деяких інших проблем, використовуючи документацію по ScraperWiki та Python:
• Чи можете ви знайти адресу лінка у заголовку кожного інциденту?
• Чи можете ви вибрати клітину, де міститься дата та місце інциденту, використавши назву CSS класу цієї клітини та вилучивши текст із цього елемента?
• ScraperWiki надає невелику базу даних до кожного скрейпера, щоб ви могли зберегти в ній результати; скопіюйте відповідний приклад з їхньої документації та змініть його так, щоб він зберігав назву інцидентів, лінки та дати.
• У списку подій є багато сторінок; чи можете ви вилучити інформацію з декількох сторінок, щоб отримати також і минулі інциденти?
Коли ви будете шукати вирішення цих завдань, ознайомтеся із ScraperWiki: тем є багато корисних зразків у вже існуючих скреперах – і досить часто отримані дані також заслуговують на увагу. Таким чином, вам не треба буде починати ваш скрейпер «з чистого аркуша»: просто оберіть подібний, модифікуйте його та адаптуйте до вашої проблеми.
Фридрих Лінденберг, фундація Open Knowledge
Достарыңызбен бөлісу: |