Возникновение идеи


Недавно был в гостях у друзей и мы выбирали фильм, а я как прожжённый киноман (на самом деле, не то чтобы прям прожжённый) отбраковывал всё как просмотренные. И мне задали логичный вопрос, а что ты вообще не смотрел? На что я рассказал, что веду кинопоиск и каждый фильм, которые посмотрел отмечаю либо оценкой, либо просто галочкой, что просмотр состоялся. И тут в голове у меня возник вопрос, а сколько я вообще времени то потратил на фильмы? В Steam есть удобная статистика по игре, а по фильмам ничего такого нет. Вот и решил я заняться данной идеей.



Что там с реализацией?


Я уже несколько лет разрабатываю на ASP.NET и привык к C#, сначала на нём и хотел написать данную утилиту, но тут возникла проблема с тяжеловесным окружением и, так как я немного знаком с Python, именно к его помощи я прибегнул.

А где взять данные?


И вот тут я столкнулся с первой проблемой. Я наивно предполагал, что у кинопоиска есть официальное публичное API и какая-нибудь бесплатная версия. Но ничего такого я не нашёл. Есть возможность запросить через техподдержку, но и там выдают только за n-ую сумму, а я писал это для себя и никак не хотел платить за это.

Естественно, пришлось рассматривать вариант парсинга страниц и именно на нём я и остановился.

image

У каждого в профиле есть список просмотренных фильм с небольшим описанием, которое включает продолжительность картины. Таким образом я могу получить всего несколько страниц (У меня 762 фильма и необходимо было получить всего 17 страниц) и рассчитать потраченное время.

Сказано — сделано.

class KinopoiskParser:
    def __init__(self, user_id, current_page=1):
        self._user_id = user_id
        self._current_page = current_page
        self._wasted_time_in_minutes = 0

    def calculate_wasted_time(self):
        while True:
            film_list_url = f'https://www.kinopoisk.ru/user/{self._user_id}'                 f'/votes/list/ord/date/genre/films/page/{self._current_page}/#list'

            try:
                film_response = requests.get(film_list_url).text
            except BaseException:
                proxy_manager.update_proxy()
                continue

            user_page = BeautifulSoup(film_response, "html.parser")

            is_end = kinopoisk_parser._check_that_is_end_of_film_list(user_page)
            if is_end:
                break

            wasted_time = self._get_film_duration_on_page(user_page)
            self._wasted_time_in_minutes += wasted_time

            print(f'Page {self._current_page}, wasted time {self._wasted_time_in_minutes}')

            self._move_next_page()

    def get_wasted_time(self):
        return self._wasted_time_in_minutes

    def _move_next_page(self):
        self._current_page += 1

    @staticmethod
    def _get_film_duration_on_page(user_page):
        try:
            wasted_time = 0
            film_list = user_page.findAll("div", {"class": "profileFilmsList"})[0].findAll("div", {"class": "item"})
            for film in film_list:
                film_description = film.findAll("span")
                if len(film_description) <= 1:
                    continue

                film_duration_in_minutes = int(film_description[1].string.split(" ")[0])
                wasted_time = wasted_time + film_duration_in_minutes

            return wasted_time
        except BaseException:
            print("Something went wrong.")
            return 0

    @staticmethod
    def _check_that_is_captcha(html):
        captcha_element = html.find_all("a", {"href": "//yandex.ru/support/captcha/"})
        return len(captcha_element) > 0

    @staticmethod
    def _check_that_is_end_of_film_list(html):
        error_element = html.find_all("div", {"class": "error-page__container-left"})
        return len(error_element) > 0

Но уже на этапе отладки я столкнулся с проблемой, что кинопоиск блокирует запросы (примерно, на 4 итерации) и считает их подозрительными. И он ведь прав! Но такой вариант я тоже предполагал и перешёл к плану Б.

План Б — меняем прокси как перчатки


