Kuidas ma parserisin Habr, osa 1: trendid

Kui olin jÔulusalati söönud, ei teadnud ma, mida teha, ja otsustasin alla laadida kÔik artiklid Habrhabr'ist (ja sarnastelt platvormidelt) ning uurida neid.

Tulemusena tuli vĂ€lja mitmeid huvitavaid lugusid. Esimene neist on artiklite formaadi ja temaatika areng 12 aasta jooksul, mil veebisait on tegutsenud. NĂ€iteks mĂ”ne teema dĂŒnaamika on ĂŒsna nĂ€itlik. JĂ€tkub pĂ€rast hĂŒpet.

Kuidas ma parserisin Habr, osa 1: trendid

PÀringute töötlemine

Habr'i arengu mĂ”istmiseks pidi ma lĂ€bi kĂ€ima kĂ”ik artiklid ja eristama neist metaandmed (nĂ€iteks kuupĂ€evad). Artiklite lĂ€bimine oli lihtne, kuna kĂ”ikide artiklite lingid on kujul "habrahabr.ru/post/337722/", ning numbrid on rangelt jĂ€rjestatud. Teades, et viimane postitus on numbrilt veidi alla 350 tuhande, kĂ€isin lihtsalt kĂ”ikide vĂ”imalike dokumendi ID-dega lĂ€bi 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 vastava ID-ga lehte ja pĂŒĂŒab HTML-struktuurist vĂ€lja tĂ”mmata sisulist teavet.

import requests
from bs4 import BeautifulSoup

def download_document(pid):
    """ Laadi ja töödelda Habr dokumenti ja selle kommentaare """
    # dokumendi laadimine
    r = requests.get('https://habrahabr.ru/post/' + str(pid) + '/')
    # dokumendi analĂŒĂŒs
    soup = BeautifulSoup(r.text, 'html5lib') # html.parser'i asemel
    doc = {}
    doc['id'] = pid
    if not soup.find("span", {"class": "post__title-text"}):
        # see 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, vaatamised, kommentaarid, hÀÀled jne.
        # ...
    # tulemuse salvestamine eraldi faili
    fname = r'files/' + str(pid) + '.pkl'
    with open(fname, 'wb') as f:
        pickle.dump(doc, f)

PÀringu kÀigus avastasin mitmeid uusi aspekte.

Esiteks rÀÀgitakse, et protsesside loomine rohkem kui protsessori tuumade arv on mÔttetu. Kuid minu puhul selgus, et piirav ressurss ei ole protsessor, vaid vÔrk, ning 100 protsessi töötavad kiiremini kui 4 vÔi nÀiteks 20.

Teiseks, mĂ”nes postituses esinesid erisĂŒmbolite kombinatsioonid — nĂ€iteks eufemismid nagu "%&#@". Selgus, et html.parser, millega ma alguses töötasin, reageerib kombinatsioonile &# valusalt, pidades seda HTML-ĂŒksuse alguseks. Olin peaaegu valmis musta maagia juurde minema, kuid foorumis soovitati, et saan lihtsalt parserit vahetada.

Kolmandaks, mul Ă”nnestus eksportida kĂ”ik artiklid, vĂ€lja arvatud kolm. Minu viirusetĂ”rje kustutas koheselt dokumendid numbritega 65927, 162075 ja 275987. Need olid artiklid vastavalt JavaScripti ahelast, mis laadib ohtlikku pdf-d, SMS-nĂ”udmisest pluginakomplekti brauseritele ja CrashSafari.com veebisaidist, mis paneb iPhone'id korduvasse taaskĂ€ivitusse. Ühe artikli mĂ€rkasin hiljem, sĂŒsteemi skannimise ajal: postitus 338586 looma kaupluse veebisaidil, mis kasutas kasutaja protsessorit krĂŒptovaluuta kaevandamiseks. Seega vĂ”ib öelda, et viirusetĂ”rje töö oli tĂ€itsa adekvaatne.

"Elus" artikleid oli ainult pool potentsiaalsest maksimumist — 166307 tĂŒkki. ÜlejÀÀnud osas annab Habr valikud "leht on aegunud, kustutatud vĂ”i ei eksisteerinud kunagi". Mis ж, juhtub igasuguseid asju.

Artiklite eksportimist jĂ€rgnes tehniline töö: nĂ€iteks pidi avaldamise kuupĂ€evad tĂ”lkima formaadist "’21. detsember 2006 kell 10:47" standardvormingusse datetime, ja "12,8k" vaatamist — 12800. Sel etapil ilmus veel paar situatsiooni. KĂ”ige lĂ”busam on seotud hÀÀlte arvu ja andmetĂŒĂŒpidega: mĂ”nedes vanades postitustes toimus tĂ€isarvu ĂŒletamine, ja nad said 65535 hÀÀlt.

Kuidas ma parserisin Habr, osa 1: trendid

Tulemuseks oli, et artiklite tekstid (ilma piltideta) vĂ”tsid mul 1,5 gigabaiti, kommentaarid koos metaandmetega — veel 3 gigabaiti, ja umbes sada megabaiti — artiklite metaandmed. Seda saab tĂ€ielikult hoida mĂ€lu sees, mis oli mulle meeldiv ĂŒllatus.

Alustasin artiklite analĂŒĂŒsimist mitte tekstidest, vaid metaandmetest: kuupĂ€evad, sildid, hubid, vaatamised ja "meeldimised". Selgus, et ka need vĂ”ivad palju rÀÀkida.

HabrHabr arengu trendid

Artiklid on veebilehel avaldatud alates 2006. aastast; kĂ”ige intensiivsemalt — aastatel 2008-2016.

Kuidas ma parserisin Habr, osa 1: trendid

KĂŒsimus, kui aktiivselt neid artikleid erinevatel aegadel loeti, ei ole nii lihtne hinnata. 2012. aasta ja nooremate tekstide ĂŒle kommenteeriti ja hinnati aktiivsemalt, kuid uuematel tekstidel on rohkem vaatamisi ja salvestusi jĂ€rjehoidjatesse. Need mÔÔdikud kĂ€itusid ĂŒhtemoodi (langesid kahekordselt) ainult korra, 2015. aastal. VĂ”ib-olla majandusliku ja poliitilise kriisi olukorras suunati lugejate tĂ€helepanu IT-blogidelt tĂ”sisematele kĂŒsimustele.

Kuidas ma parserisin Habr, osa 1: trendid

Lisaks artiklitele laadisin alla ka kommentaarid nende kohta. Kommentaare tuli kokku 6 miljonit, kuid 240 tuhat neist osutusid keelatuks ("UFO maandus ja avaldas selle kirja siin"). Kommentaaride kasulik omadus on see, et nende jaoks on mÀÀratud aeg. Uurides kommentaaride aega, saab umbkaudu aru, millal artikleid ĂŒldiselt loetakse.

Selgus, et enamik artikleid kirjutatakse ja kommenteeritakse kuskil kella 10 ja 20 vahel, st tĂŒĂŒpilise Moskva tööpĂ€eva jooksul. See vĂ”ib tĂ€hendada nii, et Habra loetakse ametlikel eesmĂ€rkidel, kui ka et see on hea viivitusmeetod tööl. Muide, see ajajaotus on olnud stabiilne Habra asutamisest kuni tĂ€napĂ€evani.

Kuidas ma parserisin Habr, osa 1: trendid

Siiski on ajatempli kommentaarides peamine kasu mitte ööpĂ€eva aeg, vaid artikli "aktiivse elu" kestus. Arvutasin vĂ€lja, kuidas on ajavahemik alates artikli avaldamisest kuni selle kommentaarini ja selgus, et praegu tuleb keskmine kommentaar (roheline joon) umbes 20 tunni pĂ€rast, st esimese ööpĂ€eva jooksul jĂ€tab keskmiselt veidi ĂŒle poole kĂ”ikidest kommentaaridest artikli kohta. Kaks pĂ€eva pĂ€rast jĂ€etakse 75% kĂ”igist kommentaaridest. Samal ajal loeti varem artikleid veel kiiremini – nii, 2010. aastal tuli pool kommentaaridest juba esimesel 6 tunnil.

Kuidas ma parserisin Habr, osa 1: trendid

Minu jaoks oli ĂŒllatuseks, et kommentaarid on pikenema hakanud: keskmine sĂŒmbolite arv kommentaaris on Habra eksisteerimise ajal peaaegu kahekordistunud!

Kuidas ma parserisin Habr, osa 1: trendid

Lihtsam tagasiside kui kommentaarid on hÀÀled. Erinevalt paljudest teistest ressurssidest saab Habras anda mitte ainult plusse, vaid ka miinuseid. Siiski ei kasuta lugejad viimast vÔimalust nii sageli: praegu moodustavad mitte-meeldimised umbes 15% kÔigist antud hÀÀltest. Varem oli rohkem, kuid aja jooksul on lugejad lahkemaks muutunud.

Kuidas ma parserisin Habr, osa 1: trendid

Aja jooksul on muutunud ka tekstid. NĂ€iteks on tĂŒĂŒpiline teksti pikkus alates veebisaidi kĂ€ivitamisest jĂ€tkuvalt kasvanud, vaatamata kriisidele. Toimetuse kĂŒmne aasta jooksul on tekstid peaaegu kĂŒmme korda pikemaks muutunud!

Kuidas ma parserisin Habr, osa 1: trendid

Tekstide stiil (esimeses lÀhenemises) on samuti muutunud. NÀiteks Habra esimesel tegevusaastal on kasvanud koodi ja numbrite osakaal tekstides:

Kuidas ma parserisin Habr, osa 1: trendid

PĂ€rast kogu saidi dĂŒnaamika uurimist otsustasin mÔÔta, kuidas erinevate teemade populaarsus on muutunud. Teemad saab automaatselt tekstidest eristada, kuid alguses ei ole vaja ratast uuesti leiutada, vaid piisab autorite iga artikli jaoks mÀÀratud etteantud siltide kasutamisest. Neli tĂŒĂŒpilist trendi olen graafikule vĂ€lja toonud. Teema "Google" domineeris algselt (vĂ”ib-olla peamiselt SEO-optimeerimise tĂ”ttu), kuid iga aastaga kaotas see kaalu. Javascript oli populaarne teema ja jĂ€tkab jĂ€rk-jĂ€rgult, samas kui masinĂ”pe hakkas viimastel aastatel kiiresti populaarsust koguma. Linux jÀÀb aga kogu kĂŒmnendi vĂ€ltel sama aktuaalseks.

Kuidas ma parserisin Habr, osa 1: trendid

Muidugi, mind hakkas huvitama, millised teemad köidavad rohkem lugemisaktiivsust. Arvutasin vÀlja iga teema mediaanvaatluste, hÀÀlte ja kommentaaride arvu. Siin on tulemused:

  • KĂ”ige vaadatumad teemad: arduino, veebidisain, veebiarendus, ĂŒlevaade, lingid, css, html, html5, nginx, algoritmid.
  • KĂ”ige "meeldimist" saanud teemad: vk, huumor, jquery, opera, c, html, veebiarendus, html5, css, veebidisain.
  • KĂ”ige enam arutatud teemad: opera, skype, freelancing, vk, ubuntu, töö, nokia, nginx, arduino, firefox.

Muide, kuna ma vÔrdlen teemasid, on vÔimalik koostada nende reiting sageduse jÀrgi (ja vÔrrelda tulemusi) sarnase artikliga aastast 2013).

  • KĂ”ikide aastate jooksul HĂŒbra kĂ”ige populaarsemate siltide (kahanevas jĂ€rjekorras) seas on google, android, javascript, microsoft, linux, php, apple, java, python, programmeerimine, idufirmad, arendus, ios, idufirma, sotsiaalmeedia.
  • 2017. aastal olid kĂ”ige populaarsemad javascript, python, java, android, arendus, linux, c++, programmeerimine, php, c#, ios, masinĂ”pe, infotehnoloogia, microsoft, react.

Oma reitingute vÔrdlemisel vÔime nÀiteks mÀrgata Pythoni vÔidukÀiku ja php kadumist vÔi "start-up" teema langust ja masinÔppe tÔusu.

KĂ”ik Habr'i mĂ€rgid ei ole niivĂ”rd ilmsed oma temaatilise varjundi poolest. Siin on nĂ€iteks kĂŒmme mĂ€rki, mida olen kohanud ainult ĂŒks kord, kuid mis tundusid mulle toredad. Nii et: "idee on arengu mootori", "pildi laadimine diskettalt", "Iowas osariik", "draamateater", "superaljosa", "aurumootor", "mida laupĂ€eval teha", "mul on rebaselihaga hakklihamasin", "ja nagu alati lĂ€ks", "naljakate mĂ€rkide vĂ€lja mĂ”tlemine ei Ă”nnestunud". Et mÀÀrata selliste artiklite temaatikat, ei piisa vaid muudest mĂ€rkidest — tuleb teostada temaatiline modelleerimine artiklite tekstide pĂ”hjal.

Detailsem analĂŒĂŒs artiklite sisust tuleb jĂ€rgmises postituses. Esiteks kavatsen ma koostada mudeli, mis prognoosib artikli vaatamiste arvu vastavalt selle sisule. Teiseks tahaksin Ă”petada nĂ€rvivĂ”rku genereerima tekste sama stiilis nagu Habr'i autoritel. Nii et jĂ€lgige mind 🙂

P.S. Siin on ka tsenseeritud andmestik.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster