Пользователь
0,1
рейтинг
8 февраля 2015 в 16:01

Разработка → Экспорт Избранного на Хабре в PDF. Версия 2.0

Доброго времени суток, хабражители!



Думаю, многих из вас когда-либо посещала мысль «вот бы сохранить статьи с Хабра». Такая же мысль посетила и меня чуть больше года назад.

Представляю вам новую версию программы закачки статей с Хабра, Гиктаймс и Мегамозг в формате PDF.

Новый проект называется HabraParse.

Проект состоит из библиотечки, которая парсит сайты, и скрипта, использующего лишь часть возможностей этой библиотеки. Скрипт написан на python3, для его работы потребуются модули docopt, requests и weasyprint (все их легко можно установить командой pip install name).

На текущий момент в скрипте имеются следующие возможности:
  • скачать статью по её ID;
  • скачать список URL избранного для заданного пользователя;
  • скачать статьи из избранного в папку в формате PDF или HTML (пока реализация HTML не на высоте, поэтому по умолчанию используется формат PDF, но он работает значительно дольше).


Использование опций --gt/--mm позволяет сохранять статьи с GeekTimes.ru и Megamozg.ru.

Краткое описание параметров скрипта
Usage:
  ./habraparse.py save_favs_list [--gt|--mm] <username> <out_file>
  ./habraparse.py save_favs [--gt|--mm] [-cn --save-html --limit=N] <username> <out_dir>
  ./habraparse.py save_post [--gt|--mm] [-c --save-html] <topic_id> <out_file>

По умолчанию все команды работают с проектом HabraHabr.ru.
При задании опций --gt/--mm скрипт будет работать с GeekTimes.ru/Megamozg.ru.

Команды:
  save_favs_list - сохранение в файл <out_file> списка URL избранного для пользователя <username>
  save_favs - сохранение в папку <out_dir> статей из избранного для пользователя <username>
  save_post - сохранение в файл <out_file> статьи с заданным ID



Пользуйтесь и наслаждайтесь. В случае выявления ошибок прошу кидать сообщения в личку или заводить баг на github-страничке проекта.
Если кому-то чего-то не хватает, то пишите фич-реквест в комментах, по мере сил постараюсь реализовать.



Технические подробности


На самом деле Habraparse это, в первую очередь, библиотека для работы с информацией на сайтах Habrahabr.ru, GeekTimes.ru, MegaMozg.ru, позволяющая:
  • получить информацию о профиле пользователя по его имени;
  • получить из профиля пользователя: статьи, которые он написал и которые он добавил в свое «Избранное»;
  • получить статью по номеру ID с её разбором.

Название для библиотеки было выбрано крайне оригинальное — habr.

Информация о пользователе представлена в классах HabraUser, GeektimesUser, MegamozgUser модуля habr.user и включает в себя:
  • полное имя и никнейм;
  • дата регистрации;
  • дата рождения;
  • данные по карме (сама карма, количество голосов);
  • рейтинг и место в рейтинге;
  • страна, регион, город;
  • количество фолловеров;
  • количество постов;
  • количество комментов;
  • подписки на хабы, компании.


Информация о статьях представлена в классах HabraTopic, MegamozgTopic, GeektimesTopic модуля habr.topic и включает в себя:
  • id статьи;
  • заголовок;
  • имя автора;
  • рейтинг;
  • текст статьи (текст статьи не преобразован, все ссылки на картинки и прочее не тронуты);
  • комментарии: их количество и list с текстом комментариев;
  • перечень хабов, в которых находится статья.


Скрипт же использует библиотеку habr для парсинга и библиотеку weasyprint для генерации pdf. Weasyprint был выбран как самый простой по интерфейсу работы, и как единственный из попробованных, который смог сгенерировать нормальный PDF-файл. Однако, как оказалось, данная библиотека работает весьма медленно.
Если вы знаете другие библиотеки генерации pdf, которые работают лучше — пишите в комменты или в личку. Однако сразу скажу, что разработка изначально велась под python3, поэтому не надо мне рассказывать про прекрасные pdf-библиотеки для python2.

На сим всё. Если кому понравилось, то пользуйтесь на здоровье! Если кто готов на базе этой библиотеки сделать свой скрипт с картами и женщинами, то всё в ваших руках!

UPD. По просьбам трудящихся обновил образ контейнера для докера icoz/habraparse. Порядок использования читайте здесь.
Надо ли делать графическую оболочку для Habraparse?

Проголосовало 770 человек. Воздержалось 126 человек.

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