Взяв первый попавшийся сервер, который предоставляет API для получения ip proxy (не рекламирую никакие сервисы, взял первые две ссылки из гугла), криво прикрутил его и продолжил писать основной код. И уже через час, когда я был близок к завершению меня заблокировал и сервер, которые предоставляет API! Пришлось сменить его на другой, который выдаёт фиксированный список, каждые полчаса, для моей задачи этого достаточно. Но если вдруг кончится список, можно вернутся к предыдущему варианту (они выдают каждые 24 часа где-то 10-20 proxy).

class ProxyManager:
    def __init__(self):
        self._current_proxy = ""
        self._current_proxy_index = -1
        self._proxy_list = []
        self._get_proxy_list()

    def get_proxies(self):
        proxies = {
            "http": self._current_proxy,
            "https": self._current_proxy
        }

        return proxies

    def update_proxy(self):
        self._current_proxy_index += 1
        if self._current_proxy_index == len(self._proxy_list):
            print("Proxies are ended")
            print("Try get alternative proxy")
            proxy_ip_with_port = self._get_another_proxy()
            print("Proxy updated to " + proxy_ip_with_port)

            self._current_proxy = f'http://{proxy_ip_with_port}'
            return self._current_proxy

        proxy_ip_with_port = self._proxy_list[self._current_proxy_index]

        print("Proxy updated to " + proxy_ip_with_port)

        self._current_proxy = f'http://{proxy_ip_with_port}'
        return self._current_proxy

    @staticmethod
    def _get_another_proxy():
        proxy_response = requests.get("https://api.getproxylist.com/proxy?protocol[]=http", headers={
            'Content-Type': 'application/json'
        }).json()

        ip = proxy_response['ip']
        port = proxy_response['port']
        proxy = f'{ip}:{port}'

        return proxy

    def _get_proxy_list(self):
        proxy_response = requests.get("http://www.freeproxy-list.ru/api/proxy?anonymity=false&token=demo")
        self._proxy_list = proxy_response.text.split("\n")

Соединив всё это вместе (в конце приведу ссылку на гитхаб с конечной версией), я получил отличную штуку для подсчёта времени потраченного на фильмы. И получил заветное число, тадам: «You wasted 84542 minutes or 1409.03 hours or 58.71 day».

Зря потратил время для подсчёта зря потраченного времени


На самом деле, не зря. Задача была интересная, хоть и вряд ли нужная хоть кому-то.
Да и теперь я могу всем говорить, что, почти, два месяца своей жизни я занимался просмотром кино!

Если кому-то будет тоже интересно получить такую «важную» статистику для себя, просто скопируйте id своего профиля и запустите проект с этим параметром и если несложно скиньте в комментарии результат, мне интересно «киноман» я или любитель начинающий.

Ссылка на исходный код

P.S. Также буду рад услышать советы по улучшению кода, так как на питоне писал очень мало и даже синтаксисом владею не в полной мере.

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


  1. akokarev
    25.11.2018 16:12
    +1

    Моя бабушка 3 раза посмотрела всю Санта-Барбару. Как посчитать сколько лет жизни ушло на просмотр?


    1. GrigorGri
      25.11.2018 16:27

      Ну, это легко. Гуглим Санта-Барбара продолжительность. Находим что это 66 дней. Умножаем на 3 -> 198 дней. В итоге ни одного года (чистого времени, без учета времени на сон и т.д.)


    1. wlr398
      25.11.2018 16:31

      Это как раз не сложно. 2137 серий по 45 минут. То есть всего 67 дней, если не ошибаюсь в подсчётах.
      А как у автора заметки 762 это довольно мало. У меня 4447 на данный момент. Чтобы стать IMDB top 1000 voter надо ориентировочно 15000-20000. Честно говоря, не представляю, как можно столько осилить, если честно, не пытаясь накручивать.


      1. alados Автор
        25.11.2018 16:37

        Вот мне как раз и было интересно услышать другие числа. А то большинство друзей не ведут никаких списков и, почти, всех поражает число 762 просмотренных фильма.


      1. VIPDC
        26.11.2018 04:18

        И вы и GrigorGri забыли существенный момент для сериалов — реклама.
        По этому смело добавляем по 15 минут рекламы на каждую серию итого + 32005 минут (534,25 часов, 22,3 дня). Умножим на три 66,9 дней.


        1. Chugumoto
          26.11.2018 10:58

          откуда рекламе взяться? здесь вам не ТВ :)


          1. SvyatoslavMC
            26.11.2018 17:07

            Вероятно, бабушка смотрела именно по ТВ :)


        1. GrigorGri
          27.11.2018 15:20

          Это зависит от того, что считать за время потраченное на просмотр. Все таки просмотр рекламы и просмотр сериала это разные вещи. Даже неизвестно, оставалась ли бабушка чтобы посмотреть рекламу или занималась чем нибудь другим.


      1. tartarelin
        27.11.2018 09:28

        Может смотрят фильмы на скорости 1.5 или больше


  1. aleks_raiden
    25.11.2018 16:22
    +2

    Как инструмент для прокачки скилла программирование — все отлично )
    Но как я понимаю, эти цифры вы могли просто посмотреть в своем профиле на кинопоиске.
    image

    P.S. Я со своими 3 294 фильмами (а реально больше, не всегда обновляються те, что уже вышли в прокат) получается, не просто заядло-прожженый, а капец как )))


    1. alados Автор
      25.11.2018 16:27

      Чуть выше уже ответил, я считал именно по фильмам, потому что по сериалам получается немного некорректно. А ещё я не заметил этой плашки раньше=)


      1. k0ldbl00d
        26.11.2018 09:31

        Для сериалов есть myshows.me (не сочтите за рекламу)


    1. bro-dev0
      25.11.2018 17:46

      У меня на 1800 меньше записей однако время всего на 50 дней меньше.


    1. Andriy1218
      26.11.2018 15:36

      Вы походу очень не любите фильмы, раз ваша средняя оценка 1.000. Зачем же вы их столько смотрите?)


      1. aleks_raiden
        26.11.2018 15:56

        Это скорее мое отношение к оценкам ) Мне абсолютно не интересны оценки других, я принципиально смотрю все фильмы, а моя личная оценка — никому не интересна. Поэтому кинопоиск я использую только для записи какие именно фильмы просмотрены и все.


        1. Andriy1218
          26.11.2018 17:24

          Там можно просто обозначать, что фильм просмотрен(без оценки). Просто так вы на ровном месте понижаете всем фильмам оценку. Хотя я слышал, что единицы в последнее время не учитываются в рейтингу, но это не точно. Я такой аккаунт принял бы за бота. Да и возможно в настройках можно настроить параметры конфиденциальности.


  1. MiSaf
    25.11.2018 16:23

    А теперь сравните полученную вами цифру с тем, что считает кинопоиск автоматически. Там такая статистика есть на вкладке "Оценки" в профиле.


    Оценки в цифрах 
    всего записей
        1166
        фильмы  1136
        сериалы 21
        короткометражки 9
    время   111 д  14 ч  22 мин


    1. alados Автор
      25.11.2018 16:26

      На самом деле, я не смог найти такую инфу у них, но это из-за невнимательности.
      Но всё-таки мой подсчёт тоже имеет смысл. Я считал только по фильмам, а на кинопоиске вместе с сериалами и это вызывает некоторую проблему. Часто из сериала я смотрю 1-2 сезона, а он считает, на сколько я понял, по всем существующим сезонам.


      1. aleks_raiden
        25.11.2018 17:06

        Ну логика в этом есть — это нельзя считать за полностью просмотр, поэтому или не отмечать или вот будут погрешности. Стоило бы добавить им еще вариант оценки «неполный просмотр» как раз в применимости к сериалам


      1. Chugumoto
        26.11.2018 11:08

        ну так это получается проблема самого кинопоиска и как вариант нужно им куда-нибудь об этом сообщить?
        на лостфильме например статистика нормально ведется не только по сезонам, но и по сериям…


        1. Andriy1218
          26.11.2018 15:47

          Вряд ли они как-то прореагируют на такое замечания. Я им пару раз писал всякие небольшие (и как по мне очень полезные) предложение по новому функционалу и корректировки существующего. Ни по одной заявке не было больше никаких записей, кроме первоначальной про регистрацию моего предложения в базе. Да я и сам замечаю, что за последние несколько год заметного добавления функционала не было.
          Хотя все это субъективно и я могу ошибаться.


  1. lain8dono
    25.11.2018 16:29

    You wasted 84542 minutes or 1409.03 hours or 58.71 day

    Интересно, это много или мало? У меня где-то 200 суток аниме, но у меня нет ощущения, что я прям всё смотрел.


    1. alados Автор
      25.11.2018 16:35

      Вот мне тоже интересно. Вроде в комментариях говорят, что мои 762 фильма это самое начало восхождения к топу=)


      1. wlr398
        25.11.2018 16:41

        У всех свои пристрастия. Кто-то по книге каждый день читает. Кто-то каждый день марафонскую дистанцию бегает. Или всё свободное время игры гоняет. Или все выходные матан и хаскель.
        Если нравится и никому не доставляет неприятностей, то в чём проблема…


        1. alados Автор
          25.11.2018 16:44

          Абсолютно согласен, мне просто было интересно=)
          Я вон чаще люблю в игры позалипать, когда есть хоть немного свободного времени


          1. aleks_raiden
            25.11.2018 16:53

            Я для себя решил этот вопрос вторым монитором, на котором можно смотреть фильм ) Тем более достаточно много фильмов, которые можно смотреть вполглаза )


            1. alados Автор
              25.11.2018 17:22

              У меня так не получается, хотя тоже имею два монитора.
              Многозадачность это для меня слишком сложная штука=)


      1. shalm
        26.11.2018 07:50

        меня хватает на один — два фильма в месяц, считаем 20 в год, штук 600 за 30 лет, соизмеримо с Вашей цифрой, при том что я себя киноманом не считаю


        1. alados Автор
          26.11.2018 07:56

          Я стараюсь смотреть каждую неделю по фильму, хотя далеко не всегда выходит


          1. wlr398
            26.11.2018 09:18

            Надо разделять просто развлечение и хобби. У тех, кто посмотрел много тысяч фильмов, это скорее всего хобби. Когда кроме просмотра изучаются материалы о съёмках, об актёрах, режиссёрах, жанрах, читаются всякие киношные форумы. Да и фильмы смотрятся не только те, что в кинотеатрах выходят и сериальный мейнстрим, а начиная с немого кино, снятого более 100 лет назад, артхаус всякий малопопулярный.
            Причём хорошие, понравившиеся фильмы пересматриваются, может быть даже десятки раз. Поэтому надо вносить поправочный коэффициент :)


    1. koshi-dono
      25.11.2018 19:34

      Это смотря в каком возрасте. Но вообще нормально, без фанатизма.


  1. SvyatoslavMC
    25.11.2018 17:05

    Когда LostFilm обновил сайт, там добавили подсчёт времени по сериям, т.е. можно отметить часть сезона даже. За 5 лет у меня набежало 96 дней, например.


    1. helg1978
      25.11.2018 17:09

      myshows.me тоже подсчитывает, удобно если не только лостфильм смотришь.
      у меня 154 дня :(


      1. SvyatoslavMC
        25.11.2018 17:12

        Меня огорчает только то, что если бы я всё это посмотрел в оригинале, то мой английский был бы на много лучше :D


        1. alados Автор
          25.11.2018 17:23

          А получается смотреть в оригинале? У меня страх, что ничего не пойму и придётся одну серию смотреть по несколько раз. Поэтому смотрю всё с переводом=(


          1. SvyatoslavMC
            25.11.2018 17:30

            Потеря информации заметно большая. Я решил тренироваться на аудиокнигах/подкастах, а сериалы оставить в покое. С субтитрами хорошо заходит, но нет ощущения комфортного просмотра, да и навыки аудирования это не улучшает, поэтому тоже исключил.


          1. alexey-m-ukolov
            25.11.2018 17:47
            +1

            Я именно так язык и подняд до хорошего уровня. Сначала смотрел с русскими субтитрами, потом перешёл на английские, потом совсем от них отказался. Лет пять всё это заняло. Ну а какая это прелесть — не зависеть ни от сроков выхода перевода, ни от его качества — это словами не описать.


          1. helg1978
            25.11.2018 18:06

            мне помогла подписка на Netflix.
            Он настолько классный и удобный, что смотреть что-то в браузере с рекламой ставок на спорт никакого желания нет.


            1. marataziat
              25.11.2018 19:45

              Просто баньте через ublock origin, и установите бан лист для рунета и все будет хорошо! Если не дай бог реклама откроется просто через девтулзы браузера найдите источник и забаньте :) Я так пару раз забанил теперь рекламы вообще нет!


          1. aamonster
            25.11.2018 20:19

            Добрые люди советуют смотреть с субтитрами, настроив для них отставание на несколько секунд.


  1. bro-dev0
    25.11.2018 17:47

    Если время проведено с удовольствием оно не считается зря потраченным.


  1. tuxi
    25.11.2018 18:05

    Странно, что кинопоиск использует такую примитивную модель анализа "ботов"


  1. marataziat
    25.11.2018 19:36

    Что если собирать статистику с проигрывателя сайта прямо в браузере? Мало ли на какую страницу с фильмом ты зашел, другое дело сколько ты посмотрел! Помоему можно сделать webextension для этого :) Данные о просмотренном времени на фильм можно хранить в browser.localStorage и потом делать красивый дашборд с графиком :)


    1. alados Автор
      25.11.2018 20:59

      Это тоже очень относительная штука. Я, например, очень часто скачиваю фильм и смотрю на телевизоре или использую PS4. Поэтому такие вещи уже очень тяжело оптимизировать=)


  1. Demiurge067
    25.11.2018 20:58

    Даже не знаю, для чего я это пишу, но статистика за 5 лет такая: 1356 фильмов. 142396 минут. 2373 часа. 98 суток.
    Да, плюсом добавил скачанные торренты. Люблю побаловать себя 3D и качественным HD.
    Жуть, сколько потрачено времени… С другой стороны — не все же время работать)))


    1. alados Автор
      25.11.2018 20:59

      Неплохо, у многих в доту за пару лет наигранно больше=)


      1. sim31r
        26.11.2018 03:20

        Или в Total Annihilation c 1997 года по данный момент.


    1. marataziat
      26.11.2018 08:09

      0.7 фильмов в день? Очень мощно!


      1. Demiurge067
        26.11.2018 10:16

        Да, многолетняя сложившаяся традиция — прихожу домой с работы, решаю текущие вопросы, включаю киношку. Сериалы иногда заходили по две-три серии, правда, надоедали быстро)))


  1. facetus
    25.11.2018 22:04

    А как можно ориентироваться только на один ресурс? Вы что только там фильмы смотрите? Я за всю жизнь с сотни разных источников смотрел — как посчитать? Да никак =)
    Так что всё это лишь данные с аккаунта на сайте…


    1. Andriy1218
      26.11.2018 15:53

      Ну вообще-то на КиноПоиске фильмы почти никто не смотрит(хотя в последнее время там появилась такой функционал для части фильмов и сериалов). КиноПоиске это русскоязычный аналог imdb. То есть это база фильмов, сериалов и прочего.


  1. dmxrand
    25.11.2018 23:36

    И без скрипта скажу что не смотрел Колобаху, Ятинсотэстс, Космический ворс. С вероятностью 80% не смотрел Zero, Zero 2, Zero 3, Занесло.


  1. FeNUMe
    25.11.2018 23:43


    И это только сериалы и я еще не всё туда вносил. Думаю фильмов наберется еще на такую же цифру.


  1. werwolfby
    25.11.2018 23:55

    Удивлён, что никто не рассказал про http://www.trakt.tv
    Есть отличный плагин для коди, много лет пользуюсь, и там вся статистика есть.


  1. artemisia_borealis
    26.11.2018 02:00

    Почти off.
    А я вот, наоборот долго терял интерес к худ. фильмам и несколько лет назад потерял его окончательно. Сейчас могу оценить просмотры как 1-3 фильма в год.
    Трудно представить, что может меня даже не заставить, а просто соблазнить смотреть художественное кино. Вот неинтересно совсем.

    Интересно понять мотивацию тех, кто в таких, по-моему астрономических, дозах смотрит кино. Неужели там столько стоящего?

    Не говорю о том, что вот, мол, можно было бы потратить время на что-то более полезное. Это чушь. Как раз если интересно, то, значит, и полезно. Но вот почему интересно?



    1. Demiurge067
      26.11.2018 10:20

      У меня, возможно, возрастная деградация. Когда все «полезное» сделано, ну там — построить тёщу, посадить печень и т.п. Да и как отказать ребенку, который запал на «Склифа»???))) Так и бывает)))


    1. ivansmith
      26.11.2018 13:15

      У меня тоже самое. Не смотрю художку вообще, хотя раньше смотрел. (Сейчас может 1-2 фильма в год в кинотеатре). Не интересно, сюжеты банальные и жалко на это время тратить…
      Но смотрю Top Gear/Grand Tour с оригинальной дорожкой :)


  1. dimonoid
    26.11.2018 06:03

    А как посчитать сколько времени потрачано на YouTube?


    1. k3k6u
      26.11.2018 10:05

      в мобильном приложении ютюб есть вкладка «ваше время просмотра»


      1. dimonoid
        26.11.2018 10:06

        Там есть статистика только за сегодня, вчера и за прошлую неделю. Всё.


  1. LoadRunner
    26.11.2018 09:20

    А стоит ли учитывать время, потраченное на обсуждение увиденного?
    У нас с женой есть привычка ставить фильм на паузу и делать очередной фейспалм от сюжетной дыры или ещё какой глупости. Ну или просто обсудить что-либо, просто поговорить на тему, связанную с увиденным, предположить возможные сюжетные повороты, вот это вот всё. И просмотр одного фильма может растянуться часов на 5. А то и больше — Бен Гура мы сутки смотрели.

    P. S. В качестве мотивации просмотра фильмов как раз подходит совместный досуг с женой :)


    1. alados Автор
      26.11.2018 10:53

      Не у всех есть жена=)
      Я вот смотрю фильмы в гордом одиночестве и обсуждать всё приходится с самим собой


  1. alemiks
    26.11.2018 11:53

    советы по улучшению кода

    например, взять нормальное апи, а не парсить страницы
    Как вариант, посмотреть исходники tiii.me и допилить для фильмов (там считаются только сериалы)


    1. alados Автор
      26.11.2018 17:34

      Я в статье писал, что кинопоиск не предоставляет открытого API


      1. alemiks
        26.11.2018 20:41

        так и это и есть улучшение кода: выкинуть кинопоиск и использовать сервис с нормальным апи


        1. alados Автор
          26.11.2018 21:01

          Смысл в том, чтобы пользователь не делал дополнительных движений, если он уже ведёт список. Я бы точно не стал вносить 762 фильма, а у кого-то их 3000+


  1. urmaul
    26.11.2018 17:34

    Интересно было бы учесть и оценки на Кинопоиске. Хотя бы разделить на два числа: время фильмов, которые понравились и которые не понравились.


    1. alados Автор
      26.11.2018 17:36

      Можно и конкретно по оценкам, это несложно сделать. Если буду делать версию V2, обязательно, внедрю эту функцию=)


      1. SvyatoslavMC
        26.11.2018 20:06

        Тогда больше никто не скажет, что время, проведённое с удовольствием, не считается потерянным :D