Предыстория
Последнее время всё больше журналов и газет выкладывают свои свежие номера в сеть (Ведомости, Эксперт, Esquire и т.п.). Все хорошо с этими номерами за одним исключением — что бы их читать нужен интернет.
С интернетом проблема в том что он не везде есть (метро) и не каждое устройство его видит (большинство e-ink ридеров).
В связи с этим родилась мысль о том что не плохо бы делать копии периодики в виде электронных книжек (например в FB2 формате).
Задача
Создать решение, позволяющее генерировать файл FB2 формата из куска сайта, содержащего нужный выпуск журнала (например Эксперт №32 за 2010 год).
Файл должен содержать картинки и желательно оглавление с перечнем статей.
Создание файла с новым номером должно происходить в (полу)автоматическом режиме, занимать не больше 5-10 минут и не требовать серьёзной ручной обработки.
Поиск решения
Конвертер Что-То->FB2
Как оказалось конвертеров HTML->FB2 кот наплакал. А таких, которые в автоматическом режиме могут обработать пачку html страничек и корректно составить оглавление и прописать ссылки, нет вообще.
Для начала я попробовал все редакторы описанные в обзоре компьютерры.
- «Any to FB2» — напрочь убивал кирилицу (скорее всего из за кривых рук) и заточен под работу с одной страницей.
- «FictionBook Designer» — мощная штука, но не имеет (не нашел) функции автоконвертации.
- Web2FB2 — ближе всего желаемому но имеет ограничение в 10 страниц и валит всё в одну кучу без оглавления
Дальнейший поиск вывел на замечательный сервис FeedConverter (об этом сервисе на хабре уже писали).
Тестирование на первом попавшемся русском RSS потоке показало что сервис:
- справляется с кириллицей
- генерирует оглавление в виде перечня записей
- принимает картинки
Полнотекcтовый RSS feed
Рассматриваемый сайт не поставляет полнотекстового RSS с данными номеров. Только анотации последнего номера.
Для создания Full Text RSS удобно использовать Yahoo Pipes. Скармливаем ему наш поток, и в цикле подгружаем полный текст статьи — http://pipes.yahoo.com/pipes/pipe.edit?_id=661b8231fa3df88317939d452e772c10. В случае, если сайт не предоставляет RSS потока вообще, а только публикует статьи (как например Esquire) механизм Yahoo Pipes позволяет отпарсить содержимое страницы, достать от туда ссылки и выкачать нужные статьи. Для этого я создал pipe http://pipes.yahoo.com/pipes/pipe.edit?_id=85427a7ff66aa7c06a1fa8da677fbd25
У данного механизма есть плюс в том, что он позволяет достать любой номер, а не только последний.
Для этого в строке вызова надо лишь поменять параметр, отвечающий за год и номер внутри года http://pipes.yahoo.com/pipes/pipe.run?_id=85427a7ff66aa7c06a1fa8da677fbd25&_render=rss&number=31&year=2010.
Итого
Финальный алгоритм создания FB2 версии периодики следующий:- Находим сайт с информацией
- Берем RSS или индексную страницу
- Парсим страницу в Yahoo Pipes и подтягиваем полный текст статей
- Скармливаем выдачу пайпа FeedConverter-у и забираем FB2 книжку
- ??????
- PROFIT!
Ложка дегтя
- В связи с тем, что Yahoo Pipes работает не слишком быстро, генерация может не пройти с первой попытки. Надеюсь создатели FeedConverter-а сделают что-нибудь с этим.
У Yahoo Pipes есть ограничения по тому, сколько процессорного времени может съедать один пайп. В связи с этим некоторые объемные выпуски журнала не укладываются в прокрустово ложе и вылетают с ошибкой (например Эксперт №1 за 2010 г.). Что делать с этим пока не понятно. Возможно стоит разнести парсинг и подгрузку текстов в разные пайпы.Подгрузку полных статей можно вынести на ReadBox.info (см ниже)
Update 1: Ниже в комментариях подсказали отличный сервис для создания полнотекстовых версий — ReadBox.info. Для того что бы получить FullText feed на вход нужно скормить RSS поток и XPath блока с текстом. Таким образом функцию подгрузки текста можно убрать из Y!P, что позволит ей работать более стабильно.
Собственно теперь процесс можно сделать таким:
- Находим сайт с информацией
- Берем RSS или индексную страницу
- Оставляем только нужные статьи или парсим индексную страницу в Yahoo Pipes
- Подтягиваем полный текст статей с помощью ReadBox.info
- Скармливаем RSS FeedConverter-у и забираем FB2 книжку
- ??????
- PROFIT!
Update 2: Для тех кто не испугается ковыряния в конфигах и курения мануалов есть отличная программа для нашей цели — nmdparser. Вот пример того, как её можно настроить для получения в FB2 архивной копии Авторевью.