Habrastatistikk: utforske de mest og minst besøkte delene av nettstedet
Hei Habr.
В forrige del Habrs trafikk ble analysert i henhold til hovedparametrene - antall artikler, deres visninger og rangeringer. Spørsmålet om populariteten til nettstedsdelene forble imidlertid uundersøkt. Det ble interessant å se nærmere på dette og finne de mest populære og mest upopulære knutepunktene. Til slutt skal jeg se på geektimes-effekten mer detaljert, og avslutter med et nytt utvalg av de beste artiklene basert på nye rangeringer.
For de som er interessert i hva som skjedde, er fortsettelsen under kuttet.
La meg minne deg nok en gang om at statistikken og vurderingene ikke er offisielle, jeg har ingen innsideinformasjon. Det er heller ikke garantert at jeg ikke har gjort en feil et sted eller gått glipp av noe. Men likevel synes jeg det ble interessant. Vi starter med koden først, de som ikke er interessert i dette kan hoppe over de første delene.
Datainnsamling
I den første versjonen av parseren ble det kun tatt hensyn til antall visninger, kommentarer og artikkelvurderinger. Dette er allerede bra, men det lar deg ikke gjøre mer komplekse spørsmål. Det er på tide å analysere de tematiske delene av nettstedet; dette vil tillate deg å gjøre ganske interessant forskning, for eksempel se hvordan populariteten til "C++"-delen har endret seg over flere år.
Artikkelparseren har blitt forbedret, nå returnerer den knutepunktene som artikkelen tilhører, i tillegg til forfatterens kallenavn og hans vurdering (mange interessante ting kan gjøres her også, men det kommer senere). Dataene lagres i en csv-fil som ser omtrent slik ut:
2018-12-18T12:43Z,https://habr.com/ru/post/433550/,"Мессенджер Slack — причины выбора, косяки при внедрении и особенности сервиса, облегчающие жизнь",votes:7,votesplus:8,votesmin:1,bookmarks:32,
views:8300,comments:10,user:ReDisque,karma:5,subscribers:2,hubs:productpm+soft
...
Vi vil motta en liste over de viktigste tematiske knutepunktene på nettstedet.
def get_as_str(link: str) -> Str:
try:
r = requests.get(link)
return Str(r.text)
except Exception as e:
return Str("")
def get_hubs():
hubs = []
for p in range(1, 12):
page_html = get_as_str("https://habr.com/ru/hubs/page%d/" % p)
# page_html = get_as_str("https://habr.com/ru/hubs/geektimes/page%d/" % p) # Geektimes
# page_html = get_as_str("https://habr.com/ru/hubs/develop/page%d/" % p) # Develop
# page_html = get_as_str("https://habr.com/ru/hubs/admin/page%d" % p) # Admin
for hub in page_html.split("media-obj media-obj_hub"):
info = Str(hub).find_between('"https://habr.com/ru/hub', 'list-snippet__tags')
if "*</span>" in info:
hub_name = info.find_between('/', '/"')
if len(hub_name) > 0 and len(hub_name) < 32:
hubs.append(hub_name)
print(hubs)
Find_between-funksjonen og Str-klassen velger en streng mellom to tagger, jeg brukte dem tidligere. Tematiske hubs er merket med en "*" slik at de enkelt kan fremheves, og du kan også fjerne kommentarer til de tilsvarende linjene for å få deler av andre kategorier.
Utdataene til get_hubs-funksjonen er en ganske imponerende liste, som vi lagrer som en ordbok. Jeg presenterer spesifikt listen i sin helhet slik at du kan anslå volumet.
De resterende navene ble bevart på samme måte. Nå er det enkelt å skrive en funksjon som returnerer resultatet enten artikkelen tilhører geektimes eller en profilhub.
Vi viser antall publiserte artikler ved hjelp av Matplotlib:
Jeg delte artiklene "geektimes" og "geektimes only" i diagrammet, fordi En artikkel kan tilhøre begge seksjonene samtidig (for eksempel "DIY" + "microcontrollers" + "C++"). Jeg brukte betegnelsen «profil» for å fremheve profilartikler på siden, selv om kanskje det engelske uttrykket profile for dette ikke er helt korrekt.
I forrige del spurte vi om "geektimes-effekten" knyttet til endringen i betalingsreglene for artikler for nerdetider som starter i sommer. La oss vise artiklene om geektimes separat:
Resultatet er interessant. Det omtrentlige forholdet mellom visninger av geektimes-artikler og totalen er et sted rundt 1:5. Men mens det totale antallet visninger svingte merkbart, holdt visningen av «underholdning»-artikler seg på omtrent samme nivå.
Du kan også legge merke til at det totale antallet visninger av artikler i "geektimes"-delen fortsatt falt etter å ha endret reglene, men "etter øyet", med ikke mer enn 5% av de totale verdiene.
Det er interessant å se på gjennomsnittlig antall visninger per artikkel:
For «underholdning»-artikler er det omtrent 40 % over gjennomsnittet. Dette er nok ikke overraskende. Feilen i begynnelsen av april er uklar for meg, kanskje det er det som skjedde, eller det er en slags parsefeil, eller kanskje en av geektime-forfatterne dro på ferie ;).
Grafen viser forresten to mer merkbare topper i antall visninger av artikler - nyttårs- og maiferien.
Huber
La oss gå videre til den lovede analysen av huber. La oss liste de 20 beste knutepunktene etter antall visninger:
Overraskende nok var det mest populære knutepunktet når det gjelder synspunkter "Informasjonssikkerhet"; topp 5-lederne inkluderte også "Programmering" og "Populærvitenskap".
Antitop okkuperer Gtk og Cocoa.
Jeg skal fortelle deg en hemmelighet, toppnavene kan også sees her, selv om antall visninger ikke vises der.
Rangering
Og til slutt, den lovede vurderingen. Ved å bruke hubanalysedata kan vi vise de mest populære artiklene for de mest populære hubene for dette året 2019.
Og til slutt, slik at ingen blir fornærmet, vil jeg gi vurderingen av det minst besøkte navet "gtk". I løpet av et år ble den publisert одна Artikkelen, som også "automatisk" opptar den første linjen i vurderingen.