Эта запись в блоге изначально была опубликована в моем блоге
Сегодня мы изучим, как создать веб-сервис, способный очищать Интернет.
Некоторые требования могут быть:
- Возможность извлекать данные из DOM и возвращать их,
- Возможность сделать некоторый условный просмотр,
- Возможность создать задание с параметрами,
- Возможность получить результат этой трудоемкой работы.
Стек опирается на большую классику:
- NodeJS
- Гит
- КошмарJS
Для последнего: 2 года назад я пробовал SpookyJS, но нашел его довольно сложным. Spooky сейчас не так активен, и в качестве замены есть отличный NightmareJS: он позволяет нам управлять безголовым браузером простым, интуитивно понятным способом.
Сайт, который мы будем парсить
Мы очистим одно из самых высокотехнологичных приложений ИИ за всю историю: ask-the-dude https://bdavidxyz.github.io/ask-the-dude/
Мы можем задать чуваку любой вопрос:
Чуваку нужно время, чтобы ответить.
Он ответит в каждом случае.
Ответ может варьироваться в зависимости от вопроса
Если вы забудете завершающий «?», у вас не будет ответа, но в этом случае чувак дает вам возможность отобразить случайную цитату.
Довольно невероятно, не так ли?
Плохая новость
К сожалению, неблагородный программист не выпустил ни одного API «чувака».
Это означает, что вы не можете получить доступ к «чуваку» программно. Единственный способ получить этот API — создать веб-сервис, который очищает «чувака».
API, который мы создадим
POST /ask : задайте вопрос чуваку. Вопрос в теле запроса. API отвечает «ОК», чтобы подтвердить вопрос, но не может сразу ответить (помните, что чуваку может потребоваться время, чтобы обдумать ваш вопрос и правильно ответить).
GET /get-answer-to?q= : вы можете использовать эту конечную точку через несколько секунд после POST : вы получите ответ на вопрос, соответствующий параметру q.
GET /all-questions: отобразить все уже заданные вопросы с соответствующими ответами.
Быстрый старт
$> node --version v6.9.5 $> git --version git version 2.7.2 $> git clone [email protected]:bdavidxyz/web-scraping-as-a-service.git $> cd web-scraping-as-a-service $> npm install $> npm start
Хорошо ! Наш сервис готов к тестированию. Вы можете открыть его по адресу http://localhost:5000/, должно быть напечатано приветственное сообщение, если все установлено правильно.
- Откройте Chrome
- Откройте http://code.jquery.com/, — мы будем использовать простой код jQuery для тестирования нашего сервиса.
- Откройте консоль оттуда (cmd+alt+i для пользователей Mac, f12 для пользователей Windows)
- Скопируйте/вставьте следующие фрагменты кода
var a = $.ajax({ type: "POST", url: "http://localhost:5000/ask", data: {question:'Do you like butter ?'}, success: function(e){console.log(e);} });
Должно быть напечатано «ОК». Подождите несколько секунд, затем
var a = $.ajax({ type: "GET", url: "http://localhost:5000/get-answer-for?q=Do you like butter ?", success: function(e){console.log(e);} });
У вас должен быть ответ на вопрос.
Попробуйте сейчас получить ответ на вопрос, который вы никогда не задавали:
var a = $.ajax({ type: "GET", url: "http://localhost:5000/get-answer-for?q=WTF ?", success: function(e){console.log(e);} });
Вы можете распечатать все вопросы
var a = $.ajax({ type: "GET", url: "http://localhost:5000/all-questions", success: function(e){console.log(e);} });
Код
Задайте вопрос
Соответствующая часть находится здесь: https://github.com/bdavidxyz/web-scraping-as-a-service/blob/master/index.js#L24-L69
Обратите внимание, что NightmareJS довольно интуитивно понятен: вы можете легко связать основные инструкции. Однако знаменитого кошмара JS-пирамиды (кхм) нельзя полностью избежать: как только вы начинаете оценивать что-либо на странице, результат этой оценки заворачивается в обещание.
Вы должны быть очень осторожны с этими 3 вещами:
- не забудьте завершить свой кошмарный экземпляр, как только вы его использовали.
- не забывайте ключевое слово return перед экземпляром кошмара внутри промиса, иначе цепочка промисов не произойдет.
- не забывайте повторно создавать экземпляр NightmareJS при каждом запросе.
Обратите внимание, что в этом примере вы можете добиться условного просмотра: на основе результата первой оценки вы можете повторно использовать экземпляр кошмара и снова очистить веб-страницу.
Другие части
Здорово ! Кто может больше, тот может меньше.
Две другие конечные точки /get-answer-to?q= и /all-questions не используют NightmareJS, они являются простыми конечными точками ExpressJS с самоописанием.
Заключительные мысли
У нас сейчас:
- Совершенно бесплатный способ очистить любой веб-сайт бесплатно,
- Способ APIfy любого веб-сайта, который недоступен никаким другим способом, кроме веб-браузера,
- Способ создать фоновую работу,
- Способ сделать условный просмотр.
Возможные улучшения:
- Вы можете развернуть сервис в таком сервисе, как Heroku, чтобы сделать ваш API доступным из любого места.
- Я признаю, что это не очень хорошо масштабируется, для интенсивных задач вы можете захотеть использовать более серьезные решения для фоновых заданий, а опрос API — тоже не очень хорошая идея. Но на сегодня хватит :)