Skip to content

QiitaOrganizationからスクレイピングする箇所の修正#61

Merged
yasulab merged 12 commits intomasterfrom
fix_qiita.rb
Dec 31, 2018
Merged

QiitaOrganizationからスクレイピングする箇所の修正#61
yasulab merged 12 commits intomasterfrom
fix_qiita.rb

Conversation

@AnaTofuZ
Copy link
Contributor

@AnaTofuZ AnaTofuZ commented Dec 15, 2018

背景

#59

うーん、何が原因かまだわかってないですが、Qiita の投稿数・いいね数が取得できなくなっているみたい 👀 💦

cf. https://yasslab.jp/ja

原因に関して

以前のwebページリニューアルの際にQiitaOrganizationからデータを持ってくる方法はJekyll側でスクレイピングをするという手段だった.

cf. #8

このPR時にはQiitaのページが変わることが無いという前提の元だったが,最近のリニューアルで大幅に構成が変わり,正常にスクレイピングが出来てなかった.

cf. https://blog.qiita.com/improve-organization-pages/

やること

  • スクレイピングするCSSセレクタを修正する

  • テストで利用しているモックのhtmlを現在のQiitaの仕様に修正する

  • テストを修正する

  • (取得できない場合の挙動を実装する) ( 実施するならテストを書く)

  • コメントアウトしている CI の spec/qiita.rb を解除する

  • テストの設計

  • テストで使用しているmockの中の定数を動的に使用出来るようにする

Fix #59
QiitaOrganizationのYassLabのページから投稿数といいねをスクレイピングして
いたが,この部分のQiita側の構成が異なっていた.

そのためQiitaの現在のページに合わせたCSSセレクタを取得するように修正した
QiitaへのURLを使いまわしているので定数化した
@AnaTofuZ
Copy link
Contributor Author

ローカルから無事取得できている事を確認した

screen shot 2018-12-15 at 17 48 05

@AnaTofuZ
Copy link
Contributor Author

現在のコードだと「 dl.op-CounterItem:nth-child(1) > dd:nth-child(2) などの要素が無かった場合jekyllがエラーを吐いて起動出来ない」 という問題があることが解ったので,一行で書くのではなくて落ち着いてifで判定させるように修正します

@AnaTofuZ
Copy link
Contributor Author

あ,しかしそもそも取得できない時はQiita側に何らかの問題が発生している(もしくは何かしらのCSSの変更があり,スクレイピング部分を修正する必要がある)ので,rescueで例外として扱って上げたほうが適切かもしれない...

@yasulab
Copy link
Member

yasulab commented Dec 15, 2018

お!早速の対応ありがとうございます! 😆

まずは Hotfix をリリースしないと、この修正をしている間も Web サイト https://yasslab.jp/ja ではエラーが表示され続けてしまうので、当該コミットを git cherry-pick して master にマージしておきますね ;) 🚀 ✨

d6de07f...8110f95

@yasulab
Copy link
Member

yasulab commented Dec 15, 2018

上記の Hotfix リリースに合わせて、次のコミットで spec を一旦コメントアウトしたので、この PR で作業が終わったらコメントアウトを解除してもらえれば ;) (僕の方で Description に書き足しておきました! ✅ )

06a34ba

@yasulab yasulab changed the title [WIP]QiitaOrganizationからスクレイピングする箇所の修正 [WIP] QiitaOrganizationからスクレイピングする箇所の修正 Dec 15, 2018
@yasulab
Copy link
Member

yasulab commented Dec 15, 2018

Hotfix release done...!! 🚀✨✅
https://yasslab.jp/ja

image

@AnaTofuZ
Copy link
Contributor Author

AnaTofuZ commented Dec 15, 2018

@yasulab おっデプロイとspec側の処理ありがとうございます!! 🙏

@yasulab
Copy link
Member

yasulab commented Dec 15, 2018

d( ̄  ̄)✨

@AnaTofuZ
Copy link
Contributor Author

メソッドチェーンでシンプルに実装していたが,qiita側のエラーで値が帰ってこない場合に死ぬという事が解ったので,一旦変数にキャッシュした.
この場合正常に値を取得できている場合に実行可能なメソッドの有無で判定出来るので,アクセスできなかった場合に0を返す様に実装した.

