【Ruby】Nokogiriでスクレイピング

#概要
アウトプット用に、学習した内容を紹介していきます。
本日はNokogiriを用いてnaverまとめから注目まとめのタイトルとview数を取得し、ローカルDBに登録してみます。

#環境
Mac OS Mojave 10.14.6
Ruby 2.5.3
エディタ VSCode

#流れ
まずMySQLでデータ登録用のテーブルを作成します。

```
mysql> create table navertops(title text,view int);
Query OK, 0 rows affected (0.01 sec)
```
登録用テーブルが作成されました。

それではrubyでスクレイピングし、ローカルDBに登録してみます。

```ruby:scraping.rb
require 'open-uri'
require 'nokogiri'
require 'active_record'

# DB接続
ActiveRecord::Base.establish_connection(
  adapter: 'mysql2',
  host: 'localhost',
  username: 'root',
  password: '',
  database: 'training',
  encoding: 'utf8mb4'
)

# Timezoneの設定
Time.zone_default = Time.find_zone! 'Tokyo'
ActiveRecord::Base.default_timezone = :local

# デバッグ用
ActiveRecord::Base.logger = Logger.new(STDERR)

# Navertopクラスーnavertopsテーブルの対応
class Navertop < ActiveRecord::Base
end

url = 'https://matome.naver.jp/'

charset = nil
sleep 1
html = open(url) do |f|
  charset = f.charset
  f.read 
end

doc = Nokogiri::HTML.parse(html, nil, charset)

doc.css('.mdTopMTMList01Item').each do |node|
  Navertop.create(
    title: node.at_css('.mdTopMTMList01ItemTtl > a').inner_text,
    view: node.at_css('.mdTopMTMList01PVCountNum').inner_text
  )
end
```

ActiveRecordは先日解説したので省略します。
以下ではurlを設定し、url先の文字コードで開いたhtmlを変数htmlに格納しています。
その下の`doc=~`でHTMLを解析しています。これでcssセレクタでの要素抽出などが可能になります。
sleep 1は今回は特に必要ないですが、ループなどでデータを取得する際には過度なアクセスを行わないために必ず付けましょう。
naverサイトでfn+F12を見ると、どこに対象のデータが格納されているかが分かります。ここからタイトルとview数がある場所を探し、それをcreateでデータベースに登録しています。

それでは登録されているかMySQLで見てみます。

```
mysql> select * from navertops;
+----------------------------------------------------------------------------------------------+-------+
| title                                                                                        | view  |
+----------------------------------------------------------------------------------------------+-------+
| なんてことだ…次々と世界で起こっている「自然災害」に恐怖                                      |  9669 |
| 木村拓哉が47歳だと･･･年齢にビビるアラフィフ俳優たち                                          | 11980 |
| ダンボー豆乳・現場猫も！人気のガチャガチャが最高すぎる♡                                      | 10565 |
| ズボラさんもできちゃう！テレビ見ながらヨガポーズ3つ                                          |  4783 |
| 匂わせ発言のオンパレード『#武士との交際を匂わせる女』が笑える                                | 17118 |
| 予想の50倍…みんなの『夫婦でこんなやり取りがありました』報告…                                 | 47625 |
| 祝儀はまた3万円払うべき？…『二度目の結婚式』について様々な声                                 | 21104 |
| アイロンがけから解放！？ズボラさんにおすすめの超便利家電                                     |  5030 |
| ”スカパラ×チバユウスケ”など…この秋に聴きたい名コラボ曲5選                                    |  1916 |
| ZOZO買収にLINE経営統合仕掛人「ヤフーCEO川邊健太郎」…                                         |   849 |
| 体の芯からぽっかぽか♪冬の定番ホットドリンク13選！                                            |  2916 |
| 人気の理由は？売れ続けている無印良品のアイテム                                               |  4430 |
| これは厳しい…Twitterに広がる主婦たちの「悲痛な叫び」                                         | 11851 |
| これは最強！欅坂46菅井友香の「萌え袖ニット」が可愛すぎる件                                   |  1521 |
| 他人事じゃない･･･ネットがざわつく年金に関する報道                                            | 26209 |
| 今季もドラマを演出…Jリーグの「日程くん」が神すぎる                                           |   650 |
| 言われて爆笑…色んな意味で『その返事,面白い』ってなるTwit…                                    | 52348 |
| 働き方改革で残業が減ったのに「ストレスは増大」してるワケ                                     |  1347 |
| ホリデー第2弾も！今後のスタバ｢新作｣がスゲー！                                                | 13960 |
| タイプ別！みんながおすすめする「コスメ収納術」が完璧すぎる♡                                  |  2148 |
| まじで効いた…！「大人ニキビ」対策コスメ4連発                                                 | 19737 |
+----------------------------------------------------------------------------------------------+-------+
21 rows in set (0.00 sec)

```
無事登録されました。