Hur jag parserade Habr, del 1: trender

NÀr den nyÄriga oliven var slut, fanns det inget mer att göra, sÄ jag bestÀmde mig för att ladda ner alla artiklar frÄn Habrakhabr (och relaterade plattformar) till min dator och undersöka dem.

Det resulterade i flera intressanta berÀttelser. Den första av dem handlar om utvecklingen av formatet och Àmnena i artiklarna under 12 Är av webbplatsens existens. Till exempel Àr dynamiken hos vissa teman ganska talande. FortsÀttning följer nedan.

Hur jag parserade Habr, del 1: trender

Parse-processen

För att förstÄ hur Habr har utvecklats var jag tvungen att gÄ igenom alla artiklar och extrahera meta-information (till exempel datum). Att göra det gick lÀtt, eftersom lÀnkarna till alla artiklar ser ut som "habrahabr.ru/post/337722/", och numren Àr strikt i ordning. Med vetskapen om att det senaste inlÀgget har ett nummer lite under 350 000, gick jag bara igenom alla möjliga dokument-id med en loop (kod i Python):

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

Funktionen download_document försöker ladda sidan med motsvarande id och försöker hÀmta innehÄllsinformation frÄn html-strukturen.

import requests
from bs4 import BeautifulSoup

def download_document(pid):
    """ Ladda ner och bearbeta ett Habr-dokument och dess kommentarer """
    # hÀmta dokumentet
    r = requests.get('https://habrahabr.ru/post/' + str(pid) + '/')
    # analysera dokumentet
    soup = BeautifulSoup(r.text, 'html5lib') # istÀllet för html.parser
    doc = {}
    doc['id'] = pid
    if not soup.find("span", {"class": "post__title-text"}):
        # sÄ kan hÀnda om artikeln inte existerade eller togs bort
        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
        # skapa andra fÀlt: hubbar, taggar, visningar, kommentarer, röster, etc.
        # ...
    # spara resultatet i en separat fil
    fname = r'files/' + str(pid) + '.pkl'
    with open(fname, 'wb') as f:
        pickle.dump(doc, f)

Under parse-processen upptÀckte jag flera nya saker.

För det första sÀger man att det Àr meningslöst att skapa fler processer Àn kÀrnor i processorn. Men i mitt fall visade det sig att den begrÀnsande resursen Àr inte processorn utan nÀtverket, och 100 processer arbetar snabbare Àn 4 eller, sÀg, 20.

För det andra, i vissa inlĂ€gg fanns det kombinationer av specialtecken — till exempel eufemismer som "%&#@". Det visade sig att html.parser, som jag anvĂ€nde först, reagerar pĂ„ kombinationen &# smĂ€rtsamt och anser att det Ă€r början pĂ„ en html-enhet. Jag tĂ€nkte redan pĂ„ att göra svart magi, men pĂ„ forumet föreslogs det att man bara kunde byta parser.

För det tredje lyckades jag överföra alla publikationer, utom tre. Dokumenten med nummer 65927, 162075 och 275987 raderades omedelbart av min antivirusprogram. Dessa artiklar handlar om en JavaScript-kedja som laddar en skadlig pdf, en SMS-uttömningsattack i form av ett plugin-set för webblÀsare och sidan CrashSafari.com, som fÄr iPhones att starta om. En annan artikel upptÀckte antivirusprogrammet senare, under systemscanning: inlÀgg 338586 om skript pÄ en djuraffÀrs hemsida som utnyttjar anvÀndarens processor för kryptovaluta-mining. SÄ man kan anse att antivirusets arbete varit fullt tillfredsstÀllande.

"Levande" artiklar utgjorde bara hĂ€lften av den potentiella maxkapaciteten — 166307 stycken. För de andra ger Habr alternativ som "sidan Ă€r förĂ„ldrad, har tagits bort eller existerade inte överhuvudtaget". NĂ„vĂ€l, sĂ„nt hĂ€nder.

Efter överföringen av artiklarna följde tekniskt arbete: exempelvis behövde publiceringsdatum konverteras frÄn formatet "21 december 2006 10:47" till standardformat, datetime, och "12,8k" visningar behövde omvandlas till 12800. Vid detta steg dök det upp nÄgra fler knasigheter. Den roligaste var kopplad till röstberÀkningen och datatyper: i vissa gamla inlÀgg intrÀffade ett heltalsöverflöd och de fick 65535 röster.

