1日10行コーディング 〜スクレイピング実装編〜

# 概要

昨日に引き続き今日も10行コードを書いていこうと思います。

## 2日目
### 【テーマ】
スクレイピング

### 言語
* ruby

### 目標成果物
昨日完成できなかった、スクレイピングの本体部分を完成させたいと思います。

### コードと資料

#### 1. bundle installの再実行
昨日詰まったbundle installですがxcodeを再インストールしたところ問題なく動きました笑

```
$ bundle install --path .bundle

Fetching gem metadata from https://rubygems.org/.................
Resolving dependencies...
Using bundler 1.17.2
Using mini_portile2 2.4.0
Fetching nokogiri 1.10.9
Installing nokogiri 1.10.9 with native extensions
Bundle complete! 1 Gemfile dependency, 3 gems now installed.
Bundled gems are installed into `./.bundle`
```

#### 2. Nokogiriを使ったパース
では、Nokogiriを使ったパース部分の処理を書いていこうと思います。
今回は、とりあえずアニメのタイトルが見れればいいのでタイトル抽出を行います。

nokogiriを使いたいのでファイルの上の方に

```ruby
require 'nokogiri'
```
こちらを記載します。

そして、前回の続きに

```ruby

# 受け取ったHTMLをパースする
doc = Nokogiri::HTML.parse(response.body, nil, nil)

# パースされた情報から必要な情報を抽出
doc.css(".l-searchPageRanking_unit_title").each{|div|
    puts div.text.split("\n")[2].gsub("              ","")
}
```
このような形で受け取ったHTMLをパースする処理を書きます。

#### 3. いざ実行
rubyの実行は下記のコマンドで可能です。

```
bundle exec ruby crawler.rb
```
すると

```
かぐや様は告らせたい？～天才たちの恋愛頭脳戦～（TVアニメ動画）
邪神ちゃんドロップキック’（ダッシュ）（TVアニメ動画）
BNA ビー・エヌ・エー（TVアニメ動画）
かくしごと（TVアニメ動画）
乙女ゲームの破滅フラグしかない悪役令嬢に転生してしまった…（TVアニメ動画）
波よ聞いてくれ（TVアニメ動画）
イエスタデイをうたって（TVアニメ動画）
フルーツバスケット 2nd season（TVアニメ動画）
天晴爛漫！（TVアニメ動画）
プリンセスコネクト！Re：Dive（TVアニメ動画）
メジャーセカンド第2シリーズ（TVアニメ動画）
本好きの下剋上～司書になるためには手段を選んでいられません～第二部（TVアニメ動画）
放課後ていぼう日誌（TVアニメ動画）
キングダム第3シリーズ（TVアニメ動画）
グレイプニル（TVアニメ動画）
困ったじいさん（TVアニメ動画）
やはり俺の青春ラブコメはまちがっている。完（TVアニメ動画）
食戟のソーマ 豪ノ皿（TVアニメ動画）
アルテ（TVアニメ動画）
富豪刑事 Balance：UNLIMITED（TVアニメ動画）
デジモンアドベンチャー：（TVアニメ動画）
Re：ゼロから始める異世界生活(第2期)（TVアニメ動画）
LISTENERS（TVアニメ動画）
ハクション大魔王2020（TVアニメ動画）
継つぐもも（TVアニメ動画）
```

このような形で一覧が表示されると思います。
正直splitとかgsubの場所はもう少しちゃんとかけそうな気もしますが...いったんこれでよしとします笑

ただ、ここで１つ問題があります、今回追加したコードの行数を確認したところコメント入れても9行でした....ということで、ここに評価数などの数値も取得するように手を加えたいと思います。

#### 4. 評価とコメント数も取得
先ほどのパース処理に少し手を加えて、評価とコメントの数も表示できるようにしましょう。
```ruby
# パースされた情報から必要な情報を抽出
doc.css(".l-searchPageRanking_unit").each{|div|
    puts "タイトル:" + div.css(".l-searchPageRanking_unit_title")[0].text.split("\n")[2].gsub("              ","")
    puts "評価:" + div.css(".l-searchPageRanking_unit_mainBlock_starPoint strong")[0].text
    puts "コメント数:" + div.css(".l-searchPageRanking_unit_mainBlock_starPoint span")[0].text + "\n\n"
}
```
軽く説明すると、前のコードでは見出しについてのみ繰り返しをしていたのですが、評価とかも欲しいとなるとそうではなくアニメの情報を括っているタグを指定してループする必要があるので上記のようにeachの前をいじっています。

#### 5. 再び実行
下記のコマンドで実行

```sh

bundle exec ruby crawler.rb
```
すると

```
タイトル:かぐや様は告らせたい？～天才たちの恋愛頭脳戦～（TVアニメ動画）
評価:3.8
コメント数:120

タイトル:邪神ちゃんドロップキック’（ダッシュ）（TVアニメ動画）
評価:3.9
コメント数:54

タイトル:BNA ビー・エヌ・エー（TVアニメ動画）
評価:3.7
コメント数:88

タイトル:かくしごと（TVアニメ動画）
評価:3.6
コメント数:105

タイトル:乙女ゲームの破滅フラグしかない悪役令嬢に転生してしまった…（TVアニメ動画）
評価:3.6
コメント数:114

タイトル:波よ聞いてくれ（TVアニメ動画）
評価:3.6
コメント数:77

タイトル:イエスタデイをうたって（TVアニメ動画）
評価:3.8
コメント数:115

タイトル:フルーツバスケット 2nd season（TVアニメ動画）
評価:3.5
コメント数:23

タイトル:天晴爛漫！（TVアニメ動画）
評価:3.4
コメント数:46

タイトル:プリンセスコネクト！Re：Dive（TVアニメ動画）
評価:3.5
コメント数:55

タイトル:メジャーセカンド第2シリーズ（TVアニメ動画）
評価:3.5
コメント数:15

タイトル:本好きの下剋上～司書になるためには手段を選んでいられません～第二部（TVアニメ動画）
評価:3.3
コメント数:41

タイトル:放課後ていぼう日誌（TVアニメ動画）
評価:3.4
コメント数:53

タイトル:キングダム第3シリーズ（TVアニメ動画）
評価:3.4
コメント数:20

タイトル:グレイプニル（TVアニメ動画）
評価:3.5
コメント数:74

タイトル:困ったじいさん（TVアニメ動画）
評価:3.4
コメント数:11

タイトル:やはり俺の青春ラブコメはまちがっている。完（TVアニメ動画）
評価:3.3
コメント数:23

タイトル:食戟のソーマ 豪ノ皿（TVアニメ動画）
評価:3.3
コメント数:30

タイトル:アルテ（TVアニメ動画）
評価:3.4
コメント数:51

タイトル:富豪刑事 Balance：UNLIMITED（TVアニメ動画）
評価:3.2
コメント数:37

タイトル:デジモンアドベンチャー：（TVアニメ動画）
評価:3.2
コメント数:15

タイトル:Re：ゼロから始める異世界生活(第2期)（TVアニメ動画）
評価:3.2
コメント数:13

タイトル:LISTENERS（TVアニメ動画）
評価:3.2
コメント数:57

タイトル:ハクション大魔王2020（TVアニメ動画）
評価:3.2
コメント数:14

タイトル:継つぐもも（TVアニメ動画）
評価:3.1
コメント数:26
```

上記のようにアニメごとに評価とコメント数も取得できて、どれ見ようか決めることができますね！！！

**PS**
個人的にはソーマ推していたんですけど、最近明らかに勢いが落ちてきてしまっていますね...となると、評価の高い「かぐや」か１期みて泣いた「フルーツバスケット」あたりを見ようと思います。


今日書いたコードはgithubの方でも公開したいと思います。(そんな価値があるかは不明ですが)
https://github.com/itayayuichiro/anikore_crawler