Скрипт для чтения комментариев любого пользователя

Навеяно постом http://old.reactor.cc/post/3643230
Вкратце: пользователь muted решил написать скрипт (вот этот), который обрабатывает его комментарии: формирует .csv-файл с таблицей, куда включены данные по каждому из комментариев, а также .html-файл, представляющий собой интерактивный график с кликабельными точками, соответствующими тому или иному комменту.
Я же на его основе решил написать ещё один, вынимающий комментарии любого пользователя Реактора и данные по ним (ссылка)
На вход этому скрипту подаётся юзернейм или же ссылка на профиль пользователя. Результат - .xlsx-файл - таблица с подробными данными по комментариям - и интерактивный график по аналогии с первоначальным скриптом

Как этим воспользоваться?


Для работы этого скрипта нужен Python (проверял на версии 3.6) и либы к нему (написаны в заголовке скрипта), а также скачать скрипт как .py-файл (кнопка clone в заголовке пасты на Pastebin). Когда все эти действия совершены, можно приступать.
Для работы скрипта в Windows можно использовать командную строку. При этом необходимо вначале указать конкретную папку, куда программа будет записывать выходные файлы. После чего указывается путь к интерпретатору Python, потом через пробел путь к скрипту, чтобы запустить его:
После того как началась работа скрипта, через некоторое время появляется надпись:
type 1 to enable reading mode
type 2 to enable continuation mode
type 3 to enable updating mode
>>
Первоначально вводим 1 (про два других режима будет написано ниже). После чего возникает ещё одно сообщение:
you have two options now: you can either enter username
or paste the link to his or her profile
type 1 to do the first thing and type 2 to do the other one
>>
Если вы собираетесь вводить юзернейм, набирайте 1, Enter, а потом копируйте юзернейм. Если для вас предпочтительнее копировать ссылку, то жмёте 2, Enter и потом копируете ссылку на профиль нужного пользователя. В данном случае для примера наберу 1 и имя какого-нибудь пользователя:
Поехали!
Доступ к комментариям осуществляется со страницы комментариев у пользователя (в данном примере http://old.reactor.cc/user/procxela/comments). При обработке каждого отдельного комментария скрипт получает ссылку на пост, проверяет, не был ли пост обработан ранее. Если нет, то осуществляется переход к посту по ссылке, а затем в посте ищутся все комментарии нужного пользователя и вынимается инфа из них: дата, время, ссылка на пост, ссылка на комментарий, рейтинг, текст и медиа (картинка или видео, если присутствует). Когда с данным постом скрипт отработал, то id этого поста запоминается, и скрипт больше не обрабатывает его.
В конце концов скрипт обрабатывает все страницы комментариев и сохраняет следующие файлы:
— Искомую таблицу в виде .xlsx-файла (в данном примере получилась такая таблица)
— Интерактивный график (например, такой. Чтобы увидеть результат во всей красе, скачайте файл и откройте скачанный файл)
100
50
0
-50

• •
!
Mar 2017
May 2017
•• •
Jul 2017
Sep 2017
••,реактор,комменты Реактора,длиннопост
— Кроме того, через каждые 15 минут производится копирование в резервный файл data backup.xlsx. Если работа скрипта завершена успешно, то он больше не нужен
— Текстовый файл лога. В нём написано то же самое, что выдавала консоль. Опять же, если всё прошло нормально, то он не нужен.

Режимы работы скрипта

Как было уже указано, есть какие-то три режима у этого скрипта: reading mode, continuation mode, updating mode. Первый описан выше.

Второй режим (continuation mode)

Этот режим нужен, если по какой-то причине запись комментариев прервалась раньше времени. Как им воспользоваться?
Во-первых, опять запускаем этот же скрипт из той же папки, куда сохранялись файлы. Далее, после сообщения о выборе режима набираем 2, жмём Enter. После чего появится сообщение:
Enter name of the excel file or paste path to it
>>
Вот тут уже понадобится файл бекапа (сохранён в той же папке, к концу имени дописано слово backup). Пишем его имя или копируем путь к нему. А потом:
Для того, чтобы знать, какой номер страницы ввести, нужно зайти в лог-файл (сохраняется в той же папке как log.txt), найти самую последнюю надпись Successfully saved, а над ней - вторую снизу надпись вида page number %число%. Например,
log.txt — Блокнот
Файл Правка Формат Вид Справка
JnJxJ
/3234926#commentl4873736 /3234910#commentl4873537 /3234384#commentl4871355 /3233471#comment14866248 /3231246#comment14856722 /3231246#comment14856613 /3230788#commentl4856331 /32307 88#commentl485 5 page number 60 /3231061#commenm5856 /32
Вводим это число и жмём Enter:
Таким образом, можно продолжать записывать комменты в уже существующую таблицу, начиная с некоторой страницы комментариев пользователя (он определяется автоматически по уже имеющейся в таблице информации). После успешного завершения continuation мода сохраняются те же файлы, что и в режиме чтения.

Третий режим (updating mode)

Этот режим нужен, если ранее была записана таблица всех комментариев какого-то пользователя, но с тех пор прошло достаточно много времени, и хотелось бы обновить таблицу новыми комментами. Воспользоваться им можно следующим образом:
При запросе режима нажимаем 3. Потом, как и во втором режиме, скрипт просит название файла или путь к нему, вводим его. А затем скрипт определяет, чьи это комменты, и начинает читать все комментарии этого пользователя с первой страницы до тех пор, пока не обнаружатся старые, уже записанные комментарии. При этом перед чтением новых комментов производится резервное копирование таблицы в ту же папку (только оно осуществляется уже единожды, а не каждые 15 минут, как в других режимах, так что если фейл, то надо начинать сначала).
Учтён так же тот фактор, что рейтинги отдельных уже записанных комментариев могли поменяться (которым на момент записи таблицы было не старше 2 дней). Скрипт находит новые значения рейтингов для них и перезаписывает в той же таблице, где они сохранены.
Чтение всех комментов, по моим подсчётам, выполняется со скоростью где-то 300-400 страниц в час (если комментов у пользователя больше, то скорость замедляется из-за бекапания больших таблиц).
Если тот или иной комментарий, доступный со страницы пользователя, не был прочтён, то это свидетельствует о том, что коммент оставлен или в посте, или в ветке комментариев, который(ая) в последствии был(а) забанен(а).

И немного данных напоследок

Проанализированы комментарии следующих пользователей (с ссылками на таблицы и графиками по ним):