Hur jag parserade Habr, del 1: trender

Som ett resultat tog texterna till artiklarna (utan bilder) 1,5 gigabyte, och kommentarer med meta-information tog ytterligare 3, och cirka hundra megabyte gick till meta-information om artiklarna. SÄdant kan hÄllas helt i RAM, vilket var en trevlig överraskning för mig.

Jag började analysera artiklarna, inte med texterna sjÀlva, utan med metadata: datum, taggar, hubbar, visningar och "gilla". Det visade sig att Àven detta kunde berÀtta mycket.

Trender för utvecklingen av Habr

Artiklar publiceras pÄ webbplatsen sedan 2006; mest intensivt mellan 2008 och 2016.

Hur jag parserade Habr, del 1: trender

Att bedöma hur aktivt dessa artiklar lÀstes vid olika tidpunkter Àr inte sÄ enkelt. Texter frÄn 2012 och yngre kommenterades och rankades mer aktivt, men nyare texter har fler visningar och sparningar. Dessa mÀtvÀrden uppvisade liknande beteende (de föll med hÀlften) endast en gÄng, 2015. Kanske i en situation med ekonomisk och politisk kris skiftade lÀsarnas uppmÀrksamhet frÄn IT-bloggar till mer brÀnnande frÄgor.

Hur jag parserade Habr, del 1: trender

Förutom artiklarna har jag Àven hÀmtat kommentarerna till dem. Det blev 6 miljoner kommentarer, men 240 000 av dem visade sig vara blockerade ("ett UFO har landat och publicerat detta meddelande hÀr"). En nyttig egenskap hos kommentarerna Àr att tiden anges. Genom att studera tidpunkten för kommentarerna kan man fÄ en ungefÀrlig förstÄelse för nÀr artiklarna lÀses överhuvudtaget.

Det visade sig att den största delen av artiklarna skrivs och kommenteras mellan klockan 10 och 20, det vill sÀga under en typisk arbetsdag i Moskva. Det kan betyda att Habr lÀses i professionella syften, och att det Àr ett bra sÀtt att procrastinera pÄ jobbet. Förresten har denna tidsfördelning varit stabil sedan Habr grundades fram till idag.

Hur jag parserade Habr, del 1: trender

Men den största nyttan med tidstĂ€mpeln för kommentarer Ă€r inte tidpunkten pĂ„ dagen, utan den "aktiva livslĂ€ngden" för artikeln. Jag rĂ€knade ut hur tiden fördelas frĂ„n publiceringen av artikeln till dess kommentar. Det visade sig att den nuvarande median-kommentaren (den gröna linjen) kommer ungefĂ€r 20 timmar senare, det vill sĂ€ga inom de första 24 timmarna efter publicering lĂ€mnar man i genomsnitt lite mer Ă€n hĂ€lften av alla kommentarer till artikeln. Efter tvĂ„ dagar lĂ€mnas 75% av alla kommentarer. Tidigare lĂ€stes artiklarna Ă€nnu snabbare — sĂ„, Ă„r 2010 kom hĂ€lften av kommentarerna redan inom de första 6 timmarna.

Hur jag parserade Habr, del 1: trender

Det blev en överraskning för mig att kommentarerna har blivit lÀngre: det genomsnittliga antalet tecken i kommentarerna har under Habrs existens nÀstan fördubblats!

Hur jag parserade Habr, del 1: trender

Ett enklare sÀtt att ge tillbaka Àn kommentarer Àr röster. Till skillnad frÄn mÄnga andra resurser kan man pÄ Habr ge bÄde plus och minus. Emellertid anvÀnds den senaste möjliga möjligheten inte sÄ ofta: den nuvarande andelen nedröster utgör cirka 15% av alla avgivna röster. Tidigare var det mer, men över tid har lÀsarna blivit snÀllare.

Hur jag parserade Habr, del 1: trender

