Часто виникає завдання періодично парсити який-небудь сайт на наявність нової інформації. Наприклад, якщо ти пишеш агрегатор контенту з новинного сайту або форуму, в якому немає підтримки RSS. Найпростіше написати скрепер на Python і розібрати отриманий HTML через beautifulsoup або регулярки. Однак є більш елегантний спосіб - самому зробити відсутні API для сайту і отримувати відповіді в звичному JSON, як ніби-то у сайту є нативний API.
Не будемо далеко ходити за прикладом і напишемо парсер контенту з сайту відомого журналу. Як ти знаєш, сайти не зараз не надає ніякого API для програмного отримання статей, крім RSS. Однак RSS не завжди зручний, та й видає далеко не всю потрібну інформацію. Виправимо це!
ПОСТАНОВКА ЗАДАЧІ
Фреймворк для парсером WEB САЙТІВ
WrapAPI - це досить новий (пара місяців від роду) сервіс для побудови потужних кастомних парсеров інтернету і надання до них доступу по API. Не лякайся, якщо нічого не зрозумів, зараз поясню на пальцях. Працює так:
Трохи про приватності запитів
Ти напевно вже задумався про те, наскільки безпечно використовувати чужий сервіс і передавати йому параметри своїх запитів з приватними даними. Тим більше що за замовчуванням для кожного нового API-проекту буде створюватися публічний репозиторій і запускати API з нього зможе будь-хто. Не все так погано:
1. Кожен API-репозиторій (а відповідно, і всі API-запити в ньому) можна зробити приватним. Вони не будуть показуватися в загальному списку вже створених API на платформі WrapAPI. Просто вибери досить складне ім'я сховища, і шанс, що на нього хтось забреде випадково, зведеться до мінімуму.
2. Будь-який запит до WrapAPI вимагає спеціального токена, який потрібно отримати в своїй учетке WrapAPI. Тобто просто так дізнатися URL до твого сховища і тягати через
ПРИГОТУВАННЯ
Кілька простих кроків перед початком.
1. Йдемо на сайт WrapAPI, створюємо нову учетку і логіном в неї.
2. Встановлюємо розширення для Chrome (підійде будь-який Chromium-based браузер), відкриваємо консоль розробника і бачимо нову вкладку WrapAPI. 3. Переходимо на неї і логіном.
Це розширення нам знадобиться для того, щоб перехоплювати запити, які ми збираємося емулювати, і швидко направляти їх в WrapAPI для подальшої роботи. За логікою роботи це розширення дуже схоже на в'язку Burp Proxy + Burp Intruder.
відловлювати ЗАПИТИ
Тепер потрібно вказати WrapAPI, який HTTP-запит ми будемо використовувати для побудови нашого API. Йдемо на сайт «Хакера» і відкриваємо консоль розробника, переключившись на вкладку WrapAPI.
конфігуруємо WRAPAPI
Переходь на вкладку Inputs and request. Тут нам знадобиться вказати, з якими параметрами WrapAPI повинен парсити запитувану сторінку, щоб сервер віддав йому валідний відповідь.
Заголовки запиту нижче можна не чіпати, я використовував стандартні з Chromium. Якщо Парс не "Хакер», а дані з якого-небудь закритого сервера, можеш підставити туди потрібні куки, хедери, basic-auth і все, що потрібно. Одним словом, ти зможеш налаштувати свій запит так, щоб сервер без жодних підозр віддав тобі контент.
ВЧИМО WRAPAPI бракує фічам
Тепер потрібно вказати WrapAPI, як обробляти отриманий результат і в якому вигляді його представляти. Переходь на наступну вкладку - Outputs and response.
Невеликий глосарій, перш ніж йти далі:
- Output - фільтр-постпроцесор контенту, який приймає на входесирой відповідь сервера, а повертає вже модифікований за заданими правилами. Вони бувають декількох типів. Самі часто використовувані:
- JSON вибирає вміст зазначеного атрибута, який поданий на вхід JSON-об'єкта, і повертає його значення як рядок;
- CSS вибирає елементи DOM за вказаною CSS-селектору (наприклад, ID або класу) і повертає їх значення, атрибут або весь HTML-тег цілком. Може повернути як один рядок, так і масив знайдених входжень;
- Regular expression вибирає входження по регулярному виразу, в іншому той же, що і попередній output;
- HTTP Header вибирає значення HTTP-заголовка відповіді сервера і повертає його рядком;
- Cookie вибирає значення Cookie, отриманої у відповіді від сервера, і повертає його рядком.
- Output Scenario - набір аутпут, які об'єднані в одну або кілька паралельних ланцюжків. По суті - майже весь набір препроцесорів, які перетворюють серверний відповідь в потрібний нам формат.
- Test case - збережений відповідь сервера, на якому тестуються обробники і підбирається потрібна ланцюжок аутпут.
Створи новий test case, збережи його під ім'ям page1. Тепер подивися, що повернув сервер. Це повинен бути об'єкт JSON, одне з полів якого містить шматок HTTP-розмітки з перерахуванням запитаних постів.