Quando terminei de comer o salada Olivier de Ano Novo, não tinha nada para fazer e decidi baixar para o meu computador todos os artigos do HabrHabro (e plataformas relacionadas) e pesquisar.
Surgiram algumas narrativas interessantes. A primeira delas é a evolução do formato e dos temas dos artigos ao longo dos 12 anos de existência do site. Por exemplo, a dinâmica de alguns temas é bastante significativa. A continuação está abaixo.

Processo de parsing
Para entender como o Habr evoluiu, era necessário percorrer todos os seus artigos e extrair as metainformações (por exemplo, datas). A navegação foi fácil, pois os links para todos os artigos têm o formato "habrahabr.ru/post/337722/", e os números são atribuídos estritamente em ordem. Sabendo que o último post tem um número um pouco menor que 350 mil, eu simplesmente percorri todos os IDs possíveis em um laço (código em Python):
import numpy as np
from multiprocessing import Pool
with Pool(100) as p:
docs = p.map(download_document, np.arange(350000))Função download_document tenta carregar a página com o ID correspondente e extrair informações substanciais da estrutura HTML.
import requests
from bs4 import BeautifulSoup
def download_document(pid):
""" Baixar e processar um documento do Habr e seus comentários """
# descarregamento do documento
r = requests.get('https://habrahabr.ru/post/' + str(pid) + '/')
# parsing do documento
soup = BeautifulSoup(r.text, 'html5lib') # em vez de html.parser
doc = {}
doc['id'] = pid
if not soup.find("span", {"class": "post__title-text"}):
# isso acontece, se o artigo não existir ou foi deletado
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
# criar outros campos: hubs, tags, visualizações, comentários, votos, etc.
# ...
# salvando o resultado em um arquivo separado
fname = r'files/' + str(pid) + '.pkl'
with open(fname, 'wb') as f:
pickle.dump(doc, f)Durante o processo de parsing, descobri alguns novos pontos.
Em primeiro lugar, dizem que criar mais processos do que núcleos do processador é inútil. Mas, no meu caso, ficou claro que o recurso limitante não é o processador, mas a rede, e 100 processos funcionam mais rápido do que 4 ou, digamos, 20.
Em segundo lugar, alguns posts apresentavam combinações de caracteres especiais — por exemplo, eufemismos como "%&#@". Descobri que html.parser, que usei inicialmente, reage à combinação &# de forma problemática, considerando-a o início de uma entidade HTML. Estava prestes a realizar magia negra, mas em um fórum me sugeriram que poderia simplesmente mudar de parser.
Em terceiro lugar, consegui exportar todas as publicações, exceto três. Os documentos com os números 65927, 162075 e 275987 foram imediatamente eliminados pelo meu antivírus. Estes são artigos sobre a cadeia de JavaScripts que carrega um PDF malicioso, um ransomware em forma de conjunto de plugins para navegadores e o site CrashSafari.com, que reinicia iPhones. Outro artigo foi descoberto posteriormente pelo antivírus, durante a varredura do sistema: o post 338586 sobre scripts em um site de pet shop que usam o processador do usuário para minerar criptomoedas. Portanto, pode-se considerar o funcionamento do antivírus bastante adequado.
"Artigos 'vivos' representaram apenas metade do potencial máximo — 166307 unidades. Para os restantes, o Habr oferece opções de 'página desatualizada, foi removida ou nunca existiu'. Bem, acontece.
Após a exportação dos artigos, seguiu-se o trabalho técnico: por exemplo, as datas de publicação precisavam ser convertidas do formato '21 de dezembro de 2006 às 10:47' para o padrão datetime, e '12,8k' visualizações para 12800. Neste estágio, surgiram mais alguns casos curiosos. O mais divertido está relacionado à contagem de votos e tipos de dados: em alguns posts antigos, ocorreu um overflow de inteiro, e eles receberam 65535 votos.

Como resultado, os textos dos artigos (sem imagens) ocuparam 1,5 gigabytes, os comentários com metainformação mais 3, e cerca de cem megabytes — metainformação sobre os artigos. Pode-se manter completamente isso na memória RAM, o que foi uma agradável surpresa para mim.
Comecei a análise dos artigos não pelos próprios textos, mas pela metainformação: datas, tags, hubs, visualizações e 'likes'. Descobri que ela também pode revelar muito.
Tendências de desenvolvimento do Habrhabr
Os artigos no site são publicados desde 2006; mais intensamente — entre 2008 e 2016.

Avaliar quão ativamente esses artigos foram lidos em diferentes momentos não é tão simples. Os textos de 2012 e mais recentes receberam mais comentários e avaliações, mas os textos mais novos têm mais visualizações e adições aos favoritos. Essas métricas se comportaram igualmente (cairam pela metade) apenas uma vez, em 2015. É possível que, em um contexto de crise econômica e política, a atenção dos leitores tenha mudado de blogs de TI para questões mais prementes.

Além dos próprios artigos, também coletei os comentários. Foram 6 milhões de comentários, embora 240 mil deles tenham sido banidos ("um OVNI pousou e publicou esta mensagem aqui"). Uma característica útil dos comentários é que o horário é indicado. Ao analisar o horário dos comentários, é possível entender quando os artigos estão sendo lidos.
Descobri que a maior parte dos artigos é escrita e comentada entre 10 e 20 horas, ou seja, durante um típico dia de trabalho em Moscovo. Isso pode indicar que o Habr é lido para fins profissionais e que é uma boa forma de procrastinação no trabalho. A propósito, essa distribuição ao longo do dia permanece estável desde a fundação do Habr até hoje.

No entanto, a principal utilidade do timestamp do comentário — não o horário do dia, mas o período de "vida ativa" do artigo. Calculei como o tempo desde a publicação do artigo até o comentário se distribui. Verifiquei que, atualmente, o comentário mediano (linha verde) chega cerca de 20 horas depois, ou seja, durante as primeiras 24 horas após a publicação, é deixada, em média, um pouco mais da metade de todos os comentários do artigo. E, em 48 horas, são 75% de todos os comentários. No passado, os artigos eram lidos ainda mais rapidamente — assim, em 2010, metade dos comentários chegava já nas primeiras 6 horas.

Fiquei surpreso ao descobrir que os comentários se tornaram mais longos: o número médio de caracteres em um comentário, ao longo da existência do Habr, quase dobrou!

Uma forma de feedback mais simples do que comentários são os votos. Ao contrário de muitos outros recursos, no Habr é possível dar não apenas votos positivos, mas também negativos. No entanto, essa última possibilidade não é utilizada com tanta frequência: a atual proporção de deslikes é de cerca de 15% de todos os votos dados. No passado era maior, mas ao longo do tempo os leitores se tornaram mais bondosos.

Com o tempo, os próprios textos também mudaram. Por exemplo, o comprimento típico dos textos não parou de crescer de forma constante desde o lançamento do site, apesar das crises. Em uma década, os textos se tornaram quase dez vezes mais longos!

A estilística dos textos (a princípio) também mudou. Nos primeiros anos de existência do Habr, por exemplo, a proporção de código e números nos textos aumentou:

Depois de analisar a dinâmica geral do site, decidi medir como a popularidade de vários tópicos mudou. Os tópicos podem ser identificados automaticamente a partir dos textos, mas para começar, não precisamos reinventar a roda, podemos usar as tags prontas fornecidas pelos autores de cada artigo. Quatro tendências típicas estão mostradas no gráfico. O tópico "Google" inicialmente dominou (provavelmente principalmente devido à otimização para SEO), mas perdeu peso a cada ano. Javascript foi um tópico popular e continua a crescer gradualmente, enquanto o aprendizado de máquina começou a ganhar popularidade rapidamente apenas nos últimos anos. O Linux, por outro lado, permanece igualmente relevante ao longo da década.

Certamente, fiquei curioso para saber quais tópicos atraem mais atividade de leitura. Eu contei o número mediano de visualizações, votos e comentários para cada tópico. Aqui está o resultado:
- Os tópicos mais visualizados: arduino, design de sites, desenvolvimento web, notícias, links, css, html, html5, nginx, algoritmos.
- Os tópicos mais "curtíveis": vk, humor, jquery, opera, c, html, desenvolvimento web, html5, css, design de sites.
- Os tópicos mais discutidos: opera, skype, freelancer, vk, ubuntu, trabalho, nokia, nginx, arduino, firefox.
A propósito, já que estou comparando tópicos, podemos classificá-los por frequência (e comparar os resultados com ).
- Ao longo de todos os anos de existência do Habr, as tags mais populares (em ordem decrescente) foram google, android, javascript, microsoft, linux, php, apple, java, python, programação, startups, desenvolvimento, ios, startup, redes sociais.
- Em 2017, os mais populares foram javascript, python, java, android, desenvolvimento, linux, c++, programação, php, c#, ios, aprendizado de máquina, segurança da informação, microsoft, react.
Ao comparar essas classificações, podemos notar, por exemplo, a marcha triunfante do Python e a extinção do php, ou o "crepúsculo" da temática de startups e a ascensão do aprendizado de máquina.
Nem todas as tags no Habr têm um tema tão óbvio. Aqui estão, por exemplo, uma dezena de tags que apareceram apenas uma vez e que me pareceram engraçadas. Então: "ideia motor do progresso", "carregamento a partir da imagem de disquete", "estado do Iowa", "dramaturgia", "superalexa", "motor a vapor", "o que fazer no sábado", "tenho uma raposa na moenda", "e acabou sendo como sempre", "não consegui inventar tags engraçadas". Para determinar o tema desses artigos, as tags não são suficientes — será necessário realizar modelagem temática sobre os textos dos artigos.
Uma análise mais detalhada do conteúdo dos artigos será no próximo post. Primeiro, pretendo construir um modelo que preveja o número de visualizações de um artigo com base no seu conteúdo. Em segundo lugar, gostaria de ensinar uma rede neural a gerar textos no mesmo estilo que os autores do Habr. Então, fiquem atentos 🙂
P.S. E aqui está o censurado .
Fonte: habr.com
