Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
16
Help us understand the problem. What is going on with this article?

More than 5 years have passed since last update.

@n0bisuke

Nightmare.jsでQiitaのコントリビューション数をスクレイピング

岩手県立大学アドベントカレンダー3日目です。 @otukutun が書いてくれてないのでサクッと。

Nightmareがv2(Electronベース)になり、使いやすく感動したのでLIGブログのPV/UUデータ取得を自動化してみた。に書いたんですけど、Nightmareでスクレイピングするのが楽しくなっています。

Qiitaのアカウントのコントリビューション数を取りたい。

QiitaのAPIにユーザーのcontributionを取るAPIってなさそう...?
https://qiita.com/api/v2/docs#ユーザ

そんな気がしたのでスクレイピングしてみました。

Nightmareでスクレイピングしてみよう。

ES6(2015)ですがNode.jsではimport文がまだ実装されてないみたいなのでrequire部分だけ気持ち悪いかもです。



こんな感じでDevToolで確認すると.userPage_contributionCountというセレクタの中身が目当ての数字みたいですね。

qiita.js
'use strict'

const Nightmare = require('nightmare');
const vo = require('vo');
const URL = 'http://qiita.com/'+process.argv[2];
const MY_SELECTOR = '.userPage_contributionCount';

//Qiitaの情報取得
function getInfo(nightmare){
  return nightmare
    .goto(URL)
    .wait(MY_SELECTOR)
    .evaluate((selector) => {
      return document.querySelector(selector).innerText;
    }, MY_SELECTOR);
}

//メインのフロー
vo(function* () {
  let nightmare = Nightmare({ show: true });
  let contribution = yield getInfo(nightmare); //qiitaのコントリビューション数
  yield nightmare.end();
  return contribution;
})((err, result) => {
  if (err) return console.log(err);
  console.log(result);
});

コントリビューション数を調べたいユーザー名を実行時の引数にすればOKです。

$ node qiita.js n0bisuke
2779

めちゃ簡単...!

node-cronとか使って定期実行させつつストック数遷移とかグラフ化したら面白そうですよね。
メンバーのコントリビューション数も取ってランキングとか作れそうですね笑

色々と楽しいことできそうです。

4日目は@otukutunのハズ...!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
16
Help us understand the problem. What is going on with this article?