Även texterna har förĂ€ndrats över tid. Till exempel fortsĂ€tter den typiska lĂ€ngden pĂ„ texterna att stadigt öka sedan webbplatsens lansering, trots kriser. PĂ„ ett decennium har texterna blivit nĂ€stan tio gĂ„nger lĂ€ngre!

Hur jag parserade Habr, del 1: trender

Stilen pÄ texterna (i första hand) har ocksÄ förÀndrats. Under de första Ären av Habrs existens har till exempel andelen kod och siffror i texterna ökat:

Hur jag parserade Habr, del 1: trender

Efter att ha förstĂ„tt den allmĂ€nna dynamiken pĂ„ webbplatsen ville jag mĂ€ta hur populariteten för olika Ă€mnen har förĂ€ndrats. Ämnen kan automatiskt identifieras frĂ„n texterna, men för att börja kan man enkelt anvĂ€nda de fĂ€rdiga taggarna som författarna till varje artikel har tilldelat. Jag har sammanfattat fyra typiska trender i en graf. Ämnet "Google" dominerade initialt (möjligtvis i stor utstrĂ€ckning pĂ„ grund av SEO-optimering), men förlorade gradvis i vikt varje Ă„r. Javascript var en populĂ€r Ă€mne och fortsĂ€tter att öka sakta, medan maskininlĂ€rning började fĂ„ fart först de senaste Ă„ren. Linux förblir lika relevant under hela decenniet.

Hur jag parserade Habr, del 1: trender

Naturligtvis blev jag nyfiken pÄ vilka Àmnen som attraherar mest lÀsaraktivitet. Jag rÀknade det mediala antalet visningar, betyg och kommentarer för varje Àmne. HÀr Àr resultatet:

  • De mest betraktade Ă€mnena: arduino, webbdesign, webbutveckling, sammanstĂ€llning, lĂ€nkar, css, html, html5, nginx, algoritmer.
  • De mest "gillade" Ă€mnena: vkontakte, humor, jquery, opera, c, html, webbutveckling, html5, css, webbdesign.
  • De mest diskuterade Ă€mnena: opera, skype, frilans, vkontakte, ubuntu, arbete, nokia, nginx, arduino, firefox.

Förresten, eftersom jag jÀmför Àmnen, kan vi göra en ranking baserat pÄ frekvens (och jÀmföra resultaten med en liknande artikel frÄn 2013).

  • Under alla Ă„r av existensen av Habra har de mest populĂ€ra taggarna (i fallande ordning) blivit google, android, javascript, microsoft, linux, php, apple, java, python, programmering, startups, utveckling, ios, startup, sociala nĂ€tverk.
  • År 2017 var de mest populĂ€ra javascript, python, java, android, utveckling, linux, c++, programmering, php, c#, ios, maskininlĂ€rning, informationssĂ€kerhet, microsoft, react.

NÀr man jÀmför dessa rankingar kan man till exempel uppmÀrksamma den segerrika gÄngen för Python och nedgÄngen för php, eller "solnedgÄngen" för startup-temat och uppgÄngen för maskininlÀrning.

Inte alla taggar pĂ„ Habr har en sĂ„ uppenbar tematisk koppling. HĂ€r Ă€r till exempel ett dussin taggar som bara förekommit en gĂ„ng, men som jag tyckte var roliga. SĂ„: "idĂ©n driver framsteg", "ladda frĂ„n bild av diskett", "delstat Iowa", "dramaturgi", "superaljesa", "Ă„ngmaskin", "vad göra pĂ„ lördagen", "jag har en rĂ€v i köttkvarnen", "och det blev som vanligt", "det gick inte att komma pĂ„ nĂ„gra roliga taggar". För att bestĂ€mma temat för sĂ„dana artiklar Ă€r taggar inte tillrĂ€ckliga — vi mĂ„ste göra tematisk modellering av artikeltexterna.

En mer detaljerad analys av artikelinnehĂ„llet kommer i nĂ€sta inlĂ€gg. För det första planerar jag att bygga en modell som förutspĂ„r antalet visningar av en artikel beroende pĂ„ dess innehĂ„ll. För det andra vill jag lĂ€ra en neuronnĂ€t att generera texter i samma stil som författarna pĂ„ Habr. SĂ„ prenumerera gĂ€rna 🙂

P.S. HÀr Àr den censurerade dataset.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster