Як я парсіў Хабр, частка 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):
    """ Download and process a Habr document and its comments """
    # выгрузка документа
    r = requests.get('https://habrahabr.ru/post/' +str(pid) + '/')
    # парсинг документа
    soup = BeautifulSoup(r.text, 'html5lib') # instead of 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
        # create other fields: hubs, tags, views, comments, votes, etc.
        # ...
    # сохранение результата в отдельный файл
    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 маментальна выдаліў мой антывірус. Гэта артыкулы адпаведна пра ланцужок джаваскрыптаў, які загружае шкодны pdf, SMS-вымагальнік у выглядзе набору плагінаў для браўзэраў, і сайт CrashSafari.com, які адпраўляе айфоны ў перазагрузку. Яшчэ адзін артыкул антывір выявіў пазней, падчас скана сістэмы: пост 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 гадзін, г.зн. у першыя суткі пасля публікацыі пакідаюць у сярэднім крыху больш за палову ўсіх каментароў да артыкула. А за двое сутак пакідаюць 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, або на "заход" стартаперскай тэматыкі і ўзлёт машыннага навучання.

Не ўсе тэгі на Хабры маюць такую ​​відавочную тэматычную афарбоўку. Вось, напрыклад, дзясятак тэгаў, якія сустракаліся ўсяго толькі адзін раз, але проста падаліся мне пацешнымі. Такім чынам: "ідэя рухавік прагрэсу", "загрузка з выявы дыскеты", "штат аява", "драматургія", "супералеша", "паравы рухавік", "чым заняцца ў суботу", "у мяне лісіца ў мясасечцы", "а атрымалася як заўсёды", "смешных тэгаў прыдумаць не ўдалося". Каб вызначыць тэматыку такіх артыкулаў, тэгаў недастаткова — давядзецца ажыццяўляць тэматычнае мадэляванне над тэкстамі артыкулаў.

Больш падрабязны аналіз зместу артыкулаў будзе ў наступным пасце. Па-першае, я збіраюся пабудаваць мадэль, якая прагназуе колькасць праглядаў артыкула ў залежнасці ад яго зместу. Па-другое, хочацца навучыць нейрасетку генераваць тэксты ў той жа стылістыцы, што і ў аўтараў Хабра. Так што падпісвайцеся 🙂

PS А вось і запіклёны датасет.

Крыніца: habr.com

Дадаць каментар