Владимир @icoz
карма
45,0
рейтинг 0,1
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

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

  • +4
    Давайте прикрутим еще доставку на почту. А дальше sqlite + cron, и будет персональный сервис доставки хабра.
    • +1
      Мысль интересная. Но это уже целый сервис надо делать…
    • 0
      да, тоже хочется поставить в планировщик, чтоб актуализировать статьи локально.
  • 0
    библиотека для работы с информацией на сайтах Habrahabr.ru, GeekTimes.ru, MegaMozg.ru, позволяющая:

    • получить информацию о профиле пользователя по его имени;
    • получить из профиля пользователя: статьи, которые он написал и которые он добавил в свое «Избранное»;
    • получить статью по номеру ID с её разбором.

    Название для библиотеки было выбрано крайне оригинальное — habr.

    + еще одна библиотека, с не менее оригинальным названием "habrahabr".
    • +1
      Посмотрел. Весьма интересная библиотека. Однако она требует знания ключей доступа к API Хабра.
      • 0
        Не совсем, достаточно только client_id и token. Их очень легко получить в т.ч. из официального приложения Хабрахабра, если немного подумать (дам подсказку, декомпилировать приложение не нужно, там все гораздо проще).
        • +1
          Догадываюсь. Только это не этично.
          И неужто нет https?
          • 0
            HTTPS есть, но вроде без SSL pinning. Так что можно попробовать подсунуть свой сертификат и устроить MitM. Но это все сложно, есть способ гораздо проще.

            Только что проверил на стоковом Android'е, Client ID извлекается 1 касанием экрана, если знать, куда тыкать. Токен получить чуть сложнее, но если вы хотя бы поверхностно знаете OAuth, то проблем с этим не возникнет.
  • 0
    А почему не расширение для браузера?
    • +2
      Вопрос не понял. Но думаю, что правильный ответ: я не знаю java и не разрабатываю под браузеры. А также это ограничение для пользователя — каким браузером он _должен_ пользоваться.
      • 0
        Java тут не нужна. Вот JavaScript понадобится, ну и знание XML/DOM немножко. Расширения же достаточно написать для двух браузеров: Mozilla и Chrome. Большинство прочих браузеров (кроме IE и некоторых «микробраузеров», конечно — но это экзотика), так или иначе могут использовать эти расширения.
        • 0
          включая ie, к слову.
          • 0
            Не знал. Подскажете, как?
            • 0
              IE7Pro пользовал в прошлом, после тоже появлялись разные для этого расширения.
              сейчас, впрочем, под ie9/10 ничего не могу найти.
        • +4
          То есть вы явно лучше автора разбираетесь в теме расширений для браузера, но тем не менее предлагаете ему их сделать? :) А чего сами тогда не запилите? Он же сказал уже, что не умеет.
          • 0
            Да мне оно как-то без надобности. Я любую страничку и так в PDF сохранить могу при помощи расширения «Save To PDF» для Firefox.
            Но тут автор предлагает какую-то особую обработку для статей хабра, как я понял. Так чего б не взять код «Save to PDF» и не запилить те же обработки там?
            Другое дело — массовое сохранение при помощи скрипта из командной строки, об этом, в частности, и был вопрос. Просто я тоже не особо понимаю, зачем может понадобиться массовое сохранение хабрастатей в PDF локально.
            • +1
              Интересные хабрастатьи имеют тенденцию со временем исчезать. Или пользователь спрячет статью в черновики или НЛО спрячет пользователя в черновики.
              • 0
                Ну так ничто ж не мешает сохранить отдельно взятую статью в PDF прямо из браузера, даже через «печать в файл». Я не понимаю смысла именно массового сохранения в PDF, гораздо ж лучше сохранять в БД в таком случае.
        • 0
          Юзерскрипт же. И несложно, и кроссбраузерность.
  • 0
    А для тех кто не работает в командной строке… Вот у меня Windows. Как мне собрать запрос, чтобы сохранились статьи из избранного, по имени, в pdf, с комментариями? Заранее спасибо!
    • 0
      python3 habraparse save_favs -cn sergus output_dir

      Но в целом, по результатам опроса, я понял, что надо делать GUI.
      • +1
        очень надо. так как штука нужная. а в строке далеко не все работают.
      • 0
        ещё один маааленький вопросик. где взять эту библиотеку habr и как её установить в мой python? я новичок в питоне.
        • 0
          Никак. Она идет внутри habraparse
          • 0
            Коль просили говорить про ошибки. К Вашему скрипту конечно не относится, но всё же. Попытка установить weasyprint…
            «error: Microsoft Visual C++ 10.0 is required (Unable to find vcvarsall.bat).»
            Кучу раз устанавливал уже C++ с разных источников, ничего не помогает.
            У меня Windows 8.1 и python 3.4
            • 0
              Это классика. Фикс.
              • 0
                неа. увы не помогло. может потому что у меня питон 3-й версии…
            • 0
              Сочувствую, но я не пользуюсь Windows.
              Под винду тесты проводил 4mz
              Спросите его, может он чего подскажет…
              • +1
                Просто получается скрипт только «для своих». В массы в таком виде он не пойдёт. Надеюсь, когда-нибудь выйдет конечный продукт, для которого не нужен бубен.
                А так хотелось свои избранные сохранить…
                • 0
                  Ну о чем вы, скрипт вполне закончен… я виндузятник до мозгокостей, однако разобрался как в убунте поставить Python3 и нужные библиотеки, было-бы желание. Скрипт работает, свои задачи выполняет.
                  • 0
                    я не хочу ставить убунту, чтобы запустить простой скрипт. я не спорю, автор молодец и скрипт хороший, наверное. но я его так и не смог запустить на windows…
                  • 0
                    Хм. Я-то думал, что вы под Windows проверяли… :(
                    • 0
                      да у меня и под linux (чистый):

                      compilation terminated.

                      error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

                      — Cleaning up…
                      • 0
                        Есть настроенный образ докер:
                        • 0
                          icoz/habraparse
                          • 0
                            Можно попробовать несколько вариантов для решения проблемы работы Python на Windows.

                            1. Попробовать найти и установить все нужные бинарники отсюда.
                            2. Попробовать все же скомпилировать под Windows нужные библиотеки. У меня стоит Visual Studio 2010 (подозреваю что на самом деле достаточно рекомендуемого выше фикса). Так же у меня был следующий ньюас в компиляции — был еще настроен компилятор MinGW, вот его пришлось убрать из переменных среды, тогда все заработало.
                            3. Использовать Anaconda Scientific Python Distribution с его пакетным менеджером conda.

                            Третий подход мне очень сильно облегчает жизнь и экономит кучу времени.

                            P.S. icoz — cпасибо за интересные библиотеки написанные на Python.
            • +1
              Installing weasyprint

              By platform

              Pango, GdkPixbuf, and cairo can not be installed with pip and need to be installed from your platform’s packages. lxml and CFFI can, but you’d still need their own dependencies. This section lists system packages for lxml or CFFI when available, the dependencies otherwise. lxml needs libxml2 and libxslt, CFFI needs libffi.


              Windows

              • Get CPython 2.7 from python.org,
              • Christoph Gohlke’s unofficial binaries for CFFI and lxml,
              • and Alexander Shaduri’s GTK+ installer. Make sure that Set up PATH environment variable checked.

              Установите Python 3.4.
              Установите lxml‑3.4.2‑cp34‑none‑win32.whl или lxml‑3.4.2‑cp34‑none‑win_amd64.whl.
              Установите cffi‑0.8.6‑cp34‑none‑win32.whl или cffi‑0.8.6‑cp34‑none‑win_amd64.whl.
              Установите GTK+ for Windows Runtime Environment.
              Пути к установленным библиотекам пропишите в PATH.
              А потом уже pip install xxx.
  • +1
    Интересно, хабр устойчив к хабраэффекту?
    • 0
      ежедневно устойчив!
      • 0
        Но не каждый же день столько людей пробуют сбэкапить весь хабр))
  • 0
    Некоторое время назад я хотел запилить простенький сервис который не просто генерит pdf, а доставляет их в dropbox/evernote через их api + обновляет старые посты, если в них были обновления. Я уже не помню по каким причинам, но завершить начатое не получилось, поэтому предлагаю сообществу сделать то что я не смог.

    Если будет нужно, то сделаю ключи для api хабра.
  • 0
    Может кому так же будет полезна маленькая тулза, для доставки списка избранного для отложенного чтения на Kindle. Репозиторий на GitHub. Сам Kindle не обязателен.
  • 0
    python ./habraparse-master/habraparse.py save_favs -n --limit=10 vinchi /root/habrvinchi
    Traceback (most recent call last):
    File "./habraparse-master/habraparse.py", line 252, in main()
    File "./habraparse-master/habraparse.py", line 223, in main
    limit=args['--limit'], project=project)
    File "./habraparse-master/habraparse.py", line 122, in save_all_favs_for_user
    hu = HabraUser(username)
    File "/root/habraparse-master/habr/user.py", line 220, in __init__
    super().__init__(username, need_favorites, need_user_posts=need_user_posts, domain='habrahabr.ru')
    TypeError: super() takes at least 1 argument (0 given)

    Что не так делаю?
    • +1
      Второй питон вместо третьего?
  • 0
    В общем, так и не смог я запустить ваш скрипт… И переустанавливал, и устанавливал, и на виндовс, и на линукс… жду GUI, или скрипт, построенный на нормальных библиотеках.
    • 0
      Дайте нормальную библиотеку — сделаю…
      • 0
        Кстати, а GUI так же не запустится с ними? *.exe-шник бы, чтобы там всё собрано было.
        • 0
          Ну с ехе-шником вы загнули… Это не на питоне писать надо. А значит, нужен заново писать парсер на си.
          • 0
            а смысл тогда в GUI, если он так же просто не будет работать. а экзэшник это образно. нужно что-то, что автоматически устанавливает и настраивает эти несчастные библиотеки…
            • 0
              Нет смысла в таком GUI, конечно, если это промышленный продукт!
              Но и вы не путайте.
              Одно дело сделать утилиту для себя, которая выполняет свою задачу здесь и сейчас, чуть-чуть её украсить и поделиться ею с общественностью.
              А совсем другое — целенаправленно разрабатывать эргономичный продукт, который легко устанавливается, работает на всем разнообразии операционных систем и железа.
              • 0
                что же делать тогда… кстати, Хабр мог бы такую функцию встроить в сайт. Она имела бы успех. ВКонтакте, например, сделали скачивание фотографий со страницы альбомами. Думаю на каждом сайте, содержащим нужную информацию, должна быть возможность эту самую информацию получить в виде файлов или архива.
                • 0
                  Ну это не ко мне…

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