Wie ich Habr geparst habe, Teil 1: Trends

Nachdem der Neujahrs-Oliven-Salat aufgebraucht war, hatte ich nichts mehr zu tun und beschloss, mir alle Artikel von Habr und verwandten Plattformen auf meinen Computer herunterzuladen und zu analysieren.

Das Ergebnis waren einige interessante Geschichten. Die erste davon ist die Entwicklung des Formats und der Themen der Artikel ĂŒber 12 Jahre Bestehen der Website. Beispielsweise zeigt die Dynamik bestimmter Themen, dass sich viel verĂ€ndert hat. Die Fortsetzung folgt im weiteren Verlauf.

Wie ich Habr geparst habe, Teil 1: Trends

Der Parsing-Prozess

Um zu verstehen, wie sich Habr entwickelt hat, musste ich alle seine Artikel durchgehen und Metainformationen (z. B. Daten) daraus extrahieren. Das Durchsuchen war einfach, da die Links zu allen Artikeln die Form "habrahabr.ru/post/337722/" haben, wobei die Nummern strikt der Reihenfolge folgen. Da ich wusste, dass der letzte Beitrag eine Nummer knapp unter 350.000 hat, bin ich einfach alle möglichen Dokumenten-IDs in einer Schleife durchgegangen (Code in Python):

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

Die Funktion download_document versucht, die Seite mit der entsprechenden ID herunterzuladen und aus der HTML-Struktur die wesentlichen Informationen herauszuziehen.

import requests
from bs4 import BeautifulSoup

def download_document(pid):
    """ Dokument von Habr herunterladen und verarbeiten sowie Kommentare """
    # Dokument herunterladen
    r = requests.get('https://habrahabr.ru/post/' + str(pid) + '/')
    # Dokument parsen
    soup = BeautifulSoup(r.text, 'html5lib') # anstelle von html.parser
    doc = {}
    doc['id'] = pid
    if not soup.find("span", {"class": "post__title-text"}):
        # das kann passieren, wenn der Artikel nicht existiert oder gelöscht wurde
        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
        # andere Felder erstellen: Hubs, Tags, Aufrufe, Kommentare, Votes usw.
        # ...
    # Ergebnis in einer separaten Datei speichern
    fname = r'files/' + str(pid) + '.pkl'
    with open(fname, 'wb') as f:
        pickle.dump(doc, f)

WĂ€hrend des Parsens habe ich mehrere neue Aspekte entdeckt.

Erstens sagt man, dass es sinnlos ist, mehr Prozesse zu erstellen, als es Kerne im Prozessor gibt. In meinem Fall stellte sich jedoch heraus, dass das limitierende Element nicht die CPU, sondern das Netzwerk ist, und 100 Prozesse arbeiten schneller als 4 oder sagen wir 20.

Zweitens gab es in einigen BeitrĂ€gen Kombinationen von Sonderzeichen – zum Beispiel Euphemismen wie "%&#@". Es stellte sich heraus, dass html.parser, das ich zuerst verwendet habe, auf die Kombination reagiert &# Es war schmerzhaft, da dies als Beginn einer HTML-EntitĂ€t galt. Ich hatte schon vor, große Magie zu zaubern, aber im Forum wurde mir geraten, einfach den Parser zu wechseln.

Drittens gelang es mir, alle BeitrĂ€ge mit Ausnahme von drei zu exportieren. Die Dokumente mit den Nummern 65927, 162075 und 275987 wurden sofort von meiner Antivirensoftware gelöscht. Diese Artikel handeln jeweils von einer JavaScript-Kette, die ein bösartiges PDF lĂ€dt, einem SMS-Erpresser in Form einer Plugin-Sammlung fĂŒr Browser sowie der Seite CrashSafari.com, die iPhones zum Neustart zwingt. Einen weiteren Artikel entdeckte das Antivirenprogramm spĂ€ter wĂ€hrend eines Systemscans: Beitrag 338586 ĂŒber Skripte auf der Website eines TiergeschĂ€fts, die die CPU des Nutzers fĂŒr das Mining von KryptowĂ€hrungen verwenden. Somit kann man die Arbeit des Antivirenprogramms als durchaus angemessen betrachten.

Von den "lebenden" Artikeln blieb nur die HĂ€lfte des potenziell Maximums ĂŒbrig – 166307 StĂŒck. Bei den anderen bietet Habr Optionen wie "Seite ist veraltet, wurde gelöscht oder existierte ĂŒberhaupt nicht". Nun, das passiert.

Auf den Export der Artikel folgten technische Arbeiten: Zum Beispiel mussten die Veröffentlichungsdaten aus dem Format "21. Dezember 2006 um 10:47" in einen Standard ĂŒbersetzt werden. datetime, und "12,8k" Aufrufe — in 12800. An dieser Stelle gab es noch einige weitere KuriositĂ€ten. Die lustigste betraf die StimmenauszĂ€hlung und Datentypen: in einigen Ă€lteren BeitrĂ€gen kam es zu einem Integer-Überlauf, und sie erhielten jeweils 65535 Stimmen.

