Экспорт Избранного на Хабре в 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. Порядок использования читайте здесь.

    Only registered users can participate in poll. Log in, please.

    Надо ли делать графическую оболочку для Habraparse?

    • 42.0%Да, обязательно! Я не могу разобраться, как пользоваться консольным скриптом.335
    • 42.1%Было бы неплохо, но я и с консолью вполне себе справляюсь336
    • 15.3%Нет, не надо! Консоль — наше всё.122
    • 0.6%Нет, не надо. Я сам напишу и опубликую её на Хабре во имя всеобщего блага!5
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 53

      +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, то проблем с этим не возникнет.
          • UFO just landed and posted this here
              +2
              Вопрос не понял. Но думаю, что правильный ответ: я не знаю java и не разрабатываю под браузеры. А также это ограничение для пользователя — каким браузером он _должен_ пользоваться.
              • UFO just landed and posted this here
                  0
                  включая ie, к слову.
                  • UFO just landed and posted this here
                      0
                      IE7Pro пользовал в прошлом, после тоже появлялись разные для этого расширения.
                      сейчас, впрочем, под ie9/10 ничего не могу найти.
                    +4
                    То есть вы явно лучше автора разбираетесь в теме расширений для браузера, но тем не менее предлагаете ему их сделать? :) А чего сами тогда не запилите? Он же сказал уже, что не умеет.
                    • UFO just landed and posted this here
                        +1
                        Интересные хабрастатьи имеют тенденцию со временем исчезать. Или пользователь спрячет статью в черновики или НЛО спрячет пользователя в черновики.
                        • UFO just landed and posted this here
                      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
                                                  Ну это не ко мне…
                                    • UFO just landed and posted this here

                                      Only users with full accounts can post comments. Log in, please.