Рейтинг хабов и компаний по постам/подписчикам

в 16:28, , рубрики: html, java, хаб, Хабрахабр API, метки: , , , ,

На данный момент на хабре около 350 хабов. Функционал сайта позволяет сортировать их по имени и по индексу. А по другим параметрам — например по количеству постов — нет, а хотелось бы.

Меня вдохновила статья рейтинг постов хаба, и я решил сделать похожую, но составить уже рейтинг самих хабов.

В первой половине статьи я представлю вам рейтинги хабов и компаний, а также небольшой их анализ. А во второй — подробно распишу, как я на Java с помощью библиотеки JSoup парсил HTML страницы хабры, с какими интересными явлениями и проблемами столкнулся. И в конце статьи выложу полный исходный код программы.

Рейтинг хабов и компаний по постам/подписчикам

Рейтинг хабов

По количеству постов

Чулан 35 971
Я пиарюсь 5 461
Веб-разработка 4 011
Информационная безопасность 3 385
Google 2 770
Железо 2 733
Гаджеты. Устройства для гиков 2 375
Программирование 2 293
Linux 2 235
Android 1 965
JavaScript 1 687
Apple 1 612
Хабрахабр 1 568
.NET 1 485
PHP 1 465
Системное администрирование 1 454
DIY или Сделай Сам 1 442
Разработка 1 331
Управление проектами 1 261
Интерфейсы 1 257
Microsoft 1 237
Game Development 1 218
Open source 1 110
Смартфоны и коммуникаторы 1 091
JAVA 1 020
Дизайн в IT 996
Алгоритмы 991
Копирайт 982
Социальные сети и сообщества 949
GTD 939
Windows 919
Учебный процесс в IT 916
Python 866
Робототехника 798
Разработка под Android 783
Разработка под iOS 777
Хостинг 749
C++ 711
Законодательство и IT-бизнес new 677
Медиа 664
Mobile Development 664
Научно-популярное 661
CSS 658
Веб-дизайн 653
Firefox 629
Облачные вычисления 608
Убунтариум 597
Софт 585
ИТ-Инфраструктура 561
Opera 561
Космонавтика 538
Сетевые технологии 518
Ненормальное программирование 510
Peer-to-Peer 495
*nix 474
Тестирование 472
Карьера в IT-индустрии 471
Google Chrome 468
Браузеры 468
Операционные системы 466
Обработка изображений 458
Яндекс 445
iPhone 440
Высокая производительность 438
История ИТ 434
Ruby 433
Искусственный интеллект 423
jQuery 414
Поисковые машины и технологии 410
Планшеты 392
Электроника для начинающих 387
Windows Phone 375
Виртуализация 371
Анимация и 3D графика 366
HTML 365
Математика 361
Платежные системы 354
C# 349
Работа с видео 349
Энергия и элементы питания 346
IP-телефония 345
Twitter 344
Блогосфера 338
CMS 333
Программинг микроконтроллеров 332
Старое железо 320
Криптография 309
Node.JS 308
Финансы в IT-индустрии 305
Беспроводные технологии 304
Qt Software 303
IM 300
Домены 290
Фриланс 290
Facebook 284
Работа со звуком 277
Игровые приставки 276
Django 271
Исследования и прогнозы в IT 270
MySQL 264
Ruby on Rails 252
Краудсорсинг 252
Mac OS X 249
Adobe 248
Типографика 244
Электронное правительство 243
Skype 242
IT-стандарты 242
Мобильный веб 241
Flash-платформа 240
Вирусы (и антивирусы) 239
Статистика в IT 239
Краудфандинг 235
Бизнес студии 233
Телефония 231
Серверное администрирование 231
Visual Studio 229
Спортивное программирование 229
Фототехника 226
YouTube 223
Arduino 222
SQL 218
Drupal 216
Cisco 213
Perl 206
Data Mining 203
Usability 201
Электронные книги 198
Проектирование и рефакторинг 196
Сетевое оборудование 188
Git 184
WordPress 184
Wikipedia 180
Ноутбуки 178
Спам (и антиспам) 170
Киберпанк 167
Офисы IT-компаний 163
Разработка под Windows Phone 161
Байнет 161
Анализ и проектирование систем 158
Биотехнологии 157
NoSQL 153
Amazon Web Services 151
Патенты 150
ASP 150
Symfony 149
Занимательные задачки 149
Клиентская оптимизация 148
Oracle 146
Нетбуки 146
Совершенный код 145
Delphi 143
Геоинформационные сервисы 143
Silverlight 139
Unity3D 138
3D-принтеры 138
Windows Azure 138
PostgreSQL 137
Zend Framework 136
Coworking: работа 2.0 133
Веб-аналитика 132
Серверная оптимизация 131
Agile 131
Nginx 128
Системное программирование 126
API 125
Yii 122
ERP-системы 120
Haskell 118
Asterisk 118
3G 116
Системы управления версиями 116
Инфографика 114
Процессоры 112
MODX 111
Internet Explorer 110
Big Data 108
Хабрахабр — Анонсы 106
Assembler 106
Mozilla 106
C 104
Дополненная реальность 103
GPS 100
VIM 100
ECM/СЭД 97
Накопители 96
Google App Engine 96
Objective C 94
Администрирование баз данных 93
Презентации 93
Восстановление данных 91
Ajax 91
Gmail 90
Microsoft SQL Server 89
Иконосказ 89
Erlang/OTP 87
SharePoint 87
Yahoo 87
LTE 86
PowerShell 86
OpenStreetMap 85
Mail.Ru 84
Векторная графика 83
IT-Биографии 82
Bitcoin 81
Canvas 81
LiveJournal 80
Функциональное программирование 79
Библиотека ExtJS/Sencha 79
BlackBerry 79
ВКонтакте 78
ООП 77
Биоинформатика 75
Компиляторы 74
TDD 73
Оценка и экспертиза IT-проектов 70
Creative Commons 70
Параллельное программирование 67
IPv6 new 67
Графические оболочки 67
WiMAX 66
Семантическая Сеть 63
AngularJS 63
Видео-техника 62
IPTV 62
Scala 59
SaaS / S+S 59
iPad 59
Радиосвязь 59
CodeIgniter 57
SmartTV 54
Микроформаты 54
Maps API 54
Kohana 53
ГЛОНАСС 52
Открытые данные 52
Нанотехнологии 51
Go 50
CAD/CAM 50
GreaseMonkey 50
Рамблер 48
КодоБред 48
Lisp 47
Демосцена 47
Регулярные выражения 47
Google API 46
Mono и Moonlight 46
INFOLUST 45
Eclipse 44
Периферия 43
Emacs 43
Моддинг 42
Wiki-технология 42
Настольные компьютеры 41
Яндекс API 41
Мониторы и ТВ 39
Отладка 39
MongoDB 39
Вконтакте API 39
LiveStreet 39
Sony PlayStation 38
LaTeX 38
Хабрахабр API 38
Fidonet 36
Sphinx 36
GPGPU 35
Accessibility 35
Groovy & Grails 35
XSLT 35
Разработка под Java ME 34
Apache 34
DNS 34
SQLite 34
Tizen 33
Safari 32
1С-Битрикс 31
Amazon Kindle 31
CRM-системы 31
Умный дом 30
Microsoft Kinect 29
R 28
Bing 27
Бегун 27
Медиаплееры 27
CakePHP 26
Google Web Toolkit 25
Google Analytics 24
XML 24
Action Script 23
UML Design 23
Оболочки 23
Lua 22
Суп 22
MooTools 22
Brainfuck 21
Google Plus 18
Doctrine ORM 18
Mercurial 18
Видеокарты 17
Facebook API 17
Meteor.JS new 16
Prolog 16
Системы охлаждения 16
PDF 15
Визуализация данных 15
Sun Microsystems 15
Derby.js 14
D 14
ASCII 14
WebGL new 13
Flex 13
I2P 13
Разработка под e-commerce new 12
Twitter API 12
Корпуса и блоки питания 11
Dart 10
Help Desk Software 10
Joomla 10
GTK+ 10
Cocoa 10
Mesh-сети 10
Хабракамп 10
GitHub new 9
Google AdSense 9
Firebird/Interbase 9
IIS 7
Разработка под Bada 7
LabVIEW 6
Системные платы 6
Физика new 5
Linkedin 5
Twisted 5
Cobol 5
Laravel new 5
Резервное копирование new 4
Raspberry Pi new 4
Fortran 4
Small Basic 4
Tumblr 3
Cubrid 3
Промышленное программирование new 3
Julia new 2
Microsoft Access 2
Growth Hacking new 2
Google Checkout 0
MySpace 0
Xcode new 0
SCADA new 0
По количеству подписчиков

Чулан 124 521
Я пиарюсь 101 864
Веб-разработка 96 117
Android 95 361
Гаджеты. Устройства для гиков 95 020
Смартфоны и коммуникаторы 94 376
Google 93 844
DIY или Сделай Сам 92 322
Железо 91 959
Информационная безопасность 91 729
Linux 91 103
Робототехника 89 721
Программирование 89 668
Планшеты 88 757
Google Chrome 88 197
Операционные системы 88 098
Интерфейсы 88 064
Windows 87 695
iPhone 87 609
Алгоритмы 87 372
Веб-дизайн 87 341
Электронные книги 86 582
Дизайн в IT 86 266
Совершенный код 85 525
Браузеры 85 443
iPad 85 290
Энергия и элементы питания 84 866
Научно-популярное 84 668
PHP 84 621
Убунтариум 84 613
Разработка 84 474
Старое железо 84 067
Нетбуки 84 060
Firefox 83 996
Учебный процесс в IT 83 645
Фототехника 83 556
Процессоры 83 217
Искусственный интеллект 83 092
IT-стандарты 83 080
Игровые приставки 83 045
Arduino 82 540
Разработка под Android 82 528
*nix 82 017
Накопители 81 897
Фриланс 81 789
Apple 81 742
Софт 81 611
Моддинг 81 565
Хабрахабр 81 317
Электроника для начинающих 81 169
Ненормальное программирование 80 989
Open source 80 508
C++ 80 117
Вирусы (и антивирусы) 80 108
JAVA 79 951
Видеокарты 79 915
Game Development 79 794
Opera 79 598
Криптография 79 590
Занимательные задачки 79 439
Gmail 79 417
Mac OS X 79 339
GPGPU 79 247
Проектирование и рефакторинг 79 077
Регулярные выражения 79 040
Анимация и 3D графика 78 907
Python 78 841
Sony PlayStation 78 625
Яндекс 78 611
Исследования и прогнозы в IT 78 592
Высокая производительность 78 465
Системы управления версиями 78 334
Тестирование 78 299
Git 78 119
История ИТ 78 111
Обработка изображений 77 961
Разработка под iOS 77 904
Инфографика 77 783
Типографика 77 650
Графические оболочки 77 569
Системное программирование 77 562
Microsoft 77 198
Киберпанк 77 140
BlackBerry 77 134
Клиентская оптимизация 77 040
Системное администрирование 76 920
Социальные сети и сообщества 76 601
Платежные системы 76 561
Windows Phone 76 525
YouTube 76 521
IT-Биографии 76 518
Оболочки 76 396
Дополненная реальность 76 207
ВКонтакте 75 955
Internet Explorer 75 791
Wikipedia 75 587
JavaScript 75 456
Nginx 75 417
Спам (и антиспам) 75 400
Статистика в IT 75 303
Биотехнологии 75 231
Safari 75 123
.NET 75 096
Иконосказ 75 077
Mobile Development 75 055
Спортивное программирование 75 035
Хабрахабр — Анонсы 74 977
Twitter 74 815
Ноутбуки 74 768
Сетевые технологии 74 684
КодоБред 74 666
Программинг микроконтроллеров 74 583
Законодательство и IT-бизнес new 74 524
Visual Studio 74 452
Векторная графика 74 381
Управление проектами 74 343
CSS 74 317
Компиляторы 74 182
Поисковые машины и технологии 74 091
Презентации 73 934
Mozilla 73 906
Копирайт 73 871
Электронное правительство 73 530
Беспроводные технологии 73 379
ООП 73 220
Facebook 73 134
Блогосфера 72 957
Медиа 72 803
HTML 72 780
Работа со звуком 72 695
MySQL 72 618
Работа с видео 72 576
Краудсорсинг 72 470
Ruby 72 361
Семантическая Сеть 72 348
VIM 72 054
Настольные компьютеры 71 904
Сетевое оборудование 71 874
Восстановление данных 71 842
Adobe 71 670
Серверная оптимизация 71 484
TDD 71 413
Google Web Toolkit 71 146
Хостинг 71 140
Skype 71 115
jQuery 71 051
Облачные вычисления 70 967
Assembler 70 903
LiveJournal 70 694
Виртуализация 70 557
Периферия 70 344
Мониторы и ТВ 70 339
Демосцена 70 252
Flash-платформа 70 239
Системные платы 69 800
Ajax 69 690
ASCII 69 615
GTD 69 606
Системы охлаждения 69 554
Серверное администрирование 69 490
Разработка под Java ME 69 484
PowerShell 69 471
Корпуса и блоки питания 69 317
OpenStreetMap 69 275
SQL 69 224
Perl 69 202
Mail.Ru 69 150
Sphinx 69 123
Amazon Kindle 69 117
Медиаплееры 69 107
Google App Engine 68 995
ИТ-Инфраструктура 68 951
Silverlight 68 910
Usability 68 852
ASP 68 839
Peer-to-Peer 68 785
Delphi 68 696
Mono и Moonlight 68 672
Видео-техника 68 670
SaaS / S+S 68 650
Erlang/OTP 68 527
Microsoft Kinect 68 330
Мобильный веб 68 062
Haskell 68 002
SharePoint 67 931
Scala 67 663
Lisp 67 630
Финансы в IT-индустрии 67 607
Bing 67 511
Офисы IT-компаний 67 490
Домены 67 431
3G 67 295
Sun Microsystems 67 134
C# 67 072
GPS 66 951
Creative Commons 66 917
Cisco 66 765
Yahoo 66 549
Суп 66 473
Рамблер 66 449
IP-телефония 66 391
WordPress 66 321
Веб-аналитика 66 186
Small Basic 65 777
Нанотехнологии 65 698
Brainfuck 65 698
Бегун 65 574
C 65 499
Карьера в IT-индустрии 65 484
Биоинформатика 65 346
IM 65 195
Телефония 65 161
ГЛОНАСС 65 035
LTE 65 031
Отладка 64 965
IPTV 64 903
Apache 64 747
WiMAX 64 516
NoSQL 64 462
XML 64 452
LabVIEW 64 032
PostgreSQL 63 808
CMS 63 798
Анализ и проектирование систем 63 789
Data Mining 63 429
Разработка под Windows Phone 63 231
Оценка и экспертиза IT-проектов 63 150
Бизнес студии 62 653
Патенты 62 628
Радиосвязь 62 543
Objective C 62 397
PDF 62 225
MongoDB 62 180
Байнет 62 092
Oracle 61 971
Agile 61 815
Fidonet 61 667
IIS 61 384
Qt Software 61 314
UML Design 61 176
Help Desk Software 61 107
Canvas 61 036
Coworking: работа 2.0 60 800
INFOLUST 60 691
CAD/CAM 60 679
Google Plus 60 381
Microsoft SQL Server 60 229
ERP-системы 60 131
Django 60 119
Mercurial 60 064
Google Analytics 60 018
Ruby on Rails 59 921
Eclipse 59 786
Микроформаты 59 732
Prolog 59 727
Lua 59 707
Drupal 59 627
Библиотека ExtJS/Sencha 59 563
Yii 59 549
Cocoa 59 009
Dart 58 889
XSLT 58 845
Zend Framework 58 803
Google AdSense 58 774
Linkedin 58 626
Doctrine ORM 58 411
Amazon Web Services 58 396
Maps API 58 232
Fortran 58 166
Администрирование баз данных 57 994
Google Checkout 57 982
Symfony 57 801
Cobol 57 789
LaTeX 57 694
Wiki-технология 57 553
Tumblr 57 225
CodeIgniter 57 202
MODX 57 195
DNS 56 880
Kohana 56 821
LiveStreet 56 805
GreaseMonkey 56 778
Google API 56 694
MooTools 56 586
Cubrid 56 218
CakePHP 56 188
Вконтакте API 56 150
Twisted 56 091
MySpace 56 044
Groovy & Grails 55 970
SmartTV 55 638
API 55 556
Яндекс API 54 962
Asterisk 54 796
Хабрахабр API 53 953
Facebook API 53 943
Twitter API 53 533
Go 53 219
Joomla 52 427
Разработка под Bada 52 204
GTK+ 51 409
Microsoft Access 51 313
Математика 50 725
1С-Битрикс 50 525
Краудфандинг 50 194
Космонавтика 50 055
Action Script 49 763
Flex 48 733
CRM-системы 48 715
Параллельное программирование 48 335
Геоинформационные сервисы 46 788
Функциональное программирование 45 774
Unity3D 44 350
Хабракамп 43 488
Big Data 40 561
Accessibility 40 427
Emacs 39 824
Windows Azure 37 406
3D-принтеры 36 576
R 35 515
Открытые данные 29 026
AngularJS 21 091
Визуализация данных 20 632
Tizen 19 933
I2P 13 001
Mesh-сети 12 610
D 12 585
ECM/СЭД 11 886
Derby.js 11 461
SQLite 11 175
Умный дом 11 122
Bitcoin 10 871
Firebird/Interbase 9 755
Node.JS 8 628
IPv6 new 6 186
Meteor.JS new 5 919
GitHub new 3 742
WebGL new 3 533
Резервное копирование new 3 503
Xcode new 2 823
Физика new 2 372
Raspberry Pi new 2 274
Промышленное программирование new 2 141
Разработка под e-commerce new 2 034
SCADA new 1 856
Laravel new 1 799
Growth Hacking new 1 063
Julia new 948

Когда я отсортировал хабы, обнаружились интересные вещи. Например я не знал, что существуют хабы с нулевым количеством постов. А их оказалось целых 4 штуки! Причём на каждый из них подписано более 500 человек. Наверно это очень перспективные направления — не имея постов на них уже набежало столько народу. У хаба MySpace нету ни одного поста/события, зато более 55К подписчиков — это о чём-то говорит!

Тройка хабов — Чулан, Я пиарюсь и Веб-разработка — лидируют как по количеству постов, так и по количеству читателей. И в этом нет ничего удивительного — первые два хаба весьма общие и свободные, а уж веб-разработка интересна многим. Далее идёт Информационная безопасность, которая пользуется на хабре бешеной популярностью. За ней — Google, которую можно считать компанией №1 в области IT — по ней больше всего постов, по сравнению с другими. Отчасти благодаря её ОС Android, которой выпало 4 место по количеству подписчиков.

К сожалению, я так и не понял, почему хаб Хабрахабр — оффтопик. По количеству постов он будет на 13 месте, да и подписчиков у него >80К. Получается, что писать на сайте об этом же сайте — отход от темы?

Огорчило, что хаб Java находится не так высоко, как хотелось бы.

Рейтинг компаний

Хотя изначально я планировал построить рейтинг только для хабов, в коммпентариях к статье выдвинули хорошую идею — сделать тоже самое и для компаний. Код при этом сильно менять не пришлось.

Компаний очень много — 1343. Поэтому я выложу только ТОП-30 и последние 10 компаний. Вот ведь интересный момент — хабра почему-то показывает Все (1331), хотя моя программа насчитала их 1343 — и, собственно, это правильно. Если вручную их сосчитать — умножить количество страниц 67 на 20 компаний да ещё 3 — получается 1343.

Вот интересно, а почему компании Студия Артемия Лебедева, Adobe, ВКонтакте и Skype деактивировали свой профиль? Вроде как много подписчиков, в ТОП они попали. Блоги остальных компаний из ТОП-30 рабочие.

Разработка

Очень долго я пытался разобраться в Хабрахабр Api. Как выяснилось, он закрыт и пока что в процессе разработки. Однако в переписке с support@habrahabr.ru мне сказали, что они не имеют ничего против парсинга их страниц. Собственно, именно так и работают хабраклиенты для Android (на данный момент).

Когда речь идёт о проектах «для себя», я выбираю любимую Джаву. Она и на этот раз меня не подвела — библиотека JSoup позволила в несколько строчек получить необходимые данные с HTML страницы. Но давайте сперва обсудим, как устроены хабы.

Страницы с хабами расположены по адресам habrahabr.ru/hubs/pageN/, где N — номер от 1 и далее. Посему, если мы хотим получить полный список из всех хабов — нам нужно загружать и анализировать эти страницы, пока они не закончатся. На каждой странице присутствует список из хабов. Формат элемента списка довольно простой и легко анализируется. Выглядит он так:

<div class="hub " id="hub_50">
	<div class="habraindex">1 280,58</div>
	<div class="info">
		<div class="title">
			<a href="http://habrahabr.ru/hub/infosecurity/">Информационная безопасность</a>
			<span class="profiled_hub" title="Профильный хаб"></span>
			
		</div>
			<div class="buttons">
				<input type="button" class="mini blue  subscribeHub" value="Подписаться" data-id="50">
				<input type="button" class="mini hidden unsubscribeHub" value="Подписан" data-id="50" "="">
			</div>
		<div class="clear"></div>
		<div class="stat"><a href="http://habrahabr.ru/hub/infosecurity/subscribers/" class="members_count">91741 подписчик</a>, <a href="http://habrahabr.ru/hub/infosecurity/posts/">3385 постов</a><a></a></div><a>
	</a></div><a>
</a></div>

Давайте напишем метод, который возвращает нам список из всех хабов на сайте:

static List<Hub> getAllHubs() {
        ArrayList<Hub> fullHubsList = new ArrayList<>();
        String urlHubsIncomplete = "http://habrahabr.ru/hubs/page";
        int pageNum = 1;

        do {
            String urlHubs = urlHubsIncomplete + pageNum;

            try {
                Document doc = Jsoup.connect(urlHubs).get();
                Elements hubs = doc.select(".hub");
                if (hubs.size() == 0) {
                    break;
                }
                for (Element hubElem : hubs) {
                    Hub hub = new Hub(hubElem);
                    fullHubsList.add(hub);
                }

                pageNum++;
            } catch (Exception e) {
                e.printStackTrace();
                break;
            }

        } while (true);

        return fullHubsList;
    }

Мы крутим бесконечный цикл while, формируя с каждой итерацией новый URL. Затем, с помощью Jsoup.connect(urlHubs).get() получаем непосредственно HTML-документ со списком хабов и их параметрами. Как несложно заметить — div с информацией о хабе имеет класс hub — и, вызвав doc.select(".hub"), мы получаем список из этих элементов. Если его размер равен нулю — значит мы прошли последнюю страницу и уже проанализировали все хабы — тогда мы выходим из цикла.

Далее — проходим по всем хабам-элементам и для каждого создаём объект типа Hub, передав в конструктор наш org.jsoup.nodes.Element. В нём располагается HTML-код такого же формата, как указан выше. Теперь давайте абстрагируемся от всего. Для этого и существует ООП. Перед нами есть только тот кусочек HTML, представленный выше, и класс, в который его нужно запихнуть. Напишем каркас для нашего класса:

import org.jsoup.nodes.Element;

public class Hub {
    String title;
    int posts;
    boolean profiled;
    int membersCount;
    float habraindex;
    String url;

    public Hub(Element hubElem) {
       
    }
}

Напишем конструктор. Для начала сделаем самое простое — получим данные из заголовочного тега. Для этого мы сначала извлекаем сам div вида

<div class="title">
    <a href="http://habrahabr.ru/hub/infosecurity/">Информационная безопасность</a>
    <span class="profiled_hub" title="Профильный хаб"></span>
</div>

Парсим через

Element titleDiv = hubElem.select(".title").get(0);
Element tagA = titleDiv.getElementsByTag("a").get(0);
title = tagA.text();
url = tagA.attr("href");
profiled = (hubElem.select(".profiled_hub").size() != 0);

Далее, мы хотим пропарсить количество подписчиков и постов — собственно те параметры, по которым мы и будем сортировать. Но сразу же сталкиваемся с первой проблемой — тег содержит строку «91741 подписчик», которую мы не можем просто так взять и преобразовать в Integer — она содержит буквы! Тут нам на помощь приходят регулярные выражения. Быстренько пишем ловкий метод, который получает строку и вырезает из неё всё, кроме цифр, да ещё и преобразует результат в int. D — это НЕ цифра, а + — «встречается 1 или более раз». Т.е. мы в данном случае заменяем буквы на пустоту.

private int getNumbers(String str) {             
    String numbers = str.replaceAll("\D+", ""); 
    return Integer.valueOf(numbers);             
}

Вот теперь мы уже можем со спокойной душой получить наши значения:

String membersCountFullStr = hubElem.select(".members_count").get(0).text();
membersCount = getNumbers(membersCountFullStr);

String statFullStr = hubElem.select(".stat").get(0).getAllElements().get(2).text();
posts = getNumbers(statFullStr);

В принципе, на этом можно было остановится, но я решил ради интереса извлечь всю возможную информацию о хабе. Тут возникла весьма интересная вторая проблема, которая будет изюминкой статьи. Как пропарсить хабраиндекс?

Для начала, следует заменить запятую на точку и убрать лишние пробелы. Но этого не достаточно! Парсер всё равно выдаёт ошибку, если скопировать и вставить хабраиндекс в код — Double.valueOf("–1.11"). А если ввести вручную то же самое число — всё окей. Причём визуально в моей IDEA они абсолютно идентично выглядят!

Оказывается, дизайнеры хабры просто использовали dash вместо minus — c иным кодом символа, и парсер его, понятное дело, не ест. Возьмите на заметку. Суть проблемы в следующем:

System.out.println((int)'-');//45
System.out.println((int)'–');//8211

Когда-то в своей статье Хитрые задачи по Java я рассмотрел подвох, когда L маленькую можно не отличить от 1. Собственно, сейчас я напоролся на аналогичную проблему.

Посему, код для извлечения хабраиндекса будет чуть сложнее:

String rawHabraIndex = hubElem.select(".habraindex").get(0).text();//1 265,92
char minus = 45;//'-'
char dash = 8211;//'–'
String niceHabraIndex = rawHabraIndex.replaceAll(" ", "").replace(",", ".").replace(dash,minus);//1266.72
habraindex = Float.valueOf(niceHabraIndex);

Далее, пишем компаратор по постам как вложенный статический класс для Hub

public static class ComparePosts implements Comparator<Hub> { 
    @Override                                                 
    public int compare(Hub o1, Hub o2) {                      
        return o2.posts - o1.posts;                           
    }                                                         
}                                      

И сортируем по нему где-нибудь в main

List<Hub> hubs = getAllHubs();                 
Collections.sort(hubs, new Hub.ComparePosts());

Всё, задача выполнена! С количеством подписчиков аналогично. Далее я написал код, который выводит в консоль два списка в таком виде, чтобы их сразу можно было вставить в статью — и сделал это вначале.

На получение всех хабов уходит примерно 10 секунд. Исходный код можно скачать здесь. Собираем и запускаем вот так, не забыв установить Jsoup и заменить путь на ваш:

javac -cp .;"C:proglibjsoup-1.7.3.jar" com/kciray/habrahubs/Main.java
java -cp .;"C:proglibjsoup-1.7.3.jar" com.kciray.habrahubs.Main

Автор: kciray

Источник

Поделиться