こんにちは、らくからちゃです。
昨日一昨日と、研修で缶詰にされていました( ´Д`)=3 なんでも、
会社:マネージャーは会社の規定上、上級職じゃないとしてはいけない。
ぼく:そうめう。僕は初級職だからお仕事できないめう。
会社:でも、君は優秀で、小規模案件なので特別に例外ということにする!
ぼく:特別に例外ということにする。
会社:これで君も、お給料は据え置きのままでマネージャーだ!おめでとう!
ぼく:やっためう!責任も残業も増えるめう!
(※弊社には何故か、優秀な社員と小規模な案件が溢れている模様)
会社:一応研修は受けてね。土曜日だけど。
ということで行ってきましたー。
それはさてき、帰りの電車でマイホットエントリーを眺めていて、こんな記事を見つけました。
はてなブログで読者登録数が多いブログってどんな記事なのかなーって気になったのですが、そもそも読者登録者ランキングなるものが存在しない…
確かに。はてなブログって、『読者登録』という仕組みを持っているくせして、それぞれのブログの読者登録数って公表していないんですよね。読者登録数が増えても、あまり読まれている気がしないのですが、やっぱりどんなブログが読者登録数が多いのかって、ちょっと気になりますよね。
こちらの記事では、
ということで、人気のブログをひたすら探し回って、読者登録数ランキングをつくりました。
このランキングは私が探しだすことができたブログしかランクインしていません。もしランキングにもれがあったら教えてくれると有り難いです。
という方法で調べていかれたようですが、もうちょっとシステマティックに出来ないかなーと思い、調べてみました。
集計方法解説
ランキングを集計する方法ですが、大きく分けて
- 対象となるブログを選定する。
- 読者登録数をカウントする。
- 並び替える。
といった作業が必要になるかなあと思います。はてなブログのユーザー数がどの程度いるのか分かりませんが、その一覧全てを取得することは大変困難です。今回の目的は『読者登録数』が多いブログを抽出することなので、『そこそこ人気のある』はてなブログの一覧からターゲットを選定すればよいかなあと思いました。
そこで、参考にしたのがこちら。
どういった基準で選んでいるのかは全く分かりませんが、『人気のエントリー』を定期的にtweetしているそうです。まずはここつぶやかれたtweetをベースに対象を選定することにします。
ただ、全期間のtweetを取得しようとするとapiの制約上色々と面倒くさい事になります。そこで今回は、9月から1ヶ月分くらいに当該twitterで紹介されたブログから、ランキングを抽出してみました。なお、解析は2015年10月18日時点です。
御託はここまでとして、結果を発表してみたいと思います。
( ・`д・´) いっくぞ~。
ランキング結果発表
順位 | ブログ | 投稿者(敬称略) | 読者数 |
---|---|---|---|
1 | はてなブログ開発ブログ | hatenablog | 5421 |
2 | 週刊はてなブログ | hatenablog | 3779 |
3 | それは恋とか愛とかの類ではなくて | moarh | 3309 |
4 | 暇な女子大生が馬鹿なことをやってみるブログ | aku_soshiki | 2292 |
5 | Everything you've ever Dreamed | Delete_All | 2133 |
6 | 脱社畜ブログ | dennou_kurage | 1997 |
7 | ARuFaの日記 | Arufa | 1980 |
8 | いばや通信 | ibaya | 1822 |
9 | はなこのブログ。 | hana5521 | 1447 |
10 | ぐるりみち。 | ornith | 1405 |
11 | 今日、なに食べよう?〜有機野菜の畑から~ | homare-temujin | 1331 |
12 | Green★Pharmacy | hikaru233391 | 1278 |
13 | スズコ、考える。 | suminotiger | 1269 |
14 | さっきもUたやん | horahareta13 | 1250 |
15 | 僭越ながら【1テーマの本を30冊読んで勉強するブログ】 | sclo-a | 1247 |
16 | 外資系OLのぐだぐだ | toianna | 1208 |
17 | 鈴木です。 | suzukidesu23 | 1148 |
18 | 斗比主閲子の姑日記 | topisyu | 1144 |
19 | クレジットカードの読みもの | cardmics | 1137 |
20 | しっきーのブログ | skky17 | 1133 |
21 | 妖怪男ウォッチ | papuriko | 1125 |
22 | 太陽がまぶしかったから | bulldra | 1120 |
23 | コスパ最強!!一人暮らしの簡単節約料理レシピ | kakashibennett | 1096 |
24 | 世界の中心はここだ | atnnnas | 1060 |
25 | おうつしかえ | banban | 1006 |
26 | インターネットの備忘録 | hase0831 | 1003 |
27 | いつか電池がきれるまで | fujipon | 1002 |
28 | 読書で本から学ぶブログ【書評・感想】 | dokushohon | 982 |
29 | ゆとりずむ | lacucaracha | 953 |
30 | かくいう私も青二才でね | TM2501 | 937 |
31 | phaの日記 | pha | 930 |
32 | 田舎で底辺暮らし | pokonan | 910 |
33 | 自省log | juverk | 906 |
34 | ゆるふわいずむ | yuki3mori | 895 |
35 | 楽に生きる方法 | megumakou2014 | 892 |
36 | めざせ 野菜1日350g! ちまこ通信 | chimako-tsushin | 882 |
37 | ←ズイショ→ | zuiji_zuisho | 847 |
38 | 攻めは飛車角銀桂守りは金銀三枚 | lightgauge | 840 |
39 | むすメモ! | tukatukasa | 826 |
40 | クソログ | lets0720 | 810 |
41 | モテ貯金 | horitsukiko | 794 |
42 | ナナオクプリーズ | nanaoku | 787 |
43 | ハッピーエンドを前提として | ui0723 | 776 |
44 | 今日はヒトデ祭りだぞ! | hitode99 | 768 |
45 | あざなえるなわのごとし | paradisecircus69 | 764 |
46 | 散るろぐ | cild | 743 |
47 | じゃじゃ嫁日記 | rise_more | 733 |
48 | マネー報道 MoneyReport | MoneyReport | 733 |
49 | ネットの海の渚にて | dobonkai | 717 |
50 | 田舎暮らしおひとりさまの日々 | hozumi3081 | 716 |
51 | 自分の仕事は、自分でつくる | igooke | 714 |
52 | hitode909の日記 | hitode909 | 686 |
53 | 心がよろけそうなときに読むポンコツ日記 | ponkotukko | 682 |
54 | 手の中で膨らむ | akikomainichi | 665 |
55 | Hagex-day info | hagex | 659 |
56 | コミックエッセイ-モノクロ家計簿 | ohg0524 | 652 |
57 | オレシピ - 俺のレシピはお前のレシピ- | log134 | 642 |
58 | ビジョンミッション成長ブログ | kobabiz | 623 |
59 | orangestarの雑記 | orangestar | 609 |
60 | 人生かっぽ —佐藤大地ブログ | daichi6388 | 603 |
61 | paiza開発日誌 | paiza | 596 |
62 | mizchi's blog | mizchi | 593 |
63 | レールを外れてもまだ生きる - ベンチャーOLブログ | colopon | 592 |
64 | pal-9999のサッカーレポート | pal-9999 | 589 |
65 | トウフ系 | kaishaku01 | 584 |
66 | 歴ログ -世界史専門ブログ- | titioya | 570 |
67 | サラリーマン休日副業で月10万円以上目指すページ | linuxdiary | 565 |
68 | いつか朝日が昇るまで | gerge0725 | 563 |
69 | ひかる人財プロジェクト | hikarujinzai | 558 |
70 | ボンダイ | gudachan | 551 |
71 | うちの子流~発達障害と生きる | nanaio | 550 |
72 | 魔法使いのシンプルライフ | erisalife | 549 |
73 | 山猫日記 | LMIURA | 538 |
74 | カリントボンボン | neji-ko | 532 |
75 | 日日平安part2 | tomii23 | 527 |
76 | 脱貧困ブログ | kentaroupeace | 527 |
77 | メディアの輪郭 | kana-boon | 524 |
78 | give IT a try | JunichiIto | 521 |
79 | うさもふ | dougacc | 516 |
80 | 人生いつも三日ボーズ | ysk_wtnb | 486 |
81 | poco blog | glasstruct | 485 |
82 | 銀座で働くデータサイエンティストのブログ | TJO | 485 |
83 | 家計とお買いモノと。 | mocaca | 458 |
84 | こみねもすなるだいありー | ashiyakomine | 456 |
85 | 月曜9時のparty people | jetstarmine | 454 |
86 | 小娘のつれづれ | drifter_2181 | 451 |
87 | c71の一日 | c71 | 441 |
88 | $shibayu36->blog; | shiba_yu36 | 440 |
89 | A1理論はミニマリスト | A1riron | 439 |
90 | Sakak's Gadget Blog | keisuke9498 | 433 |
91 | ミニマリストと呼ばれたい | haru501227 | 425 |
92 | 心に火を、指先にペンを | defender_21 | 425 |
93 | ✘╹◡╹✘ | r7kamura | 424 |
94 | malzack blog | mlzk | 421 |
95 | はてなブックマーク開発ブログ | hatenabookmark | 415 |
96 | プロジェクトマネジメントの話とか | wiz7 | 414 |
97 | I AM A DOG | OKP | 404 |
98 | さよなら自分 | f-aso | 394 |
99 | 備後「あこう浪士」 釣り場の周辺 | akouroushix | 393 |
100 | niko life... | niko_97 | 383 |
結果についての分析
だいたい見ていると、900を超えたあたりから一気に間隔が詰まってきている気がしますね。あと、『はてな』といえば、ITエンジニアなイメージだったのですが、並べてみると読者登録だけでみると、主婦やOLの方も多い気がしますね。
また、ホットエントリーなどでは全く見かけないブログも多数あり、はてなの世界の中でも、はてなブックマークを普段利用する層とそうでない層とでどうも生息圏が分かれているのかなあなんて思う結果です。
実際、読者登録が増えたからといって、ほいほいホットエントリーに入るのか?といわれると、体感的にはちょっと違うかなと思っています。新着や人気までは入りやすいのですが、ホットエントリーに入るためには、ある程度の記事の品質は必要なのかなあというような気がしています。
解析用ソースコード
さて、今回の集計は、エクセル方眼紙と日々戦う28歳会社員、なんちゃって応用技術者が3時間ちょいくらいで書いたコードを元に出力された結果となります。
『動けばいいや』の崇高な精神のもと作ったものですので、とてもお見せ出来るようなものではないのですが、個人的な備忘録も兼ねてはっつけておきます。読者登録だけだと、古くからのユーザーが優位になりますので、登録されている読者がアクティブかどうか(直近3日以内にブクマor2週間以内に記事投稿など)も判断して集計したかったのですが、それはまた後日ということで。
package hatenablogsubscribercount;
import twitter4j.*;
import org.jsoup.*;
import java.util.*;
import java.net.*;
import java.io.*;
import java.sql.*;
public class HatenaBlogSubscriberCount {
public static void main(String[] args) {
Twitter twitter = new TwitterFactory().getInstance(); //認証なしで接続
try {
//DB宣言部
java.sql.Connection conn = null;
String dbUrl = "jdbc:derby://localhost:1527/";
String dbName = "HatenaBlogSubscriberCount";
String driver = "org.apache.derby.jdbc.ClientDriver";
String userName = "hbsc";
String password = "hbsc";
Class.forName(driver).newInstance();
conn = DriverManager.getConnection(dbUrl + dbName, userName, password);
conn.setAutoCommit(false);
PreparedStatement stmt = null;
String blogurl = "";
stmt = conn.prepareStatement("delete from BLOG_TWEETED");
stmt.executeUpdate();
//ひとまずTLを取得
Map<String, RateLimitStatus> ratelimitA = twitter.getRateLimitStatus("block", "statuses");
RateLimitStatus ratelimit = ratelimitA.get("/statuses/user_timeline");
System.out.println(ratelimit);
for (int i = 1; i < ratelimit.getRemaining()-1; i++) {
ResponseList statuses = twitter.getUserTimeline("hatenablog", new Paging(i, 200));
for (Status status : statuses) {
for (URLEntity urlentity : status.getURLEntities()) {
URL url = new URL(urlentity.getExpandedURL());
java.sql.Time time = new java.sql.Time(status.getCreatedAt().getTime());
java.sql.Date date = new java.sql.Date(status.getCreatedAt().getDate());
stmt = conn.prepareStatement("insert into BLOG_TWEETED(POSTURL,POSTHOST,TWEETTIME,TWEETDATE) values(?,?,?,?) ");
stmt.setString(1, url.toString());
stmt.setString(2, url.getHost());
stmt.setTime(3, time);
stmt.setDate(4, date);
stmt.executeUpdate();
}
System.out.println(status.getText());
}
}
//結果からSumallyの対象を集計
stmt = conn.prepareStatement("delete from BLOG_SUMALLY");
stmt.executeUpdate();
stmt = conn.prepareStatement("select POSTHOST from BLOG_TWEETED group by POSTHOST");
ResultSet rs = stmt.executeQuery();
rs.next();
//ひたすらデータを集計して突っ込む
while (rs.next()) {
blogurl = "http://" + rs.getString("POSTHOST");
org.jsoup.nodes.Document document;
try {
document = Jsoup.connect(blogurl).get();
String title = document.getElementsByTag("title").text();
document = Jsoup.connect(blogurl + "/about").get();
String subscriber = document.select("span.about-subscription-count").text().replaceAll(" 人", "");
String bloguser = document.select("html").attr("data-author");
/* for(org.jsoup.nodes.Element subscriber : document.select("div.info").select("a")){
System.out.println(subscriber.attr("href"));
}*/
System.out.println("title:" + title + " bloguser:" + bloguser + " subscriber:" + subscriber);
stmt = conn.prepareStatement("insert into BLOG_SUMALLY(BLOGURL,BLOGTITLE,BLOGUSER,SUBSCRIBER) values(?,?,?,?) ");
stmt.setString(1, rs.getString("POSTHOST"));
stmt.setString(2, title);
stmt.setString(3, bloguser);
stmt.setInt(4, parseInt(subscriber,0));
stmt.executeUpdate();
} catch (Exception e) {
}
}
conn.commit();
conn.close();
} catch (Exception e) {
System.err.println(e.getMessage());
e.printStackTrace();
}
}
public static int parseInt(String value, int defaultValue) {
try {
// intに変換して返す
return Integer.parseInt(value);
} catch (NumberFormatException e) {
// デフォルト値を返す
return defaultValue;
}
}
}
ではでは、今日はこの辺で