Tere Habr.
В
Kellele juhtunu vastu huvi pakub, siis jätk on lahtri all.
Tuletan veel kord meelde, et statistika ja reitingud ei ole ametlikud, minul puudub siseinfo. Samuti pole garanteeritud, et ma kuskil ei eksinud või millestki mööda ei pannud. Aga siiski, ma arvan, et see osutus huvitavaks. Kõigepealt alustame koodiga, kes sellest huvitatud ei ole, võivad esimesed jaotised vahele jätta.
Andmete kogumine
Parseri esimeses versioonis võeti arvesse ainult vaatamiste, kommentaaride ja artiklite hinnangute arvu. See on juba hea, kuid see ei võimalda teil teha keerukamaid päringuid. On aeg analüüsida saidi temaatilisi jaotisi, see võimaldab teil teha üsna huvitavaid uuringuid, näiteks vaadata, kuidas jaotise "C++" populaarsus on mitme aasta jooksul muutunud.
Artikli parserit on täiustatud, nüüd tagastab see jaoturid, kuhu artikkel kuulub, samuti autori hüüdnime ja tema hinnangu (ka siin saab teha palju huvitavat, aga see tuleb hiljem). Andmed salvestatakse csv-faili, mis näeb välja umbes selline:
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
...
Saame saidi peamiste temaatiliste keskuste loendi.
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)
Funktsioon find_between ja klass Str valivad stringi kahe sildi vahel, mina kasutasin neid
Funktsiooni get_hubs väljund on üsna muljetavaldav nimekiri, mille salvestame sõnaraamatuna. Esitan konkreetselt nimekirja tervikuna, et saaksite hinnata selle mahtu.
hubs_profile = {'infosecurity', 'programming', 'webdev', 'python', 'sys_admin', 'it-infrastructure', 'devops', 'javascript', 'open_source', 'network_technologies', 'gamedev', 'cpp', 'machine_learning', 'pm', 'hr_management', 'linux', 'analysis_design', 'ui', 'net', 'hi', 'maths', 'mobile_dev', 'productpm', 'win_dev', 'it_testing', 'dev_management', 'algorithms', 'go', 'php', 'csharp', 'nix', 'data_visualization', 'web_testing', 's_admin', 'crazydev', 'data_mining', 'bigdata', 'c', 'java', 'usability', 'instant_messaging', 'gtd', 'system_programming', 'ios_dev', 'oop', 'nginx', 'kubernetes', 'sql', '3d_graphics', 'css', 'geo', 'image_processing', 'controllers', 'game_design', 'html5', 'community_management', 'electronics', 'android_dev', 'crypto', 'netdev', 'cisconetworks', 'db_admins', 'funcprog', 'wireless', 'dwh', 'linux_dev', 'assembler', 'reactjs', 'sales', 'microservices', 'search_technologies', 'compilers', 'virtualization', 'client_side_optimization', 'distributed_systems', 'api', 'media_management', 'complete_code', 'typescript', 'postgresql', 'rust', 'agile', 'refactoring', 'parallel_programming', 'mssql', 'game_promotion', 'robo_dev', 'reverse-engineering', 'web_analytics', 'unity', 'symfony', 'build_automation', 'swift', 'raspberrypi', 'web_design', 'kotlin', 'debug', 'pay_system', 'apps_design', 'git', 'shells', 'laravel', 'mobile_testing', 'openstreetmap', 'lua', 'vs', 'yii', 'sport_programming', 'service_desk', 'itstandarts', 'nodejs', 'data_warehouse', 'ctf', 'erp', 'video', 'mobileanalytics', 'ipv6', 'virus', 'crm', 'backup', 'mesh_networking', 'cad_cam', 'patents', 'cloud_computing', 'growthhacking', 'iot_dev', 'server_side_optimization', 'latex', 'natural_language_processing', 'scala', 'unreal_engine', 'mongodb', 'delphi', 'industrial_control_system', 'r', 'fpga', 'oracle', 'arduino', 'magento', 'ruby', 'nosql', 'flutter', 'xml', 'apache', 'sveltejs', 'devmail', 'ecommerce_development', 'opendata', 'Hadoop', 'yandex_api', 'game_monetization', 'ror', 'graph_design', 'scada', 'mobile_monetization', 'sqlite', 'accessibility', 'saas', 'helpdesk', 'matlab', 'julia', 'aws', 'data_recovery', 'erlang', 'angular', 'osx_dev', 'dns', 'dart', 'vector_graphics', 'asp', 'domains', 'cvs', 'asterisk', 'iis', 'it_monetization', 'localization', 'objectivec', 'IPFS', 'jquery', 'lisp', 'arvrdev', 'powershell', 'd', 'conversion', 'animation', 'webgl', 'wordpress', 'elm', 'qt_software', 'google_api', 'groovy_grails', 'Sailfish_dev', 'Atlassian', 'desktop_environment', 'game_testing', 'mysql', 'ecm', 'cms', 'Xamarin', 'haskell', 'prototyping', 'sw', 'django', 'gradle', 'billing', 'tdd', 'openshift', 'canvas', 'map_api', 'vuejs', 'data_compression', 'tizen_dev', 'iptv', 'mono', 'labview', 'perl', 'AJAX', 'ms_access', 'gpgpu', 'infolust', 'microformats', 'facebook_api', 'vba', 'twitter_api', 'twisted', 'phalcon', 'joomla', 'action_script', 'flex', 'gtk', 'meteorjs', 'iconoskaz', 'cobol', 'cocoa', 'fortran', 'uml', 'codeigniter', 'prolog', 'mercurial', 'drupal', 'wp_dev', 'smallbasic', 'webassembly', 'cubrid', 'fido', 'bada_dev', 'cgi', 'extjs', 'zend_framework', 'typography', 'UEFI', 'geo_systems', 'vim', 'creative_commons', 'modx', 'derbyjs', 'xcode', 'greasemonkey', 'i2p', 'flash_platform', 'coffeescript', 'fsharp', 'clojure', 'puppet', 'forth', 'processing_lang', 'firebird', 'javame_dev', 'cakephp', 'google_cloud_vision_api', 'kohanaphp', 'elixirphoenix', 'eclipse', 'xslt', 'smalltalk', 'googlecloud', 'gae', 'mootools', 'emacs', 'flask', 'gwt', 'web_monetization', 'circuit-design', 'office365dev', 'haxe', 'doctrine', 'typo3', 'regex', 'solidity', 'brainfuck', 'sphinx', 'san', 'vk_api', 'ecommerce'}
Võrdluseks, geektimesi jaotised näevad tagasihoidlikumad välja:
hubs_gt = {'popular_science', 'history', 'soft', 'lifehacks', 'health', 'finance', 'artificial_intelligence', 'itcompanies', 'DIY', 'energy', 'transport', 'gadgets', 'social_networks', 'space', 'futurenow', 'it_bigraphy', 'antikvariat', 'games', 'hardware', 'learning_languages', 'urban', 'brain', 'internet_of_things', 'easyelectronics', 'cellular', 'physics', 'cryptocurrency', 'interviews', 'biotech', 'network_hardware', 'autogadgets', 'lasers', 'sound', 'home_automation', 'smartphones', 'statistics', 'robot', 'cpu', 'video_tech', 'Ecology', 'presentation', 'desktops', 'wearable_electronics', 'quantum', 'notebooks', 'cyberpunk', 'Peripheral', 'demoscene', 'copyright', 'astronomy', 'arvr', 'medgadgets', '3d-printers', 'Chemistry', 'storages', 'sci-fi', 'logic_games', 'office', 'tablets', 'displays', 'video_conferencing', 'videocards', 'photo', 'multicopters', 'supercomputers', 'telemedicine', 'cybersport', 'nano', 'crowdsourcing', 'infographics'}
Ülejäänud sõlmpunktid säilitati samamoodi. Nüüd on lihtne kirjutada funktsiooni, mis tagastab tulemuse olenemata sellest, kas artikkel kuulub geektimesi või profiilijaoturisse.
def is_geektimes(hubs: List) -> bool:
return len(set(hubs) & hubs_gt) > 0
def is_geektimes_only(hubs: List) -> bool:
return is_geektimes(hubs) is True and is_profile(hubs) is False
def is_profile(hubs: List) -> bool:
return len(set(hubs) & hubs_profile) > 0
Sarnased funktsioonid tehti ka teistele osadele (“arendus”, “haldus” jne).
Töötlemine
On aeg hakata analüüsima. Laadime andmestiku ja töötleme jaoturi andmeid.
def to_list(s: str) -> List[str]:
# "user:popular_science+astronomy" => [popular_science, astronomy]
return s.split(':')[1].split('+')
def to_date(dt: datetime) -> datetime.date:
return dt.date()
df = pd.read_csv("habr_2019.csv", sep=',', encoding='utf-8', error_bad_lines=True, quotechar='"', comment='#')
dates = pd.to_datetime(df['datetime'], format='%Y-%m-%dT%H:%MZ')
dates += datetime.timedelta(hours=3)
df['date'] = dates.map(to_date, na_action=None)
hubs = df["hubs"].map(to_list, na_action=None)
df['hubs'] = hubs
df['is_profile'] = hubs.map(is_profile, na_action=None)
df['is_geektimes'] = hubs.map(is_geektimes, na_action=None)
df['is_geektimes_only'] = hubs.map(is_geektimes_only, na_action=None)
df['is_admin'] = hubs.map(is_admin, na_action=None)
df['is_develop'] = hubs.map(is_develop, na_action=None)
Nüüd saame andmeid rühmitada päevade kaupa ja kuvada erinevate jaoturite väljaannete arvu.
g = df.groupby(['date'])
days_count = g.size().reset_index(name='counts')
year_days = days_count['date'].values
grouped = g.sum().reset_index()
profile_per_day_avg = grouped['is_profile'].rolling(window=20, min_periods=1).mean()
geektimes_per_day_avg = grouped['is_geektimes'].rolling(window=20, min_periods=1).mean()
geektimesonly_per_day_avg = grouped['is_geektimes_only'].rolling(window=20, min_periods=1).mean()
admin_per_day_avg = grouped['is_admin'].rolling(window=20, min_periods=1).mean()
develop_per_day_avg = grouped['is_develop'].rolling(window=20, min_periods=1).mean()
Kuvame Matplotlibi abil avaldatud artiklite arvu:
Jagasin graafikus artiklid “geektimes” ja “ainult geektimes”, kuna Artikkel võib kuuluda korraga mõlemasse jaotisesse (näiteks "DIY" + "mikrokontrollerid" + "C++"). Kasutasin saidi profiiliartiklite esiletõstmiseks nimetust "profiil", ehkki võib-olla pole selle ingliskeelne termin profile täiesti õige.
Eelmises osas uurisime “geektime efekti” kohta, mis on seotud sellest suvest algava geektime artiklite maksereeglite muudatusega. Kuvame geektimesi artiklid eraldi:
df_gt = df[(df['is_geektimes_only'] == True)]
group_gt = df_gt.groupby(['date'])
days_count_gt = group_gt.size().reset_index(name='counts')
grouped = group_gt.sum().reset_index()
year_days_gt = days_count_gt['date'].values
view_gt_per_day_avg = grouped['views'].rolling(window=20, min_periods=1).mean()
Tulemus on huvitav. Geektimesi artiklite vaatamiste ligikaudne suhe koguarvusse on kuskil 1:5. Kuid kuigi vaatamiste koguarv kõikus märgatavalt, jäi “meelelahutuslike” artiklite vaatamine ligikaudu samale tasemele.
Samuti võite märgata, et artiklite vaatamiste koguarv jaotises "geektimes" langes pärast reeglite muutmist siiski, kuid "silma järgi", mitte rohkem kui 5% koguväärtustest.
Huvitav on vaadata keskmist vaatamiste arvu artikli kohta:
"Meelelahutuslike" artiklite puhul on see umbes 40% keskmisest kõrgem. See pole ilmselt üllatav. Aprilli alguse tõrge on minu jaoks ebaselge, võib-olla juhtus nii või on see mingi sõelumisviga või äkki läks keegi geektimesi autoritest puhkusele ;).
Muide, graafikul on näha veel kaks märgatavamat artiklite vaatamiste arvu tippu - uusaasta ja maipühad.
Jaoturid
Liigume edasi lubatud jaoturite analüüsi juurde. Loetleme 20 parimat jaoturit vaatamiste arvu järgi:
hubs_info = []
for hub_name in hubs_all:
mask = df['hubs'].apply(lambda x: hub_name in x)
df_hub = df[mask]
count, views = df_hub.shape[0], df_hub['views'].sum()
hubs_info.append((hub_name, count, views))
# Draw hubs
hubs_top = sorted(hubs_info, key=lambda v: v[2], reverse=True)[:20]
top_views = list(map(lambda x: x[2], hubs_top))
top_names = list(map(lambda x: x[0], hubs_top))
plt.rcParams["figure.figsize"] = (8, 6)
plt.bar(range(0, len(top_views)), top_views)
plt.xticks(range(0, len(top_names)), top_names, rotation=90)
plt.ticklabel_format(style='plain', axis='y')
plt.tight_layout()
plt.show()
Tulemus:
Üllataval kombel oli vaadetelt kõige populaarsem sõlmpunkt “Infoturve”, esiviisikusse mahtusid ka “Programmeerimine” ja “Populaarteadus”.
Antitop hõivab Gtk ja Cocoa.
Ma ütlen teile saladuse, ülemised rummud on ka näha
Hinnang
Ja lõpuks lubatud reiting. Jaoturi analüüsi andmeid kasutades saame kuvada selle 2019. aasta populaarseimate jaoturite populaarseimad artiklid.
Infoturbe
Kuidas ma aasta aega Sberbankis ei töötanud 304000 599 vaatamist, 457.0 kommentaari, hinnang +14.0/-XNUMXKasutuselt kõrvaldatud nutipirnid on väärtuslik isikliku teabe allikas 232000 147 vaatamist, 75.0 kommentaari, hinnang +11.0/-XNUMXPetturid ja EDS - kõik on väga halb 176000 778 vaatamist, 356.0 kommentaari, hinnang +0.0/-XNUMXKuidas Megafon mobiilitellimusel magama jäi 166000 676 vaatamist, 624.0 kommentaari, hinnang +2.0/-XNUMXVK häkkimine, kahefaktoriline autentimine ei päästa 148000 332 vaatamist, 124.0 kommentaari, hinnang +17.0/-XNUMXKuidas brauser aitab seltsimees majorit 132000 321 vaatamist, 246.0 kommentaari, hinnang +19.0/-XNUMXAjaloo suurim prügimägi: 2,7 miljardit kontot, millest 773 miljonit olid ainulaadsed. 123000 154 vaatamist, 86.0 kommentaari, hinnang +5.0/-XNUMXKallis, me tapame Interneti 121000 933 vaatamist, 392.0 kommentaari, hinnang +83.0/-XNUMX„Mobiilisisu” on tasuta, ilma SMS-ide ja registreerimiseta. Megafoni pettuse üksikasjad 114000 478 vaatamist, 488.0 kommentaari, hinnang +8.0/-XNUMXPortskanner Rostelecomi isiklikul kontol 111000 194 vaatamist, 300.0 kommentaari, hinnang +8.0/-XNUMX
Programmeerimine
Ühe mehe kohta 167000 249 vaatamist, 239.0 kommentaari, hinnang +33.0/-XNUMXMida varem OOP-i unustate, seda parem teile ja teie programmidele 129000 1271 vaatamist, 131.0 kommentaari, hinnang +63.0/-XNUMXMiks vanemarendajad ei saa tööd? 119000 901 vaatamist, 151.0 kommentaari, hinnang +14.0/-XNUMXKas see pole koht vanadele inimestele? Programmeerimine pärast kolmekümne viit 116000 649 vaatamist, 222.0 kommentaari, hinnang +16.0/-XNUMXUued programmeerimiskeeled tapavad vaikselt meie sidet reaalsusega 106000 764 vaatamist, 164.0 kommentaari, hinnang +52.0/-XNUMXMida ma õppisin raskel teel (30 aastat tarkvaraarenduses) 101000 128 vaatamist, 178.0 kommentaari, hinnang +9.0/-XNUMXKõige haruldasemad ja kallimad programmeerimiskeeled 82900 119 vaatamist, 38.0 kommentaari, hinnang +10.0/-XNUMXLoengute kursus JavaScripti ja Node.js-i kohta KPI-s 80300 14 vaatamist, 34.0 kommentaari, hinnang +2.0/-XNUMXIT terminid kartulikasvatuse protsessi näitel 78000 86 vaatamist, 84.0 kommentaari, hinnang +14.0/-XNUMX256 rida tühja C++: kiirjälgija kirjutamine nullist mõne tunniga 77600 124 vaatamist, 241.0 kommentaari, hinnang +0.0/-XNUMX
Populaarne teadus
Mida disainer suitsetas: ebatavalised tulirelvad 236000 123 vaatamist, 119.0 kommentaari, hinnang +9.0/-XNUMXTeadlased leidsid Maalt vanima elusoleva selgroogse 234000 212 vaatamist, 82.0 kommentaari, hinnang +14.0/-XNUMXSari "Tšernobõli": vaadake ja mõelge 173000 803 vaatamist, 164.0 kommentaari, hinnang +25.0/-XNUMX12-aastane teismeline viis oma koduses laboris läbi tuumasünteesi reaktsiooni. 145000 280 vaatamist, 126.0 kommentaari, hinnang +29.0/-XNUMXLugu sulamist roosist ja langenud Krenkast 134000 244 vaatamist, 217.0 kommentaari, hinnang +1.0/-XNUMXSuumi seda! Kaasaegne eraldusvõime suurendamine 134000 235 vaatamist, 377.0 kommentaari, hinnang +1.0/-XNUMXBoeing 737 Maxi tarkvara kirjutasid allhankijad, kes teenisid 9 dollarit tunnis. 126000 560 vaatamist, 153.0 kommentaari, hinnang +6.0/-XNUMXÄrge olge närvis, ärge kiirustage, ärge katkestage: lugu tragöödiast 121000 384 vaatamist, 242.0 kommentaari, hinnang +4.0/-XNUMXMatemaatikud on avastanud täiusliku viisi arvude korrutamiseks 108000 222 vaatamist, 173.0 kommentaari, hinnang +10.0/-XNUMXUued programmeerimiskeeled tapavad vaikselt meie sidet reaalsusega 106000 764 vaatamist, 164.0 kommentaari, hinnang +52.0/-XNUMX
karjäär
Kuidas ma aasta aega Sberbankis ei töötanud 304000 599 vaatamist, 457.0 kommentaari, hinnang +14.0/-XNUMXMa rikun oma koodiülevaatustega arendajate elusid ja vabandan 187000 21 vaatamist, 37.0 kommentaari, hinnang +3.0/-XNUMXArengukuningas 179000 668 vaatamist, 315.0 kommentaari, hinnang +60.0/-XNUMXÜhe mehe kohta 167000 249 vaatamist, 239.0 kommentaari, hinnang +33.0/-XNUMXPensionile 22 158000 927 vaatamist, 259.0 kommentaari, hinnang +100.0/-XNUMXKuidas vahetada oma töökohal lambipirni ilma vallandamata? 139000 762 vaatamist, 200.0 kommentaari, hinnang +20.0/-XNUMXInnovatsioon vene keeles 128000 612 vaatamist, 480.0 kommentaari, hinnang +33.0/-XNUMXMiks vanemarendajad ei saa tööd? 119000 901 vaatamist, 151.0 kommentaari, hinnang +14.0/-XNUMX"Põlenud" töötajad: kas on väljapääs? 117000 398 vaatamist, 210.0 kommentaari, hinnang +14.0/-XNUMXKas see pole koht vanadele inimestele? Programmeerimine pärast kolmekümne viit 116000 649 vaatamist, 222.0 kommentaari, hinnang +16.0/-XNUMX
IT-alane seadusandlus
Petturid ja EDS - kõik on väga halb 176000 778 vaatamist, 356.0 kommentaari, hinnang +0.0/-XNUMXKuidas Megafon mobiilitellimusel magama jäi 166000 676 vaatamist, 624.0 kommentaari, hinnang +2.0/-XNUMXInnovatsioon vene keeles 128000 612 vaatamist, 480.0 kommentaari, hinnang +33.0/-XNUMX„Mobiilisisu” on tasuta, ilma SMS-ide ja registreerimiseta. Megafoni pettuse üksikasjad 114000 478 vaatamist, 488.0 kommentaari, hinnang +8.0/-XNUMXKuidas Kasahstani võimud üritavad varjata oma suutmatust tunnistust rakendada 111000 77 vaatamist, 122.0 kommentaari, hinnang +14.0/-XNUMXKuidas Protonmail Venemaal blokeeritakse 102000 398 vaatamist, 418.0 kommentaari, hinnang +7.0/-XNUMXRiigiduuma võttis Runeti isoleerimise seaduse vastu kolmel lugemisel 88200 878 vaatamist, 73.0 kommentaari, hinnang +18.0/-XNUMXKuidas programmeerija panka valis ja lepinguid luges 87200 611 vaatamist, 166.0 kommentaari, hinnang +9.0/-XNUMXTelekommunikatsiooni- ja massikommunikatsiooniministeerium kiitis heaks RuNeti isoleerimise seaduseelnõu 83600 364 vaatamist, 79.0 kommentaari, hinnang +9.0/-XNUMXÜksikasjalik vastus kommentaarile, samuti natuke teenuseosutajate elust Vene Föderatsioonis 74700 389 vaatamist, 290.0 kommentaari, hinnang +1.0/-XNUMX
Veebiarendus
Kas see pole koht vanadele inimestele? Programmeerimine pärast kolmekümne viit 116000 649 vaatamist, 222.0 kommentaari, hinnang +16.0/-XNUMXKuidas teha veebisaite 2019. aastal 110000 278 vaatamist, 233.0 kommentaari, hinnang +11.0/-XNUMXDockeri õppimine, 1. osa: põhitõed 91300 24 vaatamist, 52.0 kommentaari, hinnang +10.0/-XNUMXLoengute kursus JavaScripti ja Node.js-i kohta KPI-s 80300 14 vaatamist, 34.0 kommentaari, hinnang +2.0/-XNUMXPraktikant Vasya ja tema lood API idempotentsusest 68900 160 vaatamist, 216.0 kommentaari, hinnang +3.0/-XNUMXÜhenduste mõistmine on katki. See pole kindlasti ringide ristumiskoht, ausalt 65900 223 vaatamist, 138.0 kommentaari, hinnang +41.0/-XNUMXMiks te ei peaks raiskama oma aega nišiteemaliste veebisaitide loomisele? 62700 243 vaatamist, 179.0 kommentaari, hinnang +13.0/-XNUMXKaasaegse veebirakenduse tegemine nullist 62200 122 vaatamist, 56.0 kommentaari, hinnang +8.0/-XNUMXVue.js-i jaoks pime päev 60800 133 vaatamist, 77.0 kommentaari, hinnang +6.0/-XNUMXMiks on kaasaegne veebiarendus nii keeruline? 1. osa 57700 319 vaatamist, 101.0 kommentaari, hinnang +6.0/-XNUMX
GTK
Ja lõpuks, et keegi ei oleks solvunud, annan kõige vähem külastatud keskusele hinnangu “gtk”. Aastaga ilmus see üks Artikkel, mis asub ka "automaatselt" reitingu esimesel real.
GtkApplicationi kasutamine. librsvg renderdusfunktsioonid 1700 9 vaatamist, 9.0 kommentaari, hinnang +1.0/-XNUMX
Järeldus
Järeldust ei tule. Head lugemist kõigile.
Allikas: www.habr.com