Як я паршив Хабр, частина 1: тренди

Коли було доїдено новорічне олів'є, мені стало нічого робити, і я вирішив завантажити собі на комп'ютер всі статті з Хабрахабра (і суміжних платформ) і дослідити.

Вийшло кілька цікавих сюжетів. Перший з них – це розвиток формату та тематики статей за 12 років існування сайту. Наприклад, досить показовою є динаміка деяких тем. Продовження – під катом.

Як я паршив Хабр, частина 1: тренди

Процес парсингу

Щоб зрозуміти, як розвивався Хабр, потрібно було обійти за всі його статті та виділити з них метаінформацію (наприклад, дати). Обхід дався легко, тому що посилання на всі статті мають вигляд habrahabr.ru/post/337722/, причому номери задаються строго по порядку. Знаючи, що останній пост має номер трохи менший за 350 тисяч, я просто пройшовся по всіх можливих id документів циклом (код на Python):

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

Функція download_document намагається завантажувати сторінку з відповідним id і намагається витягнути з структури HTML змістовну інформацію.

import requests
from bs4 import BeautifulSoup

def download_document(pid):
    """ Download and process a Habr document and its comments """
    # выгрузка документа
    r = requests.get('https://habrahabr.ru/post/' +str(pid) + '/')
    # парсинг документа
    soup = BeautifulSoup(r.text, 'html5lib') # instead of html.parser
    doc = {}
    doc['id'] = pid
    if not soup.find("span", {"class": "post__title-text"}):
        # такое бывает, если статья не существовала или удалена
        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
        # create other fields: hubs, tags, views, comments, votes, etc.
        # ...
    # сохранение результата в отдельный файл
    fname = r'files/' + str(pid) + '.pkl'
    with open(fname, 'wb') as f:
        pickle.dump(doc, f)

У процесі парсингу відкрив кілька нових моментів.

По-перше, кажуть, що створювати більше процесів, ніж ядер у процесорі, марно. Але в моєму випадку виявилося, що лімітуючий ресурс — не процесор, а мережа, і 100 процесів відпрацьовують швидше за 4 або, скажімо, 20.

По-друге, в деяких постах зустрічалися поєднання спецсимволів - наприклад, евфемізм типу "%&#@". Виявилося що html.parser, який я використав спочатку, реагує на комбінацію &# болісно, ​​вважаючи її початком html-сутності. Я вже збирався творити чорну магію, але на форумі підказали, що можна просто поміняти парсер.

По-третє, мені вдалося вивантажити всі публікації, окрім трьох. Документи під номерами 65927, 162075 та 275987 моментально видалив мій антивірус. Це статті відповідно про ланцюжок джаваскриптів, що завантажує шкідливий pdf, SMS-вимагач у вигляді набору плагінів для браузерів і сайт CrashSafari.com, який відправляє айфони в перезавантаження. Ще одну статтю антивір виявив пізніше, під час скану системи: пост 338586 про скрипти на сайті зоомагазину, які використовують процесор користувача для майнінгу криптовалюти. Тож можна вважати роботу антивіруса цілком адекватною.

"Живих" статей виявилася лише половина від потенційного максимуму - 166307 XNUMX штук. Для інших Хабр дає варіанти "сторінка застаріла, була видалена або не існувала зовсім". Що ж, всяке буває.

За вивантаженням статей послідувала технічна робота: наприклад, дати публікації потрібно було перевести з формату "21 грудня 2006 о 10:47" до стандартного datetime, А "12,8k" переглядів - в 12800. На цьому етапі вилізло ще кілька казусів. Найвеселіший пов'язаний з підрахунком голосів та типами даних: у деяких старих постах відбулося переповнення інту, і вони отримали по 65535 XNUMX голосів.

Як я паршив Хабр, частина 1: тренди

В результаті тексти статей (без картинок) зайняли у мене 1.5 гігабайти, коментарі з метаінформацією - ще 3, і близько сотні мегабайт - метаінформація про статті. Таке можна тримати в оперативній пам'яті, що було для мене приємною несподіванкою.

Почав аналіз статей я не з самих текстів, а з метаінформації: дат, тегів, хабів, переглядів та "лайків". Виявилося, що вона може багато розповісти.

Тренди розвитку Хабрахабра

Статті на сайті публікуються з 2006 року; найбільш інтенсивно – у 2008-2016 роках.

Як я паршив Хабр, частина 1: тренди

Наскільки активно ці статті читали у різний час, оцінити не так просто. Тексти 2012 року і молодше активніше коментували і рейтингували, але новіші тексти мають більше переглядів і додавань в закладки. Так само вели себе (удвічі впали) ці метрики лише одного разу, у 2015 році. Можливо, в ситуації економічної та політичної кризи увага читачів перейшла з айтішних блогів до більш болючих питань.

Як я паршив Хабр, частина 1: тренди

Окрім самих статей, я викачав ще коментарі до них. Коментарів вийшло 6 мільйонів, щоправда, 240 тисяч із них виявилися забаненими ("нло прилетіло і опублікувало цей напис тут"). Корисна властивість коментарів у тому, що для них вказано час. Вивчаючи час коментарів, можна приблизно зрозуміти й те, коли взагалі читають статті.

Виявилося, що більшість статей і пишуть, і коментують десь із 10 до 20 годин, тобто. у типовий московський робочий день. Це може означати і що Хабр читають у професійних цілях, і що це добрий спосіб прокрастинації на роботі. До речі, цей розподіл часу є стабільним від самого заснування Хабра до сьогодні.

Як я паршив Хабр, частина 1: тренди

Однак основна користь від позначки часу коментаря — не час доби, а термін "активного життя" статті. Я підрахував, як розподілено час від публікації статті до її коментаря. Виявилося, що зараз медіанний коментар (зелена лінія) надходить приблизно за 20 годин, тобто. у першу добу після публікації залишають у середньому трохи більше половини всіх коментарів до статті. А за дві доби залишають 75% усіх коментарів. При цьому раніше статті читали ще швидше – так, у 2010 році половина коментарів приходила вже у перші 6 годин.

Як я паршив Хабр, частина 1: тренди

Для мене стало сюрпризом, що коментарі подовжилися: середня кількість символів у коментарі за час існування Хабра зросла майже вдвічі!

Як я паршив Хабр, частина 1: тренди

Простіший зворотний зв'язок, ніж коментарі, — це голоси. На відміну від інших ресурсів, на Хабре можна ставити як плюси, а й мінуси. Втім, останньою можливістю читачі користуються не так часто: поточна частка дизлайків складає близько 15% усіх відданих голосів. Раніше було більше, але згодом читачі подобрішали.

Як я паршив Хабр, частина 1: тренди

Змінювалися згодом і самі тексти. Наприклад, типова довжина тексту не припиняє стійко зростати із самого запуску сайту, незважаючи на кризи. За десятиліття тексти стали майже вдесятеро довшими!

Як я паршив Хабр, частина 1: тренди

Стилістика текстів (у першому наближенні) також змінювалася. За перші роки існування Хабра, наприклад, зросла частка коду та чисел у текстах:

Як я паршив Хабр, частина 1: тренди

Розібравшись із загальною динамікою сайту, я вирішив виміряти, як змінювалася популярність різних тем. Теми можна виділяти з текстів автоматично, але спочатку можна не винаходити велосипед, а скористатися готовими тегами, проставленими авторами кожної статті. Чотири типові тренди я вивів на графіку. Тема "Google" спочатку домінувала (можливо, переважно у зв'язку з SEO-оптимізацією), але з кожним роком втрачала вагу. Javascript був популярною темою і продовжує поступово, а ось машинне навчання почало стрімко набирати популярності лише в останні роки. Linux залишається однаково актуальним протягом усього десятиліття.

Як я паршив Хабр, частина 1: тренди

Звісно, ​​мені стало цікаво, які теми приваблюють більше читацької активності. Я підрахував медіанну кількість переглядів, голосів та коментів у кожній темі. Ось що вийшло:

  • Найбільш теми, що переглядаються: arduino, веб-дизайн, веб-розробка, дайджест, посилання, css, html, html5, nginx, алгоритми.
  • "Лайкабельні" теми: вконтакте, гумор, jquery, opera, c, html, веб-розробка, html5, css, веб-дизайн.
  • Найбільш обговорювані теми: opera, skype, фріланс, вконтакте, ubuntu, робота, nokia, nginx, arduino, firefox.

До речі, якщо я порівнюю теми, можна зробити їх рейтинг за частотою (і порівняти результати з аналогічною статтею від 2013 року).

  • За всі роки існування Хабра найпопулярнішими тегами (в порядку зменшення) стали google, android, javascript, microsoft, linux, php, apple, java, python, програмування, стартапи, розробка, ios, стартап, соціальні мережі
  • У 2017 році найбільш популярними були javascript, python, java, android, розробка, linux, c++, програмування, php, c#, ios, машинне навчання, інформаційна безпека, microsoft, react

При порівнянні цих рейтингів можна звернути увагу, наприклад, на переможну ходу Пітона та вимирання php, або на "захід" стартаперської тематики та зліт машинного навчання.

Не всі теги на Хабрі мають настільки очевидне тематичне забарвлення. Ось, наприклад, десяток тегів, які зустрічалися лише один раз, але просто здалися мені кумедними. Отже: "ідея рушій прогресу", "завантаження з образу дискети", "штат айова", "драматургія", "супераліша", "паровий двигун", "чим зайнятися в суботу", "у мене лисиця в м'ясорубці", "а вийшло як завжди, смішних тегів придумати не вдалося. Щоб визначити тематику таких статей, тегів недостатньо — доведеться здійснювати тематичне моделювання текстів статей.

Більш докладний аналіз змісту статей буде наступного посту. По-перше, я збираюся побудувати модель, яка прогнозує кількість переглядів статті в залежності від її змісту. По-друге, хочеться навчити нейромережу генерувати тексти у тій самій стилістиці, що й автори Хабра. Тож підписуйтесь 🙂

PS А ось і запеклий датасет.

Джерело: habr.com

Додати коментар або відгук