Когда некоторое время назад мы с 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 г.