Après avoir terminé la salade Olivier du Nouvel An, je ne savais plus quoi faire et j'ai décidé de télécharger toutes les articles de Habr (et des plateformes associées) sur mon ordinateur pour les explorer.
Cela a donné lieu à plusieurs intrigues intéressantes. La première d'entre elles est l'évolution du format et des thèmes des articles au cours des 12 ans d'existence du site. Par exemple, la dynamique de certains sujets est révélatrice. La suite est en dessous.

Le processus de parsing
Pour comprendre comment Habr a évolué, il fallait parcourir tous ses articles et en extraire les métadonnées (par exemple, les dates). La navigation a été facile, car les liens vers tous les articles sont de la forme "habrahabr.ru/post/337722/", avec des numéros strictement ordonnés. Sachant que le dernier post a un numéro légèrement inférieur à 350 000, je suis simplement passé par tous les ID de documents possibles dans une boucle (code en Python) :
import numpy as np
from multiprocessing import Pool
with Pool(100) as p:
docs = p.map(download_document, np.arange(350000))Fonction download_document tente de charger la page avec l'ID correspondant et d'extraire des informations significatives de la structure HTML.
import requests
from bs4 import BeautifulSoup
def download_document(pid):
""" Télécharger et traiter un document Habr et ses commentaires """
# chargement du document
r = requests.get('https://habrahabr.ru/post/' +str(pid) + '/')
# parsing du document
soup = BeautifulSoup(r.text, 'html5lib') # au lieu de html.parser
doc = {}
doc['id'] = pid
if not soup.find("span", {"class": "post__title-text"}):
# cela se produit si l'article n'existait pas ou a été supprimé
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
# créer d'autres champs : hubs, tags, vues, commentaires, votes, etc.
# ...
# sauvegarde du résultat dans un fichier séparé
fname = r'files/' + str(pid) + '.pkl'
with open(fname, 'wb') as f:
pickle.dump(doc, f)Au cours du parsing, j'ai découvert plusieurs nouveaux aspects.
Tout d'abord, on dit qu'il est inutile de créer plus de processus que de cœurs dans le processeur. Mais dans mon cas, il s'est avéré que la ressource limitante n'était pas le processeur, mais le réseau, et 100 processus fonctionnent plus rapidement que 4 ou 20.
Deuxièmement, dans certains posts, j'ai rencontré des combinaisons de caractères spéciaux — par exemple, des euphémismes comme "%&#@". Il s'est avéré que html.parser, que j'ai utilisé au début, réagit à la combinaison &# de manière exagérée, la considérant comme le début d'une entité HTML. J'étais prêt à faire de la magie noire, mais sur le forum, on m'a conseillé de simplement changer de parseur.
Troisièmement, j'ai pu extraire tous les articles sauf trois. Les documents avec les numéros 65927, 162075 et 275987 ont été immédiatement supprimés par mon antivirus. Ce sont respectivement des articles sur une chaîne de scripts JavaScript chargant un PDF malveillant, un ransomware SMS sous forme d'un ensemble de plugins pour les navigateurs, et le site CrashSafari.com, qui fait redémarrer les iPhones. Un autre article a été détecté par l'antivirus plus tard, lors d'une analyse système : le post 338586 sur les scripts d'un site d'animalerie, utilisant le processeur de l'utilisateur pour le minage de cryptomonnaies. On peut donc considérer que le travail de l'antivirus est tout à fait adéquat.
Il n'y avait que la moitié des articles "vivants", soit 166307 au total. Pour les autres, Habr fournit des options comme "la page est obsolète, a été supprimée ou n'existait pas du tout". Eh bien, il arrive que cela se produise.
Après l'extraction des articles, un travail technique a suivi : par exemple, les dates de publication devaient être converties du format "’21 décembre 2006 à 10:47" au standard datetime, et "12,8k" vues devaient être transformées en 12800. À ce stade, plusieurs autres problèmes se sont présentés. Le plus drôle est lié au comptage des votes et aux types de données : certains vieux posts ont subi un débordement d'entiers, et ils ont reçu 65535 votes chacun.

En résultat, les textes des articles (sans images) ont occupé 1,5 Go, les commentaires avec des métadonnées encore 3 Go, et environ une centaine de mégaoctets de métas pour les articles. Tout cela pouvait être entièrement conservé en mémoire vive, ce qui a été une agréable surprise pour moi.
J'ai commencé l'analyse des articles non pas par les textes eux-mêmes, mais par les métadonnées : dates, tags, hubs, vues et "j'aime". Il s'est avéré qu'elles peuvent également révéler beaucoup de choses.
Tendances de développement de Habrakhabr
Les articles sur le site sont publiés depuis 2006 ; les plus nombreux l'ont été entre 2008 et 2016.

Évaluer à quel point ces articles ont été lus à différents moments n'est pas si simple. Les textes de 2012 et plus récents ont été plus commentés et notés, mais les textes plus nouveaux ont plus de vues et ont été ajoutés aux favoris. Ces métriques se sont comportées de manière égale (elles ont chuté de moitié) une seule fois, en 2015. Il est possible qu'en période de crise économique et politique, l'attention des lecteurs ait migré des blogs IT vers des questions plus sensibles.

En plus des articles eux-mêmes, j'ai également extrait les commentaires qui y sont associés. Il y a eu 6 millions de commentaires, mais 240 000 d'entre eux ont été bannis ("un OVNI est arrivé et a publié ce message ici"). Une caractéristique utile des commentaires est qu'ils sont associés à un moment. En étudiant le temps des commentaires, on peut à peu près comprendre quand les articles sont lus.
Il s'est avéré que la plupart des articles sont écrits et commentés entre 10 et 20 heures, c'est-à-dire pendant une journée de travail typique à Moscou. Cela pourrait signifier que Habr est lu à des fins professionnelles et que c'est un bon moyen de procrastiner au travail. D'ailleurs, cette répartition des heures de la journée est restée stable depuis la création de Habr jusqu'à aujourd'hui.

Cependant, le principal avantage de l'horodatage des commentaires n'est pas l'heure de la journée, mais la durée de "vie active" d'un article. J'ai calculé comment le temps s'écoule entre la publication d'un article et son commentaire. Il s'est avéré qu'actuellement, le commentaire médian (ligne verte) vient environ 20 heures après la publication, c'est-à-dire que dans les premières 24 heures, un peu plus de la moitié de tous les commentaires sur un article sont laissés. Et dans les deux jours, 75 % de tous les commentaires sont laissés. Auparavant, les articles étaient lus encore plus rapidement — ainsi, en 2010, la moitié des commentaires arrivaient déjà dans les 6 premières heures.

Pour moi, cela a été une surprise que les commentaires se soient allongés : le nombre moyen de caractères dans un commentaire a presque doublé depuis la création de Habr !

Un retour d'information plus simple que les commentaires est constitué par les votes. Contrairement à de nombreuses autres ressources, sur Habr, on peut voter non seulement positivement, mais aussi négativement. Cependant, les lecteurs n’utilisent pas cette dernière option aussi souvent : la part actuelle des votes négatifs représente environ 15 % de tous les votes exprimés. Avant, il y en avait plus, mais avec le temps, les lecteurs sont devenus plus bienveillants.

Les textes eux-mêmes ont également évolué au fil du temps. Par exemple, la longueur typique des textes continue de croître régulièrement depuis le lancement du site, malgré les crises. En une décennie, les textes sont devenus presque dix fois plus longs !

Le style des textes (en première approche) a également changé. Au cours des premières années de l’existence de Habr, par exemple, la proportion de code et de chiffres dans les textes a augmenté :

Après avoir compris la dynamique générale du site, j'ai décidé de mesurer comment la popularité des différents sujets avait évolué. Les sujets peuvent être extraits automatiquement des textes, mais pour commencer, il n'est pas nécessaire de réinventer la roue, il suffit d'utiliser les balises prêtes à l'emploi attribuées par chaque auteur d'article. J'ai tracé quatre tendances typiques sur le graphique. Le sujet « Google » dominait initialement (peut-être surtout en raison de l'optimisation SEO), mais a perdu de son poids au fil des ans. Javascript a été un sujet populaire et continue de l'être progressivement, tandis que l'apprentissage automatique a commencé à gagner en popularité rapidement seulement ces dernières années. Linux reste quant à lui toujours aussi pertinent au cours de la décennie.

Bien sûr, cela m'a intéressé de savoir quels sujets attirent le plus d'activité chez les lecteurs. J'ai calculé le nombre médian de vues, de votes et de commentaires pour chaque sujet. Voici ce que j'ai obtenu :
- Les sujets les plus consultés : arduino, design web, développement web, digest, liens, css, html, html5, nginx, algorithmes.
- Les sujets les plus « likés » : vk, humour, jquery, opera, c, html, développement web, html5, css, design web.
- Les sujets les plus discutés : opera, skype, freelance, vk, ubuntu, travail, nokia, nginx, arduino, firefox.
À propos, comme je compare les sujets, on peut établir leur classement par fréquence (et comparer les résultats avec ).
- Au cours des années d'existence de Habr, les balises les plus populaires (par ordre décroissant) sont devenues google, android, javascript, microsoft, linux, php, apple, java, python, programmation, startups, développement, ios, startup, réseaux sociaux.
- En 2017, les plus populaires étaient javascript, python, java, android, développement, linux, c++, programmation, php, c#, ios, apprentissage automatique, sécurité de l'information, microsoft, react.
En comparant ces classements, on peut remarquer, par exemple, la montée triomphale de Python et le déclin de php, ou le « crépuscule » de la thématique des startups et la montée de l'apprentissage automatique.
Tous les tags sur Habr n'ont pas une connotation thématique aussi évidente. Voici, par exemple, une dizaine de tags qui n'apparaissent qu'une seule fois, mais qui m'ont semblé amusants. Donc : "l'idée moteur du progrès", "chargement à partir de l'image d'une disquette", "État de l'Iowa", "dramaturgie", "superaliocha", "moteur à vapeur", "que faire samedi", "j'ai un renard dans le hachoir", "et c'est toujours comme ça", "je n'ai pas pu inventer de tags drôles". Pour déterminer la thématique de tels articles, les tags ne suffisent pas - il faudra effectuer une modélisation thématique sur les textes des articles.
Une analyse plus détaillée du contenu des articles sera publiée dans le prochain post. Tout d'abord, je prévois de construire un modèle qui prédit le nombre de vues d'un article en fonction de son contenu. Deuxièmement, j'aimerais apprendre à un réseau de neurones à générer des textes dans le même style que ceux des auteurs de Habr. Alors abonnez-vous 🙂
P.S. Et voici le dataset .
Source : habr.com
