Как парснах Хабр, част 1: тенденции

Когато новогодният оливие беше изяден, няма какво да правя и реших да сваля всички статии от Хабрахабра (и свързани платформи) на компютъра си и да ги изследвам.

Получиха се няколко интересни сюжета. Първият от тях е развитието на формата и темата на статиите за 12 години от съществуването на сайта. Например, динамиката на някои теми е редовно показателна. Продължението е по-долу.

Как парснах Хабр, част 1: тенденции

Процес на парсинг

За да разбера как се е развивал Хабр, трябваше да прегледам всички негови статии и да извлека метаинформация (например, дати). Прегледът не беше труден, защото линковете на всички статии имат вида "habrahabr.ru/post/337722/", като номерата са зададени строго последователно. Знаейки, че последната публикация има номер малко под 350 хиляди, просто преминах през всички възможни id на документите с цикъл (код на Python):

import numpy as np
from multiprocessing import Pool
with Pool(100) as p:
    docs = p.map(download_document, np.arange(350000))

Функция download_document опитва да зарежда страницата с подходящия id и се опитва да извлече съдържателна информация от html структурата.

import requests
from bs4 import BeautifulSoup

def download_document(pid):
    """ Изтегля и обработва документ от Хабр и неговите коментари """
    # изтегляне на документа
    r = requests.get('https://habrahabr.ru/post/' +str(pid) + '/')
    # парсинг на документа
    soup = BeautifulSoup(r.text, 'html5lib') # вместо html.parser
    doc = {}
    doc['id'] = pid
    if not soup.find("span", {"class": "post__title-text"}):
        # това се случва, ако статията не е съществувала или е изтрита
        doc['status'] = 'title_not_found'
    else:
        doc['status'] = 'ok'
        doc['title'] = soup.find("span", {"class": "post__title-text"}).text
        doc['text'] = soup.find("div", {"class": "post__text"}).text
        doc['time'] = soup.find("span", {"class": "post__time"}).text
        # създаване на други полета: хъбове, тагове, прегледи, коментари, гласове и т.н.
        # ...
    # запазване на резултата в отделен файл
    fname = r'files/' + str(pid) + '.pkl'
    with open(fname, 'wb') as f:
        pickle.dump(doc, f)

В процеса на парсинг открих няколко нови аспекта.

На първо място, казват, че е безполезно да съзнаваш повече процеси от ядрото в процесора. Но в моя случай се оказа, че лимитиращият ресурс не е процесорът, а мрежата, и 100 процеса работят по-бързо от 4 или, да кажем, 20.

На второ място, в някои постове имаше комбинации от специални символи — например, евфемизми като "%&@#". Оказа се, че html.parser, който използвах в началото, реагира на комбинацията &@# болезнено, считайки я за начало на html-субстанция. Бях готов да творя черна магия, но на форума ми подсказаха, че мога просто да сменя парсера.

На трето място, успях да изтегля всички публикации с изключение на три. Документите с номера 65927, 162075 и 275987 бяха незабавно премахнати от моя антивирус. Това са статии съответно за веригата JavaScript, която зарежда злонамерен PDF, SMS изнудвач, състоящ се от набор от приставки за браузъри, и сайта CrashSafari.com, който принуждава iPhone-ите да се рестартират. Още една статия антивирусът откри по-късно, по време на сканирование на системата: пост 338586 за скриптове на сайта на зоомагазин, които използват процесора на потребителя за добив на криптовалута. Така че работата на антивируса може да се счита за напълно адекватна.

"Живи" статии се оказаха само половината от потенциалния максимум — 166307 броя. За останалите Хабр предлага опции "страницата е остаряла, била е изтрита или изобщо не е съществувала". Както и да е, всяко нещо се случва.

След изтеглянето на статиите последва техническа работа: например, датите на публикуване трябваше да бъдат преведени от формата "’21 декември 2006 в 10:47" в стандартен формат, datetime, а "12,8k" посещения — в 12800. На този етап излязоха още няколко казуса. Най-забавният е свързан с броенето на гласовете и типовете данни: в някои стари постове е настъпило преливане на инта и те получиха по 65535 гласа.

Как парснах Хабр, част 1: тенденции

В резултат текстовете на статиите (без картинки) заеха 1.5 гигабайта, коментарите с метаинформация — още 3, и около сто мегабайта — метаинформация за статиите. Такова количество може напълно да се държи в оперативната памет, което се оказа приятно изненадващо за мен.

Започнах анализа на статиите не с самите текстове, а с метаинформацията: дати, тагове, хъбове, посещения и "лайкове". Оказа се, че и тя може да разкаже много.

Тенденции в развитието на Хабрахабра

Статиите на сайта се публикуват от 2006 г.; най-интензивно — през 2008-2016 г.

Как парснах Хабр, част 1: тенденции

Оценката на това колко активно са били четени тези статии през различно време не е толкова проста. Текстовете от 2012 г. и по-младите бяха коментирани и оценявани по-активно, но по-новите текстове имат повече посещения и добавяния в любими. Тези метрики реагираха по един и същи начин (паднаха наполовина) само веднъж, през 2015 г. Вероятно в ситуация на икономическа и политическа криза вниманието на читателите се премести от айти блоговете към по-болезнени въпроси.

