Habr-dan necə parse etdim, 1-ci hissə: trendlər

Yeni il salatası olandan sonra, boş durmamak için, kompüterimə Habrın bütün məqalələrini (və ona bağlı platformaları) yükləməyə qərar verdim və araşdırmağa başladım.

Bir neçə maraqlı hadisə baş verdi. Bunlardan biri saytin 12 illik mövcudluğu dövründə məqalələrin formatı və temasıdır. Məsələn, bəzi mövzuların dinamikası olduqca göstəricidir. Davamı aşağıdadır.

Habr-dan necə parse etdim, 1-ci hissə: trendlər

Parseləmə prosesi

Habrın necə inkişaf etdiyini başa düşmək üçün, onun bütün məqalələrini keçmək və məqalələrdən meta-informasiyanı (məsələn, tarixləri) ayırmaq lazım idi. Keçid asan oldu, çünki bütün məqalələrin linkləri "habrahabr.ru/post/337722/" formatında və nömrələr ardıcıllıqla verilir. Sonuncu məqalənin nömrəsinin 350 minə yaxın olduğunu bilərək, bütün mümkün sənəd id-ləri üzərində dövr edərək keçdim (Python kodu):

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

Funksiya download_document müvafiq id-ə sahib səhifəni yükləməyə çalışır və html strukturundan məzmunlu məlumatı çıxarmağa çalışır.

import requests
from bs4 import BeautifulSoup

def download_document(pid):
    """ Habr sənədini və onun şərhlərini yükləyin və işləyin """
    # sənədin yüklənməsi
    r = requests.get('https://habrahabr.ru/post/' +str(pid) + '/')
    # sənədin parselənməsi
    soup = BeautifulSoup(r.text, 'html5lib') # html.parser yerinə
    doc = {}
    doc['id'] = pid
    if not soup.find("span", {"class": "post__title-text"}):
        # bu, əgər məqalə mövcud deyilsə və ya silinibsə baş verir
        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
        # digər sahələri yaradın: mərkəzlər, etiketlər, baxışlar, şərhlər, səsvermələr və s.
        # ...
    # nəticəni ayrıca faylda saxlayın
    fname = r'files/' + str(pid) + '.pkl'
    with open(fname, 'wb') as f:
        pickle.dump(doc, f)

Parseləmə prosesi zamanı bir neçə yeni moment kəşf etdim.

Birincisi, prosessorun nüvələrindən çox daha çox proses yaratmağın mənasız olduğu deyilir. Ama mənim vəziyyətimdə məhdudiyyət resursu prosessor deyil, şəbəkədir və 100 proses, 4 və ya 20 prosessdən daha sürətli işləyir.

İkincisi, bəzi postlarda xüsusi simvolların birləşmələri, məsələn, "%&#@" kimi eufemizmlər var idi. Gördüm ki, html.parser, əvvəlcə istifadə etdiyim, birləşməyə reaksiya verir &# acı bir şəkildə, onu html varlığı başlayır kimi hesab edir. Mən əməlli-başlı qara sehr etməyə hazırlaşdım, amma forumda dedilər ki, sadəcə parser-i dəyişmək mümkündür.

Üçüncüsü, mənə üç ədəd müstəqil olaraq, bütün nəşrləri yükləmək mümkün oldu. 65927, 162075 və 275987 saylı sənədləri antivirusum dərhal sildi. Bunlar müvafiq olaraq, zərərli pdf yükləyən JavaScript zənciri, brauzer plaginləri şəklində bir SMS şantajı və iPhone-ları yenidən başladan CrashSafari.com saytı haqqında məqalələrdir. Antivirus daha sonra sistemin skan edilməsi zamanı 338586 saylı yazını aşkar etdi, bu da heyvan mağazasının saytı üçün kriptovalyuta mədaxil edən skriptlər haqqında idi. Beləliklə, antivirusun işi kifayət qədər adekvat sayılır.

"Canlı" məqalələrin sayından yalnız yarısı olan 166307 ədəd tapıldı. Qalanlarına isə Habr "səhifə köhnədir, silinmişdir və ya tamamilə mövcud deyil" variantlarını təqdim edir. Nə deyim, hər şey olur.

Məqalələrin yüklənməsindən sonra texniki iş başladı: məsələn, nəşr tarixi "21 Dekabr 2006, saat 10:47" formatında standart formada göstərilməli idi. datetime, "12,8k" baxışı isə 12800-ə çevrilməli idi. Bu mərhələdə bir neçə daha qəribə vəziyyət ortaya çıxdı. Ən əyləncəli olanı, səs sayı və məlumat tipleri ilə bağlıdır: bəzi köhnə yazılarda int overflow baş verdi və onlar 65535 səs aldılar.

Habr-dan necə parse etdim, 1-ci hissə: trendlər

Nəticədə məqalələrin mətni (şəkilsiz) mənim üçün 1.5 giqabayt yer tutdu, meta məlumatı olan şərhlər daha 3 giqabayt, və məqalələrə dair meta məlumatlar isə təxminən yüz megabayt oldu. Bunların hamısını RAM-da saxlamaq mümkündür ki, bu da mənim üçün xoş bir sürpriz oldu.

Məqalələri analiz etməyə mətnlərdən başlamadım, başlamaq üçün meta məlumatlarına baxdım: tarixlər, etiketlər, hub-lar, baxışlar və "bəyənmələr". Göründüyü kimi, bu da çox şey söyləyə bilər.

Habrın inkişaf tendensiyaları

Saytda məqalələr 2006-cı ildən dərc olunur; ən intensiv dövr 2008-2016 illəri arasında baş vermişdir.

Habr-dan necə parse etdim, 1-ci hissə: trendlər

Bu məqalələrin müxtəlif vaxtlarda nə dərəcədə oxunduğunu qiymətləndirmək o qədər də asan deyil. 2012-ci ildən sonrakı mətnlər daha aktiv şəkildə şərh edilirdi və reytinqə qoyulurdu, lakin daha yeni mətnlərin daha çox baxışı və sevimlilərə əlavə edilməsi var. Bu metrikaların eyni şəkildə (iki dəfə azalmışdır) yalnız bir dəfə, 2015-ci ildə baş vermişdi. Bəlkə də iqtisadi və siyasi böhran şəraitində oxucuların diqqəti IT bloglarından daha ağrılı məsələlərə yönəlmişdir.

Habr-dan necə parse etdim, 1-ci hissə: trendlər

Məqalələrin özündən əlavə, mən onlara dair şərhləri də yüklədim. Şərhlərin sayı 6 milyon oldu, lakin bunların 240 mininin bloklandığı məlum oldu ("UFO gəldi və bu yazını burada yayımladı"). Şərhlərin faydalı bir xüsusiyyəti odur ki, onların zamanları göstərilir. Şərh saatlarını öyrənərək, ümumiyyətlə məqalələrin nə zaman oxunduğunu təxminən anlamaq mümkündür.

Məlum olub ki, əksər məqalələr və şərhlər günün 10-dan 20-yə qədər olan vaxtlarda yazılır, yəni tipik Moskva iş günündə. Bu, həmçinin gösterir ki, Habr peşəkar məqsədlər üçün oxunur və bu, işdə procrastinasiya etmək üçün yaxşı bir yoldur. Qeyd edim ki, bu günün vaxtı bölgüsü Habrın yarandığı gündən bu günə qədər sabitdir.

Habr-dan necə parse etdim, 1-ci hissə: trendlər

Ancaq şərh vaxtının etiketi ilə əsas fayda günün vaxtı deyil, məqalənin "aktiv ömür" müddətidir. Mən, məqalənin dərc olunmasından şərh verilməsinə qədər olan vaxtı necə paylandığını hesabladım. Məlumatlar göstərir ki, indiki median şərh (yaşıl xətt) təxminən 20 saat sonra gəlir, yəni dərc olunma tarixindən ilk gün ərzində orta hesabla bütün şərhlərin yarıdan bir az çoxu yazılır. İki gün ərzində isə bütün şərhlərin 75%-i yazılır. Bundan əvvəl isə məqalələr daha sürətlə oxunurdu - 2010-cu ildə şərhlərin yarısı artıq ilk 6 saatda göndərilirdi.

Habr-dan necə parse etdim, 1-ci hissə: trendlər

Mənim üçün sürpriz oldu ki, şərhlərin uzunluğu artdı: Habrın mövcud olduğu müddətdə şərhlərdəki ortalama simvol sayı demək olar ki, iki dəfə artıb!

Habr-dan necə parse etdim, 1-ci hissə: trendlər

Şərhlərdən daha sadə geribildirim, səs verməkdir. Digər resurslardan fərqli olaraq, Habrda yalnız müsbət səs vermək deyil, həm də mənfi səs vermək mümkündür. Ancaq sonuncu imkandan oxucular o qədər də tez-tez istifadə etmirlər: hazırda mənfi səs nisbəti bütün verilən səslərin təxminən 15%-ni təşkil edir. Əvvəlki dövrlərdə belə olurdu, lakin zamanla oxucular daha yaxşılaşdılar.

Habr-dan necə parse etdim, 1-ci hissə: trendlər

Mətnlər də zamanla dəyişdi. Məsələn, tipik mətn uzunluğu saytın açılışından bəri dayanmayaraq artmağa davam edir, krizislərə baxmayaraq. İki onillik ərzində mətnlər demək olar ki, on dəfə uzanıb!

Habr-dan necə parse etdim, 1-ci hissə: trendlər

Mətnlərin üslubu (ilk mərhələdə) də dəyişdi. Habrın ilk illərində, məsələn, mətnlərdə kod və ədədlərin payı artdı:

Habr-dan necə parse etdim, 1-ci hissə: trendlər

Saytın ümumi dinamikasını araşdırdıqdan sonra, müxtəlif mövzuların populyarlığını necə dəyişdiyini ölçmək qərarına gəldim. Mövzular mətndən avtomatik olaraq seçilə bilər, lakin əvvəlcə hazır taglərdən, hər bir məqalənin müəllifləri tərəfindən qoyulmuş taglərdən istifadə etmək mümkündür. Dörd tipik trendi qrafikdə göstərdim. "Google" mövzusu əvvəlcə dominant oldu (bəlkə də, əsasən SEO optimizasiyası ilə bağlı), lakin hər il qabarıqlığını itirdi. Javascript məşhur bir mövzu idi və yavaş-yavaş populyarlığını qoruyur, amma maşın öyrənilməsi son illərdə sürətlə populyarlaşmağa başladı. Linux isə onillik ərzində eyni dərəcədə aktualdır.

Habr-dan necə parse etdim, 1-ci hissə: trendlər

Əlbəttə ki, mənə daha çox oxucuların fəaliyyətini cəlb edən mövzular maraqlı oldu. Hər mövzuda median baxış sayı, səs və şərh sayı hesabladım. Nəticələr belədir:

  • Ən çox baxılan mövzular: arduino, veb dizayn, veb inkişaf, xülasə, linklər, css, html, html5, nginx, alqoritmlər.
  • Ən "like" olan mövzular: vk, humor, jquery, opera, c, html, veb inkişaf, html5, css, veb dizayn.
  • Ən müzakirə olunan mövzular: opera, skype, freelancing, vk, ubuntu, iş, nokia, nginx, arduino, firefox.

Qeyd edim ki, mövzuları müqayisə edərkən, onların sıralamasını tezliklərinə görə müəyyən etmək olar (və nəticələri ilə müqayisə etmək) 2013-cü il ilə oxşar bir məqalə).

  • Habr'ın mövcud olduğu bütün illər boyunca ən populyar etiketlər (azalan qaydada) google, android, javascript, microsoft, linux, php, apple, java, python, proqramlaşdırma, startaplar, inkişaf, ios, startap, sosial şəbəkələr oldu.
  • 2017-ci ildə ən populyar olanlar javascript, python, java, android, inkişaf, linux, c++, proqramlaşdırma, php, c#, ios, maşın öyrənməsi, informasiya təhlükəsizliyi, microsoft, react oldu.

Bu reytinqləri müqayisə edəndə, məsələn, Python'un uğurlu irəliləməsini və php'nin süqutunu, ya da "startap" mövzusunun enişini və maşın öyrənməsinin yüksəlişini görə bilərsiniz.

Habr'daki bütün etiketlərin belə açıq mövzu əhəmiyyəti yoxdur. Məsələn, yalnız bir dəfə rast gəldiyim və mənim üçün əyləncəli görünən on etiket: "dəyişiklik gücü ideyası", "disket imgəsindən yükləmə", "iowa ştatı", "dramatürgiya", "superleşə", "buhar mühərriki", "şənbə günü nə ilə məşğul olmaq", "mənim əlimdəki tülkü", "amma hər şey olduğu kimi oldu", "gülməli etiketlər tapa bilmədim". Bu cür məqalələrin mövzusunu müəyyən etmək üçün etiketlər kifayət etmir — məqalə mətnləri üzrə mövzu modelleştirməsi aparmaq lazımdır.

Məqalələrin məzmununun daha geniş analizi növbəti yazıda olacaq. Birincisi, məqalənin məzmununa görə görüntüləmə sayını proqnozlaşdıran bir model qurmağı planlaşdırıram. İkincisi, Habr yazarlarının stilində mətnlər yaratmağı öyrənmək istərdim. Ona görə də abunə olun 🙂

P.S. Bura gizlədilmiş dataset.

Mənbə: habr.com

DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər 🔥 DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər | ProHoster