Kuidas ma parserisin Habr, osa 1: trendid

Kui olin uue aasta Olivier salati Àra söönud, polnud mul midagi teha ja otsustasin alla laadida kÔik Habr-Habra artiklid (ja sarnased platvormid) ning uurida neid.

Tulemusena sain kokku mitmeid huvitavaid teemasid. Esimene neist on artikkelformaatide ja -teemade areng 12 aasta jooksul alates saidi asutamisest. NĂ€iteks on mĂ”nede teemade dĂŒnaamika ĂŒsna rÀÀgib. JĂ€tkub allpool.

Kuidas ma parserisin Habr, osa 1: trendid

Parsimise protsess

Kuna Habr on pidanud lĂ€bi vaatama kĂ”ik oma artiklid ja eraldama neilt metaandmed (nt kuupĂ€evad). Ülevaade oli lihtne, kuna kĂ”igi artiklite lingid jĂ€rgivad struktuuri "habrahabr.ru/post/337722/", kusjuures numbrid on rangelt jĂ€rjestatud. Teades, et viimasel postitusel on number veidi vĂ€hem kui 350 tuhat, kĂŒkitasin lihtsalt kĂ”ik vĂ”imalikud dokumentide id-d tsĂŒkliga (Python'i kood):

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

Funktsioon download_document ĂŒritab laadida lehe vastava id-ga ja pĂŒĂŒab HTML struktuurist vĂ€ljatĂ”mmata sisulist teavet.

import requests
from bs4 import BeautifulSoup

def download_document(pid):
    """ Laadi alla ja töötle Habr dokumenti ja selle kommentaare """
    # dokumendi vÀlja laadimine
    r = requests.get('https://habrahabr.ru/post/' +str(pid) + '/')
    # dokumendi parsimine
    soup = BeautifulSoup(r.text, 'html5lib') # html.parser asemel
    doc = {}
    doc['id'] = pid
    if not soup.find("span", {"class": "post__title-text"}):
        # selliseid juhtumeid juhtub, kui artikkel ei eksisteeri vÔi on kustutatud
        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
        # loo teised vÀljad: hubid, sildid, vaated, kommentaarid, hÀÀled jne.
        # ...
    # tulemuse salvestamine eraldi failina
    fname = r'files/' + str(pid) + '.pkl'
    with open(fname, 'wb') as f:
        pickle.dump(doc, f)

Parsimise protsessi kÀigus avastasin mitu uut hetke.

Esiteks öeldakse, et protsesside loomine, mis ĂŒletavad protsessori tuumade arvu, on kasutu. Kuid minu puhul selgus, et piirav ressurss on mitte protsessor, vaid vĂ”rk, ja 100 protsessi töötavad kiiremini kui 4 vĂ”i nĂ€iteks 20.

Teiseks, mĂ”nes postituses esines kombinatsioone erimĂ€rkidest — nĂ€iteks eufemisme nagu "%&#@". Selgus, et html.parser, mida ma alguses kasutasin, reageerib kombinatsioonile &# valusalt, pidades seda html-olendi alguseks. Olin juba valmis musta maagia tegemiseks, kuid foorumis öeldi, et lihtsalt parserit vahetad.

Kolmandaks, Ă”nnestus mul eksportida kĂ”ik postitused, vĂ€lja arvatud kolm. Dokumendid numbritega 65927, 162075 ja 275987 kustutas mu viirusetĂ”rje kohe. Need artiklid kĂ€sitlevad vastavalt JavaScripti ahelat, mis laadib alla pahavara PDF-faili, SMS-i vĂ€ljapressijat brauseri pluginate komplektina ning veebisaiti CrashSafari.com, mis viib iPhone'id taaskĂ€ivituma. Veel ĂŒks artikkel, postitus 338586, milles rÀÀgitakse loomaĂ€ri veebisaidil kasutatavatest skriptidest, mis kasutavad kasutaja protsessorit krĂŒptovaluuta kaevandamiseks, tuvastas viirusetĂ”rje hiljem sĂŒsteemi skaneerimise kĂ€igus. Seega vĂ”ib arvata, et viirusetĂ”rje töö oli tĂ€iesti adekvaatne.

"Elusaid" artikleid oli vaid pool potentsiaalsest maksimumist — 166307 tĂŒkki. ÜlejÀÀnud osas ĂŒtleb Habr variandid "leht on aegunud, eemaldatud vĂ”i ei eksisteerinud ĂŒldse". Nojah, igasuguseid asju juhtub.

Artiklite eksportimisele jĂ€rgnes tehniline töö: nĂ€iteks tuli avaldamise kuupĂ€evad muuta vormingust "'21. detsember 2006 kell 10:47" standardseks datetime, ja "12,8k" vaatamist - 12800-ks. Sellel etapil tuli ilmsiks veel mĂ”ned kummalisused. KĂ”ige naljakam on seotud hÀÀlte arvestamise ja andmetĂŒĂŒpidega: mĂ”nedes vanades postitustes toimus tĂ€isarvu ĂŒletĂ€itumine ja need said 65535 hĂ€elt.

Kuidas ma parserisin Habr, osa 1: trendid

Tulemuseks oli see, et artiklite (ilma piltideta) tekstid vĂ”tsid mul 1,5 gigabaiti, kommentaarid koos metaandmetega veel 3 ja umbes sada megabaiti — artiklite metaandmeid. Sellise koguse sai tĂ€iesti hoida töömĂ€lus, mis oli mulle meeldiv ĂŒllatus.

Alustasin artiklite analĂŒĂŒsi mitte tekstidest, vaid metaandmetest: kuupĂ€evadest, sildidest, hubidest, vaatamistest ja "meeldimistest". Selgus, et ka need vĂ”ivad palju rÀÀkida.

HabrHubi arengusuunad

Artikleid on veebisaidil avaldatud alates 2006. aastast; kĂ”ige aktiivsemalt 2008–2016.

Kuidas ma parserisin Habr, osa 1: trendid

Mida aktiivsemalt neid artikleid eri aegadel loeti, on keeruline hinnata. 2012. aasta ja nooremaid tekste kommenteeriti ja hinnati aktiivsemalt, kuid uuematel tekstidel on enam vaatamisi ja lisamisi jĂ€rjehoidjatesse. Need nĂ€itajad kĂ€itusid ĂŒhekordselt ĂŒhtmoodi (kaks korda langesid) ainult 2015. aastal. VĂ”ib-olla, seoses majanduslike ja poliitiliste kriisidega, pöördus lugejate tĂ€helepanu IT-blogidelt valusamate kĂŒsimuste poole.

Kuidas ma parserisin Habr, osa 1: trendid

Lisaks artiklitele kogusin ka nende kommentaare. Kommentaare oli kokku 6 miljonit, kuid 240 000 neist osutusid keelatud olevateks ("UFO tuli ja avaldas selle kirja siin"). Kommentaaride kasulik omadus on see, et neile on mĂ€rkitud aeg. Uurides kommentaaride aega, vĂ”ib umbkaudu mĂ”ista, millal ĂŒldse artikleid loetakse.

Selgus, et enamik artikleid kirjutatakse ja kommenteeritakse kuskil kella 10–20 vahel, st tĂŒĂŒpilise Moskva tööpĂ€eva jooksul. See vĂ”ib tĂ€hendada, et Habrit loetakse ametlikel eesmĂ€rkidel ja see on hea viis tööl prokrastineerimiseks. Muide, see pĂ€evane jaotus on pĂŒsiv alates Habri asutamisest kuni tĂ€naseni.

Kuidas ma parserisin Habr, osa 1: trendid

Siiski, peamine eelisema mĂ€rkmete ajast on mitte pĂ€evaaeg, vaid artikli "aktiivse elu" kestus. Arvutasin, kuidas on jaotatud aeg artikli avaldamisest tema kommentaarideni. Selgus, et praegu jĂ”uab keskmine kommentaar (roheline joon) umbes 20 tunni pĂ€rast, st esimese 24 tunni jooksul jÀÀb keskmiselt veidi ĂŒle poole kĂ”igist artikli kommentaaridest. Kahe pĂ€eva jooksul jĂ€etakse 75% kĂ”igist kommentaaridest. Samas loeti artikleid varem veelgi kiiremini — nĂ€iteks 2010. aastal jĂ”udis pool kommentaare juba esimestel 6 korral.

Kuidas ma parserisin Habr, osa 1: trendid

Minu jaoks oli ĂŒllatav, et kommentaarid on pikenetud: keskmine mĂ€rksĂ”nade arv kommentaaris on Habri eksisteerimise aja jooksul peaaegu kahekordistunud!

Kuidas ma parserisin Habr, osa 1: trendid

Lihtsam tagasiside kui kommentaarid on hÀÀled. Erinevalt paljusid teisi ressursse, saab Habris anda mitte ainult plusse, vaid ka miinuseid. Siiski, viimase vÔimaluse kasutamine pole nii sage: praegune mitte-meeldimise osakaal on umbes 15% kÔikidest antud hÀÀltest. Varem oli neid rohkem, kuid aja jooksul on lugejad muutunud kinderaks.

Kuidas ma parserisin Habr, osa 1: trendid

Aja jooksul on muutunud ka tekstid ise. NĂ€iteks tĂŒĂŒpiline teksti pikkus ei lakka pidevalt kasvamast alates saidi kĂ€ivitamisest, hoolimata kriisidest. Üheksa aasta jooksul on tekstid muutunud peaaegu kĂŒmme korda pikemaks!

Kuidas ma parserisin Habr, osa 1: trendid

Tekstide stiil (esimeses lÀhenemises) on samuti muutunud. Habri esimesel toimeaastal, nÀiteks, tÔusis koodide ja numbrite osakaal tekstides:

Kuidas ma parserisin Habr, osa 1: trendid

MĂ”istes saidi ĂŒlddĂŒnaamikat, otsustasin mÔÔta, kuidas erinevate teemade populaarsus on muutunud. Teemasid saab tekstidest automaatselt vĂ€lja tuua, kuid alguses ei pea ratast uuesti leiutama, vaid vĂ”ib kasutada iga artikli autori mÀÀratud valmis silte. Neli tĂŒĂŒpilist trendi tĂ”in vĂ€lja graafikule. Teema „Google“ domineeris algselt (vĂ”imalik, et peamiselt SEO optimeerimise tĂ”ttu), kuid iga aastaga kaotas see kaalu. Javascript oli populaarne teema ja jĂ€tkab aeglaselt tĂ”usmist, samas kui masinĂ”pe hakkas viimastel aastatel kiiresti populaarsust koguma. Linux jÀÀb aga kogu kĂŒmnendi jooksul sama aktuaalseks.

Kuidas ma parserisin Habr, osa 1: trendid

Loomulikult tekkis mul huvi, millised teemad köidavad rohkem lugejate tÀhelepanu. Otsustasin lugeda vÀlja iga teema mediaanvaatamiste, hÀÀlte ja kommentaaride arvu. Siin on tulemused:

  • KĂ”ige rohkem vaadatud teemad: arduino, veebidisain, veebiarendus, ĂŒlevaade, lingid, css, html, html5, nginx, algoritmid.
  • KĂ”ige „meelditud“ teemad: vk, huumor, jquery, opera, c, html, veebiarendus, html5, css, veebidisain.
  • KĂ”ige arutatavad teemad: opera, skype, vabakutseline töö, vk, ubuntu, töö, nokia, nginx, arduino, firefox.

Üksikasjalikult, kuna ma vĂ”rdlen teemasid, vĂ”ib nende reitingu sageduse jĂ€rgi luua (ja vĂ”rrelda tulemusi sarnase artikliga aastast 2013).

  • Kogu Habr'i eksisteerimise jooksul on kĂ”ige populaarsemateks siltideks (jĂ€rjestuses languse jĂ€rgi) saanud google, android, javascript, microsoft, linux, php, apple, java, python, programmeerimine, startup'id, arendus, ios, startup, sotsiaalsed vĂ”rgustikud.
  • Aastal 2017 olid kĂ”ige populaarsemad javascript, python, java, android, arendus, linux, c++, programmeerimine, php, c#, ios, masinĂ”pe, teabelekke kaitse, microsoft, react.

Nende reitingute vĂ”rreldes vĂ”ib tĂ€helepanu pöörata nĂ€iteks Python'i vĂ”idukĂ€igule ja php kadumisele, vĂ”i „startupi“ teema loojumise ja masinĂ”ppe tĂ”usule.

Kaugel ei ole kĂ”ik Habris olevad sildid nii ilmselt seotud oma teemaga. NĂ€iteks siin on kĂŒmme sildid, mis esinesid vaid ĂŒks kord, kuid tundusid mulle lihtsalt naljakad. Nii et: "idee on edusamme liigutav jĂ”ud", "bootimine ketta kujutiselt", "Iowa osariik", "dramatiseerimine", "superaljasha", "aurumootor", "mida teha laupĂ€eval", "mul on rebane lihaveskis", "aga lĂ€ks ikka nagu alati", "naljakaid silte vĂ€lja mĂ”elda ei Ă”nnestunud". Selliste artiklite temaatika mÀÀramiseks ei piisa ainult siltidest — tuleb teostada temaatiline modelleerimine artiklite tekstide pĂ”hjal.

Üksikasjalikum analĂŒĂŒs artiklite sisust on jĂ€rgmises postituses. Esiteks kavatsen koostada mudeli, mis prognoosib artikli vaatamiste arvu selle sisu pĂ”hjal. Teiseks tahan Ă”petada neuralvĂ”rku genereerima tekste samas stiilis nagu Habr autorid. Nii et jĂ€lgige meid 🙂

P.S. Siin on jahvatatud andmekogum.

Allikas: habr.com

Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid - ProHoster