Как парснах Хабр, част 1: тенденции

Освен самите статии, изтеглих и коментарите към тях. Коментарите се оказаха 6 милиона, като 240 хиляди от тях бяха забранени ("НЛО е приземило и е публикувало това съобщение тук"). Полезното свойство на коментарите е, че за тях е посочено време. Изучавайки времето на коментарите, можем да разберем и кога изобщо се четат статиите.

Оказа се, че най-голямата част от статиите и коментарите се пишат и коментират някъде между 10 и 20 часа, т.е. в типичния московски работен ден. Това може да означава, че Хабр се чете с професионална цел, както и че е добър начин за прокрастинация на работа. Между другото, това разпределение на времето е стабилно от самото основаване на Хабр до днешна дата.

Как парснах Хабр, част 1: тенденции

Но основната полза от времевия маркер на коментара не е времето на деня, а срокът на "активен живот" на статията. Изчислих как е разпределено времето от публикуването на статията до нейния коментар. Оказа се, че в момента медианният коментар (зелената линия) идва приблизително след 20 часа, т.е. през първите 24 часа след публикацията оставят средно малко повече от половината от всички коментари към статията. А през двата дни оставят 75% от всички коментари. Въпреки това по-рано статиите се четяха дори по-бързо — така, през 2010 година половината коментари идваха вече в первые 6 часа.

Как парснах Хабр, част 1: тенденции

За мен беше изненада, че коментарите са се удължили: средното количество символи в коментарите през времето на съществуването на Хабр е нараснало почти двойнo!

Как парснах Хабр, част 1: тенденции

По-простата обратна връзка от коментарите са гласуванията. В отличие от много други ресурси, на Хабр можем да слагаме не само плюсове, но и минуси. Въпреки това, читателите не използват последната възможност толкова често: текущата дял на дизлайковете е около 15% от всички дадени гласове. Преди беше повече, но с времето читателите станаха по-добри.

Как парснах Хабр, част 1: тенденции

С времето се промениха и самите текстове. Например, типичната дължина на текста не спира да расте от самото начало на сайта, въпреки кризите. За десетилетие текстовете станаха почти десет пъти по-дълги!

Как парснах Хабр, част 1: тенденции

Стилът на текстовете (в първата приближеност) също се е променил. За първите години от съществуването на Хабр, например, нарасна делът на кода и числата в текстовете:

Как парснах Хабр, част 1: тенденции

След като разбрах общата динамика на сайта, реших да измеря как популярността на различните теми се е променила. Темите могат да се извлекат автоматично от текстовете, но за начало може да не изобретяваме велосипеда и да се възползваме от готовите тагове, зададени от авторите на всяка статия. Четири типични тренда изведох на графиката. Темата "Google" първоначално доминираше (възможно, основно заради SEO оптимизация), но с всяка изминала година загуби значение. Javascript беше популярна тема и продължава да бъде, а машинното обучение започна стремително да увеличава популярността си само в последните години. Linux остава еднакво актуален през цялото десетилетие.

Как парснах Хабр, част 1: тенденции

Разбира се, ми стана интересно кои теми привлекат повече читателска активност. Изчислих медианния брой на прегледи, гласове и коментари по всяка тема. Ето какво се получи:

  • Най-преглежданите теми: arduino, уеб дизайн, уеб разработка, дайджест, линкове, css, html, html5, nginx, алгоритми.
  • Най-"лайкаемите" теми: вконтакте, хумор, jquery, opera, c, html, уеб разработка, html5, css, уеб дизайн.
  • Най-дискутираните теми: opera, skype, фриланс, вконтакте, ubuntu, работа, nokia, nginx, arduino, firefox.

Кстати, ако вече сравнявам темите, мога да направя техен рейтинг по честота (и да сравня резултатите с аналогична статия от 2013 година).

  • През всичките години съществуване на Хабра, най-популярните тагове (в низходящ ред) станаха google, android, javascript, microsoft, linux, php, apple, java, python, програмиране, стартапи, разработка, ios, стартап, социални мрежи.
  • През 2017 година най-популярни бяха javascript, python, java, android, разработка, linux, c++, програмиране, php, c#, ios, машинно обучение, информационна сигурност, microsoft, react.

При сравнението на тези рейтинги може да се обръща внимание, например, на победоносния улер на Python и изчезването на php, или на "залеза" на стартап темата и възхода на машинното обучение.

Не всички тагове в Хабра имат толкова очевидна тематична окраска. Например, ето десет тагове, които са се появили само веднъж, но ми се сториха забавни. Така че: "идея движител на прогреса", "зареждане от образа на дискета", "щат Айова", "драматургия", "супералеша", "паров двигател", "какво да правя в събота", "при мен лисица в месомелачка", "а стана като винаги", "не успях да измисля смешни тагове". За да определим тематиката на такива статии, таговете не са достатъчни — ще трябва да се извърши тематично моделиране над текстовете на статии.

По-подробен анализ на съдържанието на статиите ще има в следващия пост. Първо, планирам да изградя модел, предсказващ броя на прочитанията на статията в зависимост от нейното съдържание. Второ, искам да науча невронната мрежа да генерира текстове в същата стилистика, каквато имат авторите на Хабра. Така че, абонирайте се 🙂

P.S. А ето и запечатаният датасет.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster