Когда некоторое время назад мы с Munzi Codes впервые сделали Бекделератор во время хакатона, нам нужно было получить сценарии фильмов, чтобы мы могли их анализировать.

К сожалению, вскоре мы обнаружили, что для них был только один реальный источник, и работать с ним было довольно сложно. Вот скриншот того, откуда взялись скрипты:

Не было API, не было простого способа предсказать, какими будут ссылки на сценарии, и не было очевидного способа для пользователей быстро получить сценарий для определенного фильма.

Поскольку у нас было ограниченное количество времени, мы сосредоточились на том, что будет более впечатляющим для хакатона: анализе сценариев фильмов, построении графика с использованием D3, который представляет разговоры между персонажами фильма, и прогнозировании того, прошел ли фильм тест Бекделя. »т.

Единственным способом использования нашего сайта для людей было ручное копирование и вставка сценария с веб-сайта. Очевидно, что это далеко не идеальное решение, и даже наши друзья и родственники не хотели пользоваться этим сайтом.

Когда мы, наконец, решили, что с копированием и вставкой нужно покончить, и захотели найти способ получать информацию напрямую с IMDSB, мы быстро решили использовать Cheerio для извлечения нужной нам информации с сайта и библиотеки Request. делать запросы на сайт.

Cheerio великолепен, потому что позволяет вам писать jQuery и использовать селекторы CSS для получения контента с веб-сайта.

Например, вот часть HTML-кода с веб-сайта IMDSB:

Чтобы получить нужные нам данные, после установки и запроса модулей узла Cheerio и Request (вы можете легко сделать это с помощью npm install cheerio или npm install request), теперь мы можем делать такие вещи:

Приведенный выше код ранее загрузил весь HTML-код из IMDSB с помощью библиотеки запросов. Затем нам нужно получить таблицу, содержащую все ссылки на сценарии фильмов. Поскольку из HTML страницы видно, что у этой таблицы есть дочерний элемент с текстом Все сценарии фильмов, мы можем использовать

$("h1:contains(\"All Movie Scripts\")").parent();

чтобы получить элемент таблицы.

Далее, поскольку каждая ссылка на сценарий фильма имеет в своем URL-адресе «/Movie Scripts», мы можем использовать

$('a[href^="/Movie Scripts"]')

чтобы получить массив, подобный объекту каждого элемента <a>, который имеет ссылку на сценарий фильма. Обратите внимание, что хотя это массив, подобный объекту, и мы можем использовать для него .map, на самом деле это не массив, и поэтому мы используем для него Array.prototype.slice.call, чтобы преобразовать его в фактический массив.

Теперь, когда у нас есть список всех ссылок на сценарии фильмов, мы можем отобразить страницу, использующую эти данные, с помощью шаблонизатора (мы использовали Swig).

Как только пользователь выбирает сценарий из нашего списка всех сценариев, мы используем URL-адрес сценария и библиотеку cheerio, чтобы фактически получить текст сценария, а затем проанализировать его с помощью нашего алгоритма.

Cheerio делает сканирование HTML-страниц очень простым, поскольку вы можете просто использовать селекторы CSS (точно так же, как в jQuery) для выбора нужных элементов страницы. Это отличный вариант при работе с источниками данных, у которых нет API или другого способа легкого доступа к необходимой информации. Я определенно рекомендую проверить это и добавить в свой следующий проект.

Первоначально опубликовано на www.seemaullal.com 13 июня 2015 г.