Эта запись в блоге изначально была опубликована в моем блоге

Окончательный код здесь

Вырезанный сайт здесь

Сегодня мы изучим, как создать веб-сервис, способный очищать Интернет.

Некоторые требования могут быть:

  • Возможность извлекать данные из 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 — тоже не очень хорошая идея. Но на сегодня хватит :)