GrabDuck: Як ми робимо статті з закладок

Вітаємо тебе читач. Не так давно на нашому сервісі GrabDuck з'явився новий парсер/екстрактор статей. Між собою ми називаємо його GrabDuck Article Extractor 2.0 або скорочено GAE 2.0. Чому так голосно? Справа в тому, змін і вдосконалень накопичилося стільки, що нам довелося повністю викинути старий, з яким ми жили останні півтора року і створити новий парсер статей «з нуля». І так, для нас це велика і важлива зміна. Що нам не подобалося і що ми зробили в результаті описано під катом.



Отже, ми довго жили зі старим парсером, узятим з боку у вигляді форк від якогось open source проекту. Так, він був хорошим і намагався виконувати свою роботу на всі 100 (де-то в одній із перших статей ми давали посилання на нього — якщо цікаво, подивіться). І для тих, чиї вимоги не перевищують середньостатистичних, ми як і раніше його рекомендуємо до використання — він точно впоратися.



Але згодом усе частіше стали наштовхуватися на різні обмеження. Сайти у нас, як відомо, зберігають всякі, досі трапляється жахливе спадщина 2000х, коли і стандартів особливих не було. Вообщем, тут наша бібліотека давала збій і доводилося все більше лізти в чужий код і правити «під себе». З часом, мабуть основною претензією стало те, що бібліотека була як швейцарський ніж, хороша, але все робила сама: завантажуватиме документ по url, відстежувала редиректи, вміла розшифровувати різні скорочувачі посилань, намагалася визначити кодування, навіть якщо вона не була явно задана, парсила документ, визначала зображення і навіть намагалася зрозуміти дату, коли стаття опублікована. Вообщем не бібліотека, а казка… Правда, до тих пір, поки не було потрібно щось виправити або трохи поміняти. І ми часто стояли перед вибором: або правити код напряму, або, після обробки документа, проводити ще одну, свою власну, природно дублюючи місцями якусь логіку від нашого оригінального парсера. І це рішення було непростим — творець цієї самої open source бібліотеки явно не був фанатом тестування і тому все працювало рівно до моменту поки не чіпали і не вносили істотних змін в код.

А враховуючи, що сам процес парсинга і вилучення статей, для тих, хто ніколи з цим не стикався, покладається цілком на статистику, а не на чіткі критерії, досить було трохи змінити ваги застосовуваної статистичної моделі, і ми ризикували відразу, що одного разу, якісь класи сайтів просто перестануть оброблятися коректно. Адже загального формату немає- вся стаття, це просто великий шматок html, в якому десь всередині є кілька параграфів так необхідного нам тексту. Так що з часом у нас з'явився наш паралельний світ, коли вже оброблена і, здавалося б, вже підготовлена стаття ще раз прогонялась, але вже через наш власний недо-парсер.

Як ця open source бібліотека працювала в многопотоковом режимі була окрема і дуже сумна пісня. І спочатку на великих импортах, коли рахунок йшов на десятки тисяч закладок стоять одночасно в черзі на обробку, все в нашому королівстві просто завмирало.

І це був для нас урок номер 1: коли будуєте свою систему, використовуйте незалежні компоненти — цеглинки. І саме з них збирайте те, що потрібно вам. Якщо щось піде не так, або з'явитися новий цікавий проект, який виконує роботу краще, завжди можна відключити старе і спробувати нове, не ламаючи систему і не ризикуючи, що всі рассыпиться на якомусь етапі. А тут, вже повірте нашому досвіду, якщо щось у світі чисел може піти не так, воно обов'язково піде не так і майже відразу.

Так що в кінці ми вирішили — все, вистачить, пора брати контроль в свої руки і писати щось наше, під наші вимоги і за що задовольняє нас якістю. Так і з'явився на нашій архітектурної діаграмі новий компонент — GAE 2.0.
Перш за все хотілося побудувати його у вигляді збіговиська незалежних компонентів. Для якихось кроків нам була потрібна паралельна обробка за принципом, чим більше, тим краще, де можна було обійтися і одним потоком, а де-то ми хотіли прискоритися распараллелив роботу, але були серйозні обмеження на кількість одночасно оброблюваних елементів.

В результаті вимальовувався такий собі конвеєр або pipeline, де кожна закладка перетворюється в повноцінну статтю, з кожним кроком наповнюючись значущими для користувача даними.



Отже, які ж кроки нам необхідно зробити, щоб із заслання зробити повноцінну статтю, яку вже можна показати користувачеві?

Після роздумів, зони відповідальності вийшли такі: Власне сам Url Fetcher. Відповідає за безпосередню завантаження статті за наданим Url. Повинен розуміти всілякі редиректи, вміти працювати через SSL і з сокращателями посилань. І ще його потрібно параллелить, адже саме очікування відповіді від сервера займає роки комп'ютерного часу і з цим потрібно щось робити. Але і стратегія чим більше, тим краще, тут теж не підходить: будемо бомбардувати один і той же сайт запитами і нас просто банально забанять. Значить потрібен якийсь оптимум, що називається і нашим і вашим.

Отриманий результат необхідно перевірити на помилки, а ще він може бути дублікатом вже існуючої на GrabDuck статті, і тоді достатньо всього лише прив'язати до цієї існуючої статті нового користувача.

І тільки після цього настає час для вилучення даних і підготовки фінальної статті, яку і будемо показувати нашим користувачам. Що сюди входить? Отримання мета-інформації, а це заголовки, зображення, розрахунок тегів і мови документа. Звичайно ж нам необхідний сам контент для повнотекстового пошуку, також необхідно згенерувати текстовим фрагментом, коротко представляє сам документ.

Після цього документ готовий до використання і доступний для пошуку на GrabDuck.

Отже новий парсер готовий і ура все нові закладки вже підуть через нього і ми нарешті отримаємо, що хотіли! Але велике питання, який може виникнути у читача: а що буде з існуючими закладками? Адже вони були ВЖЕ оброблені і ВЖЕ збережені в системі! Невже вони так і залишаться недоторканими? І наша відповідь — ні! Насамперед, у користувача завжди є можливість вибрати закладку і примусово оновити її. Для цього досить вибрати відповідний пункт з контекстного меню. Виглядає це як то так.



Ну або просто трохи почекати. Одна з чудових особливостей GrabDuck полягає в тому, що ми проводимо періодичну перевірку всіх закладок: а чи все в порядку, чи живі досі сайти, не з'явилося на сторінці нових коментарів і т. п. Так що рано чи пізно, ваші закладки потраплять на оновлення і пройдуть через GAE 2.0.

На сьогодні це все, що ми хотіли вам розповісти. Залишайте свої коментарі та до зустрічі.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.