Калі быў даедзены навагодні аліўе, мне стала няма чаго рабіць, і я вырашыў спампаваць сабе на кампутар усе артыкулы з Хабрахабра (і сумежных платформаў) і даследаваць.
Атрымалася некалькі цікавых сюжэтаў. Першы з іх - гэта развіццё фармату і тэматыкі артыкулаў за 12 гадоў існавання сайта. Напрыклад, дастаткова паказальная дынаміка некаторых тэм. Працяг - пад катом.
Працэс парсінгу
Каб зразумець, як развіваўся Хабр, трэба было абыйсці па ўсіх яго артыкулах і вылучыць з іх метаінфармацыю (напрыклад, даты). Абыход даўся лёгка, таму што спасылкі на ўсе артыкулы маюць выгляд "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.5 гігабайта, каментары з метаінфармацыяй – яшчэ 3, і каля сотні мегабайт – метаінфармацыя аб артыкулах. Такое можна поўнасцю трымаць у аператыўнай памяці, што было для мяне прыемнай нечаканасцю.
Пачаў аналіз артыкулаў я не з саміх тэкстаў, а з метаінфармацыі: дат, тэгаў, хабаў, праглядаў і "лайкаў". Аказалася, што і яна можа шмат расказаць.
Трэнды развіцця Хабрахабра
Артыкулы на сайце публікуюцца з 2006 года; найбольш інтэнсіўна - у 2008-2016 гадах.
Наколькі актыўна гэтыя артыкулы чыталі ў розны час, ацаніць не так проста. Тэксты 2012 года і маладзейшыя больш актыўна каментавалі і рэйтынгавалі, але ў больш новых тэкстаў больш праглядаў і дадання ў закладкі. Аднолькава паводзілі сябе (удвая ўпалі) гэтыя метрыкі толькі аднойчы, у 2015 годзе. Магчыма, у сітуацыі эканамічнага і палітычнага крызісу ўвага чытачоў перайшла з айцішных блогаў да больш балючых пытанняў.
Акрамя саміх артыкулаў, я выкачаў яшчэ каментары да іх. Каментароў атрымалася 6 мільёнаў, праўда, 240 тысяч з іх апынуліся забаненымі ("нло прыляцела і апублікавала гэты надпіс тут"). Карысная ўласцівасць каментароў у тым, што для іх паказаны час. Вывучаючы час каментароў, можна прыкладна зразумець і тое, калі ўвогуле артыкулы чытаюць.
Аказалася, што большую частку артыкулаў і пішуць, і каментуюць недзе з 10 да 20 гадзін, г.зн. у тыповы маскоўскі працоўны дзень. Гэта можа значыць і што Хабр чытаюць у прафесійных мэтах, і што гэта добры спосаб пракрасцінацыі на працы. Дарэчы, гэтае размеркаванне часу сутак стабільна з самага заснавання Хабра да сённяшняга дня.
Аднак асноўная карысць ад пазнакі часу каментара - не час сутак, а тэрмін "актыўнага жыцця" артыкула. Я падлічыў, як размеркаваны час ад публікацыі артыкула да яго каментара. Аказалася, што зараз медыяны каментар (зялёная лінія) прыходзіць прыкладна праз 20 гадзін, г.зн. у першыя суткі пасля публікацыі пакідаюць у сярэднім крыху больш за палову ўсіх каментароў да артыкула. А за двое сутак пакідаюць 75 працэнтаў усіх каментароў. Пры гэтым раней артыкулы чыталі яшчэ хутчэй - так, у 2010 годзе палова каментароў прыходзіла ўжо ў першыя 6 гадзін.
Для мяне стала сюрпрызам, што каментары падаўжэлі: сярэдняя колькасць сімвалаў у каментары за час існавання Хабра вырасла амаль удвая!
Прасцейшая зваротная сувязь, чым каментары - гэта галасы. У адрозненне ад многіх іншых рэсурсаў, на Хабры можна ставіць не толькі плюсы, але і мінусы. Зрэшты, апошняй магчымасцю чытачы карыстаюцца не так часта: бягучая доля дызлайкаў складае каля 15% ад усіх аддадзеных галасоў. Раней было больш, але з цягам часу чытачы папрыгажэлі.
Змяняліся з часам і самі тэксты. Напрыклад, тыповая даўжыня тэксту не спыняе ўстойліва расці з самага запуску сайта, нягледзячы на ??крызісы. За дзесяцігоддзе тэксты сталі амаль у дзесяць разоў даўжэйшыя!
Стылістыка тэкстаў (у першым набліжэнні) таксама мянялася. За першыя гады існавання Хабра, напрыклад, вырасла доля кода і лікаў у тэкстах:
Разабраўшыся з агульнай дынамікай сайта, я вырашыў вымераць, як мянялася папулярнасць розных тэм. Тэмы можна выдзяляць з тэкстаў аўтаматычна, але для пачатку можна не вынаходзіць ровар, а скарыстацца гатовымі тэгамі, прастаўленымі аўтарамі кожнага артыкула. Чатыры тыповых трэнду я вывеў на графіцы. Тэма "Google" першапачаткова дамінавала (магчыма, у асноўным у сувязі з SEO-аптымізацыяй), але з кожным годам губляла вагу. Javascript быў папулярнай тэмай і працягвае паступова, а вось машыннае навучанне пачало імкліва набіраць папулярнасць толькі ў апошнія гады. Linux жа застаецца аднолькава актуальным на працягу ўсяго дзесяцігоддзя.
Вядома ж, мне стала цікава, якія тэмы прывабліваюць больш чытацкай актыўнасці. Я падлічыў медыянную колькасць праглядаў, галасоў і каментароў у кожнай тэме. Вось што атрымалася:
- Самыя прагляданыя тэмы: arduino, вэб-дызайн, вэб-распрацоўка, дайджэст, спасылкі, css, html, html5, nginx, алгарытмы.
- Самыя "лайкабельныя" тэмы: вконтакте, гумар, jquery, opera, c, html, вэб-распрацоўка, html5, css, вэб-дызайн.
- Самыя абмяркоўваюцца тэмы: opera, skype, фрыланс, вконтакте, ubuntu, праца, nokia, nginx, arduino, firefox.
Дарэчы, раз ужо я параўноўваю тэмы, можна зрабіць іх рэйтынг па частаце (і параўнаць вынікі з
- За ўсе гады існавання Хабра самымі папулярнымі тэгамі (у парадку змяншэння) сталі 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