次に問題になってくるのはQiita側が404で落ちた場合,jekyllが起動時に例外を吐いて死ぬ為,この場合も中でよしなにcatchし0を返す設計に変更する

@yasulab
Copy link
Member

yasulab commented Dec 29, 2018

メソッドチェーンでシンプルに実装していたが,qiita側のエラーで値が帰ってこない場合に死ぬという事が解ったので,一旦変数にキャッシュした.
この場合正常に値を取得できている場合に実行可能なメソッドの有無で判定出来るので,アクセスできなかった場合に0を返す様に実装した.

😎🆒✨

実装が完了したら @yasulab + @nalabjp さんにレビュー依頼してもらえればその時にチェックしますね! 😆

@AnaTofuZ
Copy link
Contributor Author

Jekyll側でエラーハンドリング出来るかな...と思い調べていたが見つけきれなかったので,純粋にrubyのエラーハンドリング方法に乗っていくのが良さそう

@AnaTofuZ
Copy link
Contributor Author

AnaTofuZ commented Dec 29, 2018

rubyの例外処理ではrescueを使うとあったのでとりあえず,mechanize関連で例外が発生した際に
先のコミット (6e9052d) で追加した分岐で0を代入出来るように,変数 element の値を0に変更する様な例外処理を導入した

試しにアクセスするURLを ...yasslabtest の様な存在しないURLに変更した場合,jekyllが落ちることなく起動し,次の様な0が入った画面になった.

screen shot 2018-12-29 at 14 53 34

現在のQiitaから情報を取得するrspecはモックを利用しているが,このhtmlの内
容を現在のQiitaの物に修正した.
また値がなかった場合のエラーモックは,Qiitaの投稿数とイイネの数の要素を
消去したhtmlを用意した
Qiitaから情報を取得する箇所のテストでは,htmlに書かれている数をマッチす
るか確認しているが,この確認する数を現在のモックに合わせて修正した
今まで変数でやり取りしていたので定数化した
cf. #61 (comment)
テストの実装まで終わったので戻した
@AnaTofuZ AnaTofuZ changed the title [WIP] QiitaOrganizationからスクレイピングする箇所の修正 QiitaOrganizationからスクレイピングする箇所の修正 Dec 29, 2018
@AnaTofuZ AnaTofuZ requested a review from yasulab December 29, 2018 07:06
@AnaTofuZ
Copy link
Contributor Author

当初の予定のテスト及び,Qiita側で障害が発生し値が取れなかった場合にとりあえず0を挿入し, yasslab.jp側を落とさない設計で実装し直してみました.お手すきの時にレビューお願いします 🙏 @yasulab

レビュー後の動きとしてはsquashして1 commitに纏めようと思っています!

@yasulab
Copy link
Member

yasulab commented Dec 29, 2018

Qiita側で障害が発生し値が取れなかった場合にとりあえず0を挿入

@AnaTofuZ 値が取れなかった場合のデフォルト値についてですが、「0」ではなくて現時点での最新値にするのはどうでしょう? 🤔 「0」と表示されると明らかに異常な値だとエンドユーザー(訪問者)も気づきますが、こうすれば何らかの理由で取得できかった場合も、エンドユーザー側にある程度の情報(最新の値ではないかもしれないけど会社の規模感としては正しい情報)を伝えられるのではないかなと思いました 💭

取得できなかった場合のデフォルト値

  • 投稿数: 191
  • いいね: 6929

image

if element.respond_to? :children
@items = element.children.text.strip.to_i
else
@items = 0
Copy link
Member

@yasulab yasulab Dec 30, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@items の行の 0 と、下にある @likes の行の 0 をいじればいいだけかな🤔💭 僕の方でコミット積んでマージしちゃうのが早そう ;)

@AnaTofuZ
Copy link
Contributor Author

@yasulab レビューありがとうございます! (今確認しました 🙏 )
確かに0ではなくて現在の値を表示した方がユーザー体験的にも良さそうですね! ありがとうございます

テストの方も治す必要があるので作業します!

@yasulab
Copy link
Member

yasulab commented Dec 30, 2018

あ、ちょうどさっきコミットしちゃった...!! 😅

  • 863f1f7 Add QIITA_PRESET_[ITEMS|LIKES] constants for Qiita stats

僕の方はこれでOKかなと思うので、 @AnaTofuZ さんの方でやり残した作業などなければマージしちゃおうかなと思います ;)

@yasulab
Copy link
Member

yasulab commented Dec 30, 2018

あ、spec も直さないとかな 🤔💭 できれば spec の定数も _plugin/qiita.rb の定数を使いまわしたいところ。

@AnaTofuZ
Copy link
Contributor Author

ありがとうございます:pray: 僕は定数使ってなかったので参考になります!

テスト側の修正を行ってなかったので, 一旦テスト側を少し修正してまたレビューをお願いしようと思います.

@AnaTofuZ
Copy link
Contributor Author

specの定数を使いまわしたいので,今使っているmockのhtmlの中にerbあたりの形式で定数を動的に埋め込んでテストする方向が良さそう..? 🤔

FAILED_MOCK_PATH = 'spec/error_mock.html'.freeze

RSpec.describe 'Qiita' do
require './_plugins/qiita.rb'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

なるほどここで require しているということは _plugins/qiita.rb で宣言している次の定数も使いまわせそう 👀

require 'mechanize'
module Jekyll
  QIITA_ORGANIZATION_URL = 'https://qiita.com/organizations/yasslab'
  QIITA_PRESET_ITEMS     = 192
  QIITA_PRESET_LIKES     = 6941
  ...

@yasulab
Copy link
Member

yasulab commented Dec 30, 2018

テスト側の修正を行ってなかったので, 一旦テスト側を少し修正してまたレビューをお願いしようと思います.

了解です! 😆👌 Preset などの値はコードの途中にあると見落としたり忘れたりしやすいので、僕が書くときはいつも冒頭に (より具体的にはファイルを開いたときにすぐに気付きやすい位置に) 書くことが多いですね 👀 💭

@AnaTofuZ AnaTofuZ changed the title QiitaOrganizationからスクレイピングする箇所の修正 [WIP]QiitaOrganizationからスクレイピングする箇所の修正 Dec 30, 2018
@yasulab
Copy link
Member

yasulab commented Dec 30, 2018

確かに0ではなくて現在の値を表示した方がユーザー体験的にも良さそうですね!

ですね ;) せっかくなので JS 側の方でも同じような修正を入れておこうと思います 🔧 💨 (が、この PR とはコンテキストが異なるので別 branch でやっちゃいますね)

@yasulab
Copy link
Member

yasulab commented Dec 30, 2018

JS 側の対応 Done ✅

  • 09860a7 Add GitHub preset numbers to improve UX

@yasulab
Copy link
Member

yasulab commented Dec 31, 2018

良さそうな雰囲気を感じる ;) 🙆 💖
作業が完了したらまたメンションしてもらえれば! 😆✨

@AnaTofuZ AnaTofuZ changed the title [WIP]QiitaOrganizationからスクレイピングする箇所の修正 QiitaOrganizationからスクレイピングする箇所の修正 Dec 31, 2018
@AnaTofuZ
Copy link
Contributor Author

mockの要素を動的に変更しようかな〜などと思っていましたが,よくよく考えればHTMLから値が抜き出せている事が確認できれば問題ないので,一旦これで完了かなと思いました.
@yasulab お手すきの時にレビューをお願いします:pray:

@yasulab
Copy link
Member

yasulab commented Dec 31, 2018

良さそう! 😆👌✨ 一旦マージして、もし後日何か改善点を見つけたら僕の方で対応しておきますね ;) 🔧💨

PR Thx...!! && 良いお年を〜 🎉 💖

@yasulab yasulab merged commit f0e1222 into master Dec 31, 2018
@yasulab yasulab deleted the fix_qiita.rb branch December 31, 2018 03:22
@AnaTofuZ
Copy link
Contributor Author

ありがとうございます:pray: yasulabさんも良いお年を~。(๑•̀ㅂ•́)و✧

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants