嘿哈布爾。
В
對於那些對發生的事情感興趣的人來說,續集已被削減。
讓我再次提醒您,統計數據和評級不是官方的,我沒有任何內幕消息。 也不能保證我沒有在某個地方犯錯或遺漏什麼。 但我仍然認為這很有趣。 我們先從程式碼開始;對此不感興趣的人可以跳過第一部分。
資料收集
在解析器的第一個版本中,僅考慮視圖、評論和文章評分的數量。 這已經很好了,但是它不允許您進行更複雜的查詢。 是時候分析網站的主題部分了;這將使您能夠進行非常有趣的研究,例如,了解「C++」部分的受歡迎程度在過去幾年中發生了怎樣的變化。
文章解析器得到了改進,現在它回到文章所屬的中心,以及作者的暱稱和他的評分(這裡也可以做很多有趣的事情,但這將在稍後進行)。 資料保存在 csv 檔案中,如下所示:
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
...
我們將收到該網站主要主題中心的清單。
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 函數和 Str 類別選擇兩個標籤之間的字串,我使用了它們
get_hubs 函數的輸出是一個相當令人印象深刻的列表,我們將其儲存為字典。 我專門完整地展示了該列表,以便您可以估計其數量。
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'}
相較之下,極客時代部分看起來更樸素:
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'}
其餘的樞紐也以同樣的方式保存。 現在很容易編寫一個函數來傳回結果,無論該文章屬於 geektimes 還是個人資料中心。
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
其他部分(「開發」、「管理」等)也有類似的功能。
處理
是時候開始分析了。 我們載入資料集並處理中心資料。
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)
現在我們可以按天對資料進行分組,並顯示不同中心的出版數量。
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()
我們使用 Matplotlib 顯示已發表文章的數量:
我在圖表中將文章“geektimes”和“geektimes only”分開,因為一篇文章可以同時屬於兩個部分(例如,「DIY」+「微控制器」+「C++」)。 我使用“個人資料”這個名稱來突出顯示網站上的個人資料文章,儘管英語術語“個人資料”可能並不完全正確。
在上一部分中,我們詢問了與今年夏天開始的極客時代文章付費規則變化相關的「極客時代效應」。 我們分別展示一下極客時代的文章:
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()
結果很有趣。 極客時代文章的瀏覽量與總瀏覽量的比例大約在 1:5 左右。 不過,雖然總瀏覽量波動較大,但「娛樂」類文章的瀏覽量基本上保持在同一水平。
您還可以注意到,“極客時代”版塊的文章總瀏覽量在更改規則後仍然有所下降,但“肉眼可見”,下降幅度不超過總值的 5%。
查看每篇文章的平均瀏覽量很有趣:
對於「娛樂」文章,該比例比平均高出 40% 左右。 這可能並不奇怪。 四月初的失敗對我來說並不清楚,也許這就是發生的事情,或者是某種解析錯誤,或者可能是極客時代的一位作者去度假了;)。
順便說一下,該圖顯示了文章瀏覽量的兩個更明顯的峰值——新年和五一假期。
集線器
讓我們繼續進行承諾的集線器分析。 讓我們按觀看次數列出前 20 個中心:
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()
其結果是:
令人驚訝的是,最受歡迎的主題是「資訊安全」;前五的還包括「程式設計」和「科普」。
Antitop佔據了Gtk和Cocoa。
告訴你一個秘密,頂級輪圈也能看到
等級
最後是承諾的評級。 使用中心分析數據,我們可以顯示 2019 年最受歡迎的中心的最受歡迎文章。
信息安全
我如何一年沒有在儲蓄銀行工作 304000 瀏覽,599 則評論,評分 +457.0/-14.0廢棄的智慧燈泡是個人資訊的寶貴來源 232000 瀏覽,147 則評論,評分 +75.0/-11.0詐欺者和數位簽名——一切都非常糟糕 176000 瀏覽,778 則評論,評分 +356.0/-0.0Megafon 是如何在行動訂閱上耗盡精力的 166000 瀏覽,676 則評論,評分 +624.0/-2.0破解VK,雙重認證不會保存 148000 瀏覽,332 則評論,評分 +124.0/-17.0瀏覽器如何幫助專業同志 132000 瀏覽,321 則評論,評分 +246.0/-19.0史上最大的轉儲:2,7 億個帳戶,其中 773 億個是唯一帳戶 123000 瀏覽,154 則評論,評分 +86.0/-5.0親愛的,我們正在扼殺互聯網 121000 瀏覽,933 則評論,評分 +392.0/-83.0「行動內容」是免費的,無需簡訊或註冊。 Megafon 的詐欺細節 114000 瀏覽,478 則評論,評分 +488.0/-8.0Rostelecom 個人帳戶中的連接埠掃描器 111000 瀏覽,194 則評論,評分 +300.0/-8.0
程序設計
關於一個人 167000 瀏覽,249 則評論,評分 +239.0/-33.0你越早忘記 OOP,對你和你的程序就越好 129000 瀏覽,1271 則評論,評分 +131.0/-63.0為什麼高級開發人員找不到工作 119000 瀏覽,901 則評論,評分 +151.0/-14.0這裡不適合老人家住嗎? 三十五歲以後編程 116000 瀏覽,649 則評論,評分 +222.0/-16.0新的程式語言正在悄悄扼殺我們與現實的聯繫 106000 瀏覽,764 則評論,評分 +164.0/-52.0我從慘痛的經驗中學到的東西(30 多年的軟體開發經驗) 101000 瀏覽,128 則評論,評分 +178.0/-9.0最稀有和最昂貴的編程語言 82900 瀏覽,119 則評論,評分 +38.0/-10.0KPI 的 JavaScript 和 Node.js 講座課程 80300 瀏覽,14 則評論,評分 +34.0/-2.0以種植馬鈴薯流程為例的 IT 術語 78000 瀏覽,86 則評論,評分 +84.0/-14.0256 行裸 C++:在幾個小時內從頭開始編寫光線追蹤器 77600 瀏覽,124 則評論,評分 +241.0/-0.0
科普
設計師抽的是什麼:不尋常的槍械 236000 瀏覽,123 則評論,評分 +119.0/-9.0科學家發現地球上最古老的現存脊椎動物 234000 瀏覽,212 則評論,評分 +82.0/-14.0電視劇《切爾諾貝利》:觀看並思考 173000 瀏覽,803 則評論,評分 +164.0/-25.0一名12歲的少年在他家的實驗室裡進行了核融合反應。 145000 瀏覽,280 則評論,評分 +126.0/-29.0合金玫瑰與墮落克倫卡的故事 134000 瀏覽,244 則評論,評分 +217.0/-1.0讓它變得更大! 現代解析度增強 134000 瀏覽,235 則評論,評分 +377.0/-1.0波音 737 Max 的軟體是由每小時賺取 9 美元的外包商編寫的。 126000 瀏覽,560 則評論,評分 +153.0/-6.0不要緊張,不要急,不要打斷:一個悲劇的故事 121000 瀏覽,384 則評論,評分 +242.0/-4.0數學家發現了數字相乘的完美方法 108000 瀏覽,222 則評論,評分 +173.0/-10.0新的程式語言正在悄悄扼殺我們與現實的聯繫 106000 瀏覽,764 則評論,評分 +164.0/-52.0
事業
我如何一年沒有在儲蓄銀行工作 304000 瀏覽,599 則評論,評分 +457.0/-14.0我的程式碼審查毀了開發人員的生活,我很抱歉 187000 瀏覽,21 則評論,評分 +37.0/-3.0發展之王 179000 瀏覽,668 則評論,評分 +315.0/-60.0關於一個人 167000 瀏覽,249 則評論,評分 +239.0/-33.022歲退休 158000 瀏覽,927 則評論,評分 +259.0/-100.0如何在工作場所更換燈泡而不被解僱? 139000 瀏覽,762 則評論,評分 +200.0/-20.0俄語創新 128000 瀏覽,612 則評論,評分 +480.0/-33.0為什麼高級開發人員找不到工作 119000 瀏覽,901 則評論,評分 +151.0/-14.0「被燒死」的員工:有出路嗎? 117000 瀏覽,398 則評論,評分 +210.0/-14.0這裡不適合老人家住嗎? 三十五歲以後編程 116000 瀏覽,649 則評論,評分 +222.0/-16.0
資訊科技立法
詐欺者和數位簽名——一切都非常糟糕 176000 瀏覽,778 則評論,評分 +356.0/-0.0Megafon 是如何在行動訂閱上耗盡精力的 166000 瀏覽,676 則評論,評分 +624.0/-2.0俄語創新 128000 瀏覽,612 則評論,評分 +480.0/-33.0「行動內容」是免費的,無需簡訊或註冊。 Megafon 的詐欺細節 114000 瀏覽,478 則評論,評分 +488.0/-8.0哈薩克當局如何試圖掩蓋其未能執行證書的事實 111000 瀏覽,77 則評論,評分 +122.0/-14.0Protonmail 在俄羅斯是如何被封鎖的 102000 瀏覽,398 則評論,評分 +418.0/-7.0國家杜馬三讀通過《符文隔離法》 88200 瀏覽,878 則評論,評分 +73.0/-18.0程式設計師如何選擇銀行並閱讀合約 87200 瀏覽,611 則評論,評分 +166.0/-9.0電信和大眾傳播部批准了隔離RuNet的法案 83600 瀏覽,364 則評論,評分 +79.0/-9.0對評論的詳細回應,以及有關俄羅斯聯邦提供者生活的一些信息 74700 瀏覽,389 則評論,評分 +290.0/-1.0
Web開發
這裡不適合老人家住嗎? 三十五歲以後編程 116000 瀏覽,649 則評論,評分 +222.0/-16.02019年如何做網站 110000 瀏覽,278 則評論,評分 +233.0/-11.0學習 Docker 第 1 部分:基礎知識 91300 瀏覽,24 則評論,評分 +52.0/-10.0KPI 的 JavaScript 和 Node.js 講座課程 80300 瀏覽,14 則評論,評分 +34.0/-2.0實習生 Vasya 和他關於 API 冪等性的故事 68900 瀏覽,160 則評論,評分 +216.0/-3.0對連結的理解被破壞了。 老實說,這絕對不是圓的交集 65900 瀏覽,223 則評論,評分 +138.0/-41.0為什麼你不應該浪費時間創建利基主題網站 62700 瀏覽,243 則評論,評分 +179.0/-13.0從頭開始製作現代 Web 應用程式 62200 瀏覽,122 則評論,評分 +56.0/-8.0Vue.js 的黑暗日子 60800 瀏覽,133 則評論,評分 +77.0/-6.0為什麼現代 Web 開發如此複雜? 第1部分 57700 瀏覽,319 則評論,評分 +101.0/-6.0
GTK
最後,為了不冒犯任何人,我將給出訪問量最少的中心“gtk”的評級。 一年之內就出版了 一 這篇文章也「自動」佔據了評分的第一行。
使用 Gtk 應用程式。 librsvg 渲染功能 1700 瀏覽,9 則評論,評分 +9.0/-1.0
結論
不會有任何結論。 大家閱讀愉快。
來源: www.habr.com