Парсинг сайта при помощи PhantomJS + CasperJS

By | 2015-01-21

В данной статье я расскажу о том, как при помощи скриптового браузера PhantomJS со связкой с CasperJS мне удалось собрать ссылки на RSS-ленты нужных сайтов. Начало истории можно узнать в предыдущей статье про алгоритм нахождения тем новостей.

О существовании подобных инструментов я узнал совсем недавно из свежей статьи на Хабре про SlimerJS. Последний отличается от Фантома другим браузерным движком и тем, что видно окно браузера. Изучив тему внимательней, я понял что  CasperJS значительно облегчает написание кода. Но сделать так, чтобы Slimer заработал вместе с ним, у меня не получилось. Плюнув, я установил Фантом – все пошло без проблем.

Вся прелесть в том, что нам не нужно имитировать браузер, так как мы им и являемся! Вся возня с куками, прописыванием мета-информации и прочим, как при работе с curl – в прошлом. Некоторое время я поупражнялся с примерами из FAQ, пробежался вдоль по документации CasperJS и приступил.

Но немного отвлечемся. Напомню, что на руках у меня был список из более чем двух тысяч ссылок на самые разные ресурсы из Яндекс-Новостей. Задача: имея этот список, получить список ссылок на rss-ленты. От парсинга яндекс-подписок я отказался по причинам, указанным в прошлой статье. Удивительно, что мне не сразу пришла мысль, что помимо кривых яндекс-подписок, есть другие крутые RSS-читалки, учитывая что сам активно пользуюсь Feedler. А что, если они тоже предоставляют ссылки на rss-ленты?

В первую очередь посмотрел упомянутый Feedler. Отпадает – rss ссылок не дает. Стал гуглить и почти сразу наткнулся на digg.com. Минималистичный дизайн сразу приглянулся. Зарегистрировался, проверил – идеально! Помимо того, что определяет 90% всех ссылок, делает это почти всегда верно, причем, если находит несколько лент, показывает все по убыванию важности (тоже весьма точно). Но и это не все! Как оказалось, не нужно даже каждый раз при поиске вписывать ссылку в поисковую форму: искомое слово подставляется get-параметром:

voBhqPa

Просто подарок судьбы!

Итак, формализуем. Скрипт должен авторизоваться на сайте, потом по циклу генерировать урл в формате, как на скрине выше, открывать страницу и парсить ссылки на RSS. Ничего сложного.

Но, как всегда, возникли некоторые затруднения. Логин только через fb, twitter или g+. А еще иногда процесс парсинга непонятно почему прерывался. Поскольку окно браузера не отображается в Фантоме, я долго не мог понять в чем дело. На помощь пришла функция, позволявшая сделать скриншот браузера и сохранить в корень программы. Так я определил, что во всем виновато всплывающее окно, предлагающее похвалить Digg в соцсетях, и блокирующее все действия. Благо, это было легко исправить, указав, что, если на странице есть элемент с определенным css-селектором, нужно нажать на него (крестик этого окна) и продолжаем дальше.

Код программы привожу ниже:

 

Результат на выходе получился не самым читаемым, так как fetchText не поддерживает разделителей. Впрочем, все ссылки все равно начинаются на http, поэтому с их последующим разделением проблем не было.

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *