11 марта 2010 в 20:02

Продолжаем парсить RSS теперь уже kinozal'a используя grep, wget/curl tutorial

RSS
В моем предыдущем посте про автоматизацию загрузок новых эпизодов с RSS ленты LostFilm'а хабраюзер AmoN поднял правильный вопрос о невозможности описанным мною способом загрузки раздач, прямых ссылок на torrent файл которых в RSS ленте не содержится. В качестве примера был приведен трекер кинозал.тв. Именно решению этого вопроса посвящен сей пост ;)

Вместо введения

Перескажу вкратце суть прошлого поста. Многие популярные torrent клиенты позволяют в своих настройках задать папки слежения, анализируя которые на появление новых файлов, автоматически начинают закачки. Написанный ранее shell скрипт периодически просматривает RSS ленту трекера, выбирает интересующие нас раздачи, и загружает их torrent файлы в папку слежения.

Что в имени тебе моем?

В основе выборки и фильтрации RSS ленты прошлого способа лежал анализ регулярным выражением ссылки на torrent файл. К примеру, даже мельком взглянув на ссылку вида http://www.lostfilm.tv/download.php/2035/Lost.s06e07.rus.PROPER.LostFilm.TV.torrent
сразу же видно что это за сериал, сезон и эпизод. Однако, как верно заметил AmoN, далеко не во всех трекерах RSS ленты содержат прямые ссылки на torrent файлы что несколько затрудняет нашу задачу по автоматизации загрузок. Именно эта особенность и стала причиной сего поста :)

Нусс, приступим

Для начала, я внимательно взглянул на формат подопытной RSS ленты. И вот что увидел:

<item>
<title>The 3 Great Tenors - VA / Classic / 2002 / MP3 / 320 kbps</title>
<description>Раздел: Музыка - Буржуйская</description>
<link>http://kinozal.tv/details.php?id=546381</link>
</item>


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

Вырабатываем план

Немного поразмыслив, я выдумал следующий алгоритм:
  1. читаем RSS ленту http://kinozal.tv/rss.xml и grep'ом выбираем интересующие нас раздачи по описанию:

    curl -s http://kinozal.tv/rss.xml | grep -iA 2 'MP3'

    где "-s" — указание «вести себя тихо»,
    "-i" — регистронезависимый поиск,
    "-A 2" — указывает grep'у вместе с найденной строкой выводить еще и две следующих за ней (именно в них и содержится интересующая нас ссылка)

  2. среди выбранных раздач с помощью grep'а оставляем только ссылки:

    grep -ioe 'http.*[0-9]'

  3. открываем цикл по всем найденным ссылкам:

    for i in ... ; do ... ; done

    где на месте списка, используя «волшебные» кавычки `...` подставляем два результат наших предыдущих изысканий:

    for i in `curl -s http://kinozal.tv/rss.xml | grep -iA 2 'MP3' | grep -ioe 'http.*[0-9]'`; do ... ; done

  4. в цикле, мы для каждой из ссылок загружаем страничку и, опять же, grep'ом вытаскиваем из нее ссылку на torrent файл:

    curl -sb "uid=***; pass=***; countrys=ua" $i | grep -m 1 -ioe 'download.*\.torrent'

    где, "-b "uid=***; pass=***; countrys=ua"" — опция для задания передаваемых cookies со сведениями об авторизации,
    "-m 1" — оставляет только первую из двух прямых ссылок на torrent файл (да, на страничках описания раздач кинозала ссылка на один и тот же файл встречается дважды)

    Обращаю внимание на то, что ни пароль ни uid не не передаются в открытом виде! Их значения можно увидеть открыв окошко просмотра cookies в вашем браузере или же, к примеру, воспользоваться плагином для FireFox.

  5. загружаем torrent файлы wget'ом:

    wget -nc -qi - -B "http://kinozal.tv/" -P ~/.config/watch_dir --header "Cookie: uid=***; pass=***; countrys=ua"

    где из опций отмечу "-B "http://kinozal.tv/"" — задание префикса/домена для загрузки относительных ссылок (а именно таковыми они и являются на страницах описаний раздач кинофильма),
    и "--header "Cookie: uid=***; pass=***; countrys=ua"" — задание заголовка для GET запроса (в этот раз я захотел передать cookies именно таких способом а не через файл:) )

  6. переход на начало цикла


И что же мы имеем

А в итоге у нас получается вот такая вот "простенькая" команда:
for i in `curl -s http://kinozal.tv/rss.xml | grep -iA 2 'mp3' | grep -ioe 'http.*[0-9]'`; do curl -sb "uid=***; pass=***; countrys=ua" $i | grep -m 1 -ioe 'download.*\.torrent' | wget -nc -qi - -B "http://kinozal.tv/" -P ~/.config/watch_dir --header "Cookie: uid=***; pass=***; countrys=ua"; done

И для полного счастья, эту команду стоит прописать в cron:

*/15 * * * * наша команда > /dev/null 2>&1

За сим все, разрешите откланяться :)


UPD. В комментариях к моему предыдущему посту из этой серии было сделано несколько интересных предложений по оптимизации нагрузки на сервер:
habrahabr.ru/blogs/p2p/87042/#comment_2609116 (проверка на существования файлов)
habrahabr.ru/blogs/p2p/87042/#comment_2609714 (использование Last-Modified и ETag)

UPD2. По совету apatrushev заменил "head -1" на опцию grep "-m 1".
Лабинский Николай @Labinskiy
карма
125,0
рейтинг 0,0
Похожие публикации
Самое читаемое Администрирование

Комментарии (24)

  • +1
    спрашивайте, критикуйте… :)
  • +1
    перенес в Peer-to-Peer
  • +3
    Спасибо за разбор данного вопроса, это действительно актуально. Если большинство западных трекеров раздает RSS с возможностью выбора, что именно нам от нее нужно. То у нас вопросы автоматизации почему-то вовсе не актуальны и не пользуются спросом. Этот метод можно по аналогии(возможно с незначительной доработкой) применять на других ресурсах. Теперь ради интереса разве что можно придумывать новые инструменты для данных вещей :]
    • +1
      Пожалуйста, к тому же самому было очень интересно разобраться в этом вопросе.
    • +1
      лично мне кажется что таким способом владельцы трекера заставляют «простых» юзеров не качать напрямую торрент клиентами, а заходить на сайт, тем самым показывая им какую то рекламу, трекер получает хит посещения и вылазит выше в топе, выше в топе — больше рекламы — больше денег.
      • +1
        Нова и лостфильм вроде и деньгами не обделены и с популярностью выше крыши и с лентой все отлично. Может и другим трекерам присмотреться и зарабатывать на чем-то другом, а не на 101-м баннере который они на себе размещают.
        «зарабатывать» и «p2p», просто слух режет, идеология свободы, обрамленная страстью наживы.
        • +2
          мне кажется нет ничего постыдного в заработке с использованием p2p, тот же лост — они переводят сериалы — тратят деньги, и раздают торрентом. дело не в технологии а в подходе к заработку :)
          • 0
            Ну и я о том же, просто слишком надоели уже трекеры обвешанные рекламой(да часто мы ее «режим», но факт ее наличия это не отменяет) за которой и не видно уже ресурса.
            Вот сейчас началась закачка новой серии Хауса с Лоста, я никуда не заходил, браузер мне не нужен, меня не было за рабочим местом, а серия качается. Это просто и удобно, это и есть принцип p2p
            • +1
              оно то конечно да, согласен, но с другой то стороны — за что владельцам трекера содержать сервер и тп? конечно за рекламу… вот они и пытаются некоторые заманить к себе пользователя. Хотя тут очень тонкая грань между — отбить на рекламе денег для поддержки трекера и заработать на трекере себе на жизнь да побольше ;)
              • 0
                На «поддержку» серверов можно зарабатывать по той же схеме, по которой зарабатывают многие «закрытые» трекеры. Другое дело, что себе на жизнь и по-больше так не заработать и этот вариант многих не устраивает.
  • 0
    Сразу захотелось за Linux пересесть. Спасибо!
    • 0
      Пожалуйста :)
    • 0
      curl и grep под windows есть, попробуйте и возможно будет новая статья :]
  • +1
    Спасибо за статью! Благодаря вам узнал, что у кинозала есть РСС. :)
  • 0
    Идея понравилась. Но не получается. Доктор, что я делаю не так?
    curl -sb "uid=[user]; pass=[pwd]; countrys=ru" kinozal.tv/details.php?id=515784|grep Dok
    • 0
      Логин и пароль передаются не в явном виде. Откройте в своем браузере просмотр cookies и перепишите от туда значения uid и pass.
      • +1
        А если лень заморачиваться, то, к примеру, для FireFox есть специальный плагин который экспортирует cookies в файл, который можно сразу же передать wget'у.
  • +1
    Поправьте «кинтозал.тв», пожалуйста.

    За статью спасибо :)
    • 0
      Спасибо, исправил.
  • +1
    Не удержался:
    «head -1» можно заменить на опцию grep'а "-m 1" получится:
    * на 5 символов короче
    * не запускается дополнительный процесс
    * grep остановится сразу после первого совпадения
    Всё вместе приведет к снижению времени работы и энергопотребления. Сплошной профит. :)
  • 0
    Спасибо, подправил ;)
  • 0

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.