Как парсех Хабр, част 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, който рестартира айфоните. Още една статия антивирусът откри по-късно, по време на сканата на системата: пост 338586 за скриптове на сайта на зоомагазина, които използват процесора на потребителя за добив на криптовалута. Така че, може да се смята, че работата на антивируса е напълно адекватна.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как парсех Хабр, част 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.

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

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

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

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

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

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