Wie ich Habr geparst habe, Teil 1: Trends

Insgesamt belegten die Texte der Artikel (ohne Bilder) 1,5 Gigabyte, die Kommentare mit Metainformationen nochmals 3, und etwa hundert Megabyte — Metainformation ĂŒber die Artikel. Das konnte ich vollstĂ€ndig im Arbeitsspeicher halten, was fĂŒr mich eine angenehme Überraschung war.

Ich begann die Analyse der Artikel nicht mit den eigentlichen Texten, sondern mit den Metainformationen: Daten, Tags, Huben, Aufrufen und „Likes“. Es stellte sich heraus, dass auch diese viel zu erzĂ€hlen hat.

Entwicklungstrends von Habr

Artikel auf der Website werden seit 2006 veröffentlicht; am intensivsten zwischen 2008 und 2016.

Wie ich Habr geparst habe, Teil 1: Trends

Es ist nicht so einfach zu bewerten, wie aktiv diese Artikel zu verschiedenen Zeiten gelesen wurden. Texte aus dem Jahr 2012 und jĂŒnger wurden aktiver kommentiert und bewertet, aber neuere Texte haben mehr Aufrufe und Favoriten. Diese Metriken verhielten sich nur einmal gleich (sind um die HĂ€lfte gefallen), und zwar im Jahr 2015. Möglicherweise hat in der Situation der wirtschaftlichen und politischen Krise die Aufmerksamkeit der Leser von IT-Blogs auf drĂ€ngendere Themen umgeschwenkt.

Wie ich Habr geparst habe, Teil 1: Trends

Neben den Artikeln habe ich auch die Kommentare heruntergeladen. Es kamen 6 Millionen Kommentare zusammen, wobei jedoch 240.000 davon gesperrt waren ("Ein UFO ist gelandet und hat diese Nachricht hier veröffentlicht"). Ein nĂŒtzliches Merkmal der Kommentare ist, dass die Zeit angegeben ist. Indem man die Kommentierungszeiten untersucht, kann man ungefĂ€hr nachvollziehen, wann die Artikel ĂŒberhaupt gelesen werden.

Es stellte sich heraus, dass die meisten Artikel und Kommentare irgendwo zwischen 10 und 20 Uhr verfasst werden, also wĂ€hrend der typischen Arbeitszeit in Moskau. Das könnte bedeuten, dass Habr zu beruflichen Zwecken gelesen wird oder dass es ein guter Weg ist, um bei der Arbeit prokrastinieren. Übrigens ist diese Verteilung der Tageszeiten seit der GrĂŒndung von Habr bis heute konstant.

Wie ich Habr geparst habe, Teil 1: Trends

Der Hauptvorteil der Zeitstempel fĂŒr Kommentare liegt jedoch nicht in der Tageszeit, sondern in der "aktiven Lebensdauer" eines Artikels. Ich habe berechnet, wie die Zeit zwischen der Veröffentlichung eines Artikels und seinem Kommentar verteilt ist. Dabei stellte sich heraus, dass der mediane Kommentar (grĂŒne Linie) derzeit etwa 20 Stunden nach der Veröffentlichung abgegeben wird, d.h. in den ersten 24 Stunden werden im Durchschnitt etwas mehr als die HĂ€lfte aller Kommentare zum Artikel hinterlassen. Innerhalb von zwei Tagen kommen bereits 75 % aller Kommentare. FrĂŒher wurden Artikel jedoch noch schneller gelesen – so kamen im Jahr 2010 die HĂ€lfte der Kommentare bereits in den ersten 6 Stunden.

Wie ich Habr geparst habe, Teil 1: Trends

Es war fĂŒr mich eine Überraschung, dass die Kommentare lĂ€nger geworden sind: Die durchschnittliche Anzahl der Zeichen pro Kommentar ist wĂ€hrend der gesamten Existenz von Habr fast doppelt so hoch gestiegen!

Wie ich Habr geparst habe, Teil 1: Trends

Eine einfachere Möglichkeit der RĂŒckmeldung als Kommentare sind die Stimmen. Anders als bei vielen anderen Plattformen kann man bei Habr nicht nur positive, sondern auch negative Stimmen abgeben. Diese letzte Möglichkeit wird von den Lesern jedoch nicht so hĂ€ufig genutzt: Der aktuelle Anteil der Dislikes liegt bei etwa 15 % aller abgegebenen Stimmen. FrĂŒher war es mehr, aber im Laufe der Zeit sind die Leser freundlicher geworden.

Wie ich Habr geparst habe, Teil 1: Trends

Die Texte haben sich im Laufe der Zeit verÀndert. Zum Beispiel nimmt die typische TextlÀnge seit dem Start der Website kontinuierlich zu, trotz verschiedener Krisen. In einem Jahrzehnt sind die Texte fast zehnmal lÀnger geworden!

Wie ich Habr geparst habe, Teil 1: Trends

Auch der Stil der Texte hat sich in gewisser Weise verÀndert. In den ersten Jahren von Habr beispielsweise ist der Anteil an Code und Zahlen in den Texten gestiegen:

Wie ich Habr geparst habe, Teil 1: Trends

Nachdem ich die allgemeine Dynamik der Website untersucht hatte, beschloss ich, die VerĂ€nderung der PopularitĂ€t verschiedener Themen zu messen. Themen lassen sich automatisch aus den Texten herausfiltern, aber zunĂ€chst kann man sich auf die bereits vorhandenen Tags stĂŒtzen, die von den Autoren jedes Artikels vergeben wurden. Ich habe vier typische Trends in einem Diagramm dargestellt. Das Thema "Google" dominierte anfangs (möglicherweise hauptsĂ€chlich aufgrund von SEO-Optimierung), verlor jedoch im Laufe der Jahre an Gewicht. Javascript war ein populĂ€res Thema und bleibt es nach wie vor, wĂ€hrend maschinelles Lernen erst in den letzten Jahren rasant an Beliebtheit gewonnen hat. Linux hingegen bleibt ĂŒber das gesamte Jahrzehnt hinweg relevant.

Wie ich Habr geparst habe, Teil 1: Trends

NatĂŒrlich hat mich interessiert, welche Themen die grĂ¶ĂŸte LeseraktivitĂ€t anziehen. Ich habe die mediane Anzahl an Aufrufen, Stimmen und Kommentaren zu jedem Thema gezĂ€hlt. Das ist das Ergebnis:

  • Die meistgesehenen Themen: Arduino, Webdesign, Webentwicklung, Digest, Links, CSS, HTML, HTML5, Nginx, Algorithmen.
  • Die "likable" Themen: VKontakte, Humor, jQuery, Opera, C, HTML, Webentwicklung, HTML5, CSS, Webdesign.
  • Die meistdiskutierten Themen: Opera, Skype, Freelance, VKontakte, Ubuntu, Arbeit, Nokia, Nginx, Arduino, Firefox.

Übrigens, da ich die Themen vergleiche, kann ich sie nach HĂ€ufigkeit bewerten (und die Ergebnisse mit einem Ă€hnlichen Artikel aus dem Jahr 2013 vergleichen.).

  • In all den Jahren seit der GrĂŒndung von Habr sind die beliebtesten Tags (in absteigender Reihenfolge) Google, Android, JavaScript, Microsoft, Linux, PHP, Apple, Java, Python, Programmierung, Startups, Entwicklung, iOS, Startup, soziale Netzwerke geworden.
  • Im Jahr 2017 waren die beliebtesten JavaScript, Python, Java, Android, Entwicklung, Linux, C++, Programmierung, PHP, C#, iOS, Maschinelles Lernen, Informationssicherheit, Microsoft, React.

Bei der Betrachtung dieser Rankings fÀllt beispielsweise der triumphale Aufstieg von Python und das Verschwinden von PHP auf, ebenso wie der "Sonnenuntergang" des Startup-Themen und der Aufstieg des maschinellen Lernens.

Nicht alle Tags auf Habr haben eine so offensichtliche thematische FĂ€rbung. Hier sind zum Beispiel ein Dutzend Tags, die nur einmal vorkamen, aber mir einfach amĂŒsant schienen. Also: "Idee treibt den Fortschritt", "Boot von Disketten-Image", "Bundesstaat Iowa", "Dramaturgie", "Superalesha", "Dampfmaschine", "Was an einem Samstag tun", "Ich habe einen Fuchs in der Fleischwolf", "Aber es kam wie immer", "AmĂŒsante Tags konnten nicht erfunden werden". Um das Thema solcher Artikel zu bestimmen, sind Tags nicht ausreichend – man muss thematisches Modeling auf den Texten der Artikel durchfĂŒhren.

Eine detailliertere Analyse des Inhalts der Artikel wird im nĂ€chsten Beitrag folgen. Erstens plane ich, ein Modell zu erstellen, das die Anzahl der Artikelaufrufe basierend auf ihrem Inhalt vorhersagt. Zweitens möchte ich ein neuronales Netzwerk trainieren, um Texte im gleichen Stil wie die Autoren von Habr zu generieren. Also abonniert 🙂

P.S. Hier ist das verhĂŒllte Dataset.

Quelle: habr.com

Erwerben Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server đŸ”„ Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster