Node.jsで一番になれるか検証


あけましておめでとうございます。今年もよろしくお願いします。

ということで2018年一発目の記事です。

先日忘年会で知人から「Node.jsの記事を調べるとn0bisukeさんの記事がよく出てきます」と言われ、話の流れで **もしかしたらNode.js関連で一番記事書いてるのは僕かもしれない**という話になりました。

Node.js界隈では@yosuke_furukawa会長をはじめとした強い人たちがいるので、僕が一番とは言うのはおこがましい状況です。ですがせめて **記事数だけでも一番だと嬉しい**なと思い調べてみました。

あと、[Qiitaのあれこれをひたすら分析してランキング](https://qiita.com/t_nakayama0714/items/07ce8bf3501268f96fe3)でいいね数ランキングなどを分析していて面白いなと思ったのもモチベーションの一つです。

## やることとお断り

* やること

 「 **QiitaのNode.jsタグでの記事投稿を誰が一番書いているかを`Node.jsで`調べる**」ことです。
 
* お断り
 
いわゆるエゴサーチです。実際のところ、Node.jsで記事調べるならいいね数などでContributionが多いユーザーや記事を参考にするのが良いと思います。また、僕も含めてQiita以外で書いてるものに関しては計上していませんので実データとは言い難いです。

また、データは2018年1月2日時点のものになります。

## 調べ方

Qiitaのタグで検索して、`https://qiita.com/tags/Node.js/items?page=1`のURLからスクレイピングしてきます。Qiitaの仕様が変わったら同じコードでは動かないかもしれませんがあしからず。

![](https://i.gyazo.com/c8114f1eeda67f392960dc47cd41a58a.png)

page=2,page=3...と順番に取得していき、Authorのユーザー名がいくつヒットするかでランキングしてみます。

ちなみに、配列の計算するときに[count-array-values](https://www.npmjs.com/package/count-array-values)が便利でした。

Node.jsのバージョンは9.3.0です。

```bash
mkdir qiita-node
cd qiita-node
npm init -y
touch app.js
```

```bash
npm i --save count-array-values axios
```

```app.js
'use strcit';

const axios = require('axios');
const tag = process.env.TAG || 'Node.js';
const BASE_URL = `https://qiita.com/tags/${tag}/items?page=`;
const count = require('count-array-values');

let data = [];

const getAuthorList = async (pageid) =>{
    try {
        const res = await axios.get(BASE_URL+pageid);
        const html = res.data;
        const parts = html.match(/"url_name":"(.*?)"/g);
        
        for(let i = 0,len = parts.length; i < len; i++){
            const name = parts[i].match(/"url_name":"(.*?)"/)[1];
            data.push(name);
        }

        console.log(`${pageid} page done`);
        getAuthorList(++pageid);
   } catch (error) {
       console.log('All done');
       console.log(count(data));
   }
}

getAuthorList(1);
```

pageidが1(1ページ目)の状態のリストを取得して配列追加したら、pageidをインクリメントして次のページを取得します。これを繰り返してエラーになったらページの最後まで取得できたとして結果を計算して出力します。

`try...catch`で最後のページを超えるとcatchに入って終了する再帰関数にしています。

## Nefryタグを調べてみる

Node.jsタグだと少し時間かかったので、まず試しに[Nefryタグ](https://qiita.com/tags/nefry)で検索してみます。

```
$ TAG=Nefry node app.js

1 page done
2 page done
All done
[ { value: 'wamisnet', count: 20 },
  { value: 'n0bisuke', count: 6 },
  { value: 'HiroyukiYasui', count: 2 },
  { value: 'BlueTone', count: 2 },
  { value: 'minwinmin', count: 2 },
  { value: '5_21maimai', count: 1 },
  { value: 'tokutoku393', count: 1 },
  { value: 'ukk0', count: 1 },
  { value: 'mascii', count: 1 },
  { value: 'ShirataHikaru', count: 1 },
  { value: 'mogya', count: 1 },
  { value: 'koyomi_minaduki', count: 1 } ]
```

@wamisnetさんが20記事
@n0bisukeは6記事で2位でした。

| 順位 | ユーザー名 | 記事数 |
|:-----------:|:------------|:------------:|
| 1      | @wamisnet        | 20         |
| 2     | @n0bisuke      | 6       |
| 3       |   @HiroyukiYasui      | 2         |
| 3         |   @BlueTone        | 2           |
| 3       | @minwinmin       | 2       |

ランキングがうまく取れたので同じ要領でNode.jsもいってみます。

## Node.jsタグ

緊張の瞬間ですね（謎）

```
$ node app.js

1 page done
2 page done
・
・
・
259 page done
260 page done
All done
[ { value: 'n0bisuke', count: 164 },
  { value: 'masato', count: 58 },
  { value: 'mysticatea', count: 52 },
  { value: 'kjunichi', count: 45 },
  { value: 'akameco', count: 36 },
  { value: 'you21979@github', count: 26 },
  { value: 'toshirot', count: 26 },
  { value: '_takwat', count: 23 },
  { value: 'ms2sato', count: 23 },
  { value: '59naga', count: 22 },
  { value: 'sasaplus1', count: 22 },
・
・
・
  ... 2181 more items ]
```


| 順位 | ユーザー名 | 記事数 |
|:-----------:|:------------|:------------:|
| 1      | @n0bisuke        | 164         |
| 2     | @masato      | 58       |
| 3       |  @mysticatea       | 52         |
| 4         |   @kjunichi        | 45           |
| 5       | @akameco       | 36       |
| 6      | @you21979@github        | 26         |
| 6     | @toshirot      | 26       |
| 8       |  @_takwat       | 23         |
| 8         |  @ms2sato        | 23           |
| 10       | @59naga       | 22       |
| 10       | @sasaplus1       | 22       |


ということで見事僕がNode.jsの記事数ではトップでした！（自演乙とか言われそうですが）

## 所感

なんとなく記事数だけでは1位な気がしましたが、予想以上に2位の人との差があったなぁという感想です。

同じ感じで他のタグでも調べられるので他のタグランキングを作ってみたい人の参考になれば幸いです。

ランキング付けることで、活発に記事発信が行われるようになるきっかけになると嬉しいですね。

みんなでNode.jsタグ盛り上げていきましょう〜

それでは！