Получаем данные из Пикабу для сбора статистики
В процессе обучения решил написать что-то полезное, дабы проверить, что я вообще могу. Почему бы не попарсить Пикабу? Поехали!
Само содержимое постов обрабатывать не будем по двум причинам:
1. Не нужно.
2. Слишком долго.
Даже обработка минимального количества данных за сутки занимает до 2х часов.
Список необходимых мне полей:
1. Статус поста
- может быть удален (в корзине)
- обычный пост
2. ID поста
У каждого поста на Пикабу есть свой уникальный ID (номер)
3. Дата публикации, день недели, время.
4. Принадлежность к сообществу
Название сообщества , если пост в сообществе
5. Заголовок
6. Автор
7. Рейтинг
8. Спец. теги
"Моё" или "Клубника" если имеются.
9. Обычные теги
У меня теги идут одной строкой, если есть необходимость можно сохранять их отдельными элементами.
ATTENTION! ЕСЛИ ТЫ ОПЫТНЫЙ И ХОРОШИЙ ПРОГРАММИСТ, ТО У ТЕБЯ МОЖЕТ ПОЙТИ КРОВЬ ИЗ ГЛАЗ, Т.К. ТС ПОКА УЧИТСЯ И ГОВНОКОДИТ.
Для начала нам нужно задать интервал обработки.
Первое что приходит в голову - открыть ленту за нужную дату и скролить ее, используя в качестве маркеров начала и конца заданные даты.
Тут появляется две проблемы:
1. В общей ленте не отображаются
- посты со слишком низким рейтингом
- посты в корзине
- посты из закрытых сообществ
2. Рекламные посты. Их структура отличается от обычных публикаций. Если мы попробуем обработать их по схеме пользовательских постов, это вызовет ошибки.
Значит применим другой подход: будем "прыгать" по постам используя уникальный ID.
На картинке ниже приведена схема определения интервала обработки.
Логика простая. Например: нам нужно получить информацию за 15 ноября.
Если вы откроете ленту за любую дату, то обратите внимание, что в самом верху будет самый последний пост за эту дату. Эту особенность мы и используем.
Программа заходит в ленту за дату предыдущую 15 ноября (14 ноября) , считывает ID самого последнего поста в ленте, передает ее в метод, который начинает последовательно заходить в посты, увеличивая полученный ID на единицу и сверять дату. В качестве маркера выступает дата 15.ноября. Как только программа натыкается на пост с датой 15 ноября, она записывает его ID. Это наша точка начала.
Аналогично происходит и с конечной точкой, только мы берем ID последнего поста в ленте за 15 ноября, последовательно переходим по постам пока не изменится дата, и сохраняем ID последнего поста перед тем, как дата изменилась.
В итоге мы получили интервал ID, с которым можно работать.
Код поиска первого и последнего ID для интересующихся. Посты с рекламой 404 игнорируются
Сам код парсера. Инфу засовываю все MySQL.
GatewaySQL
Надеюсь кому-то было полезно. На вопросы отвечу в комментах