###■環境
・Windows10(64bit)
・Ruby 2.7.4
・Rails 5.2.6
・Mechanize 2.8.2
###■MechanizeでJavaScriptの箇所を読み取れない
####状況
Railsアプリケーションでgem「Mechanize」を使用し、Webスクレイピングを行っている。
しかし、HTMLファイル内のJavaScriptの箇所だけ読み取れない(パースできない)。
####原因
MechanizeはJavaScript未対応
####対処1
MechanizeではなくSeleniumなどを使用
####対処2
JavaScriptが行うはずの処理をRubyで置き換える。
ただし、そのためにはJavaScriptの内容を読み解く能力が必要。
####対処3
HTMLファイル内のscriptタグを削除し、読み取り可能になるか試す。
例
# Mechanizeの初期設定を実行。Mechanizeクラスのオブジェクトを作成。
agent = Mechanize.new
# 保持する履歴の最大数を指定。「0」だとリファラー周りで不都合があるが、大きいとメモリ容量を取るため、「2」辺りが妥当。
agent.max_history = 2
# HTTPリクエストのヘッダーにUser-Agentを設定。指定文言以外だとMechanizeの情報が送信されてしまうため注意。
agent.user_agent_alias = 'Windows Mozilla'
# キャッシュに存在するページへの再アクセス時に更新チェックを行うかどうかを設定。true:変更が無ければキャッシュを再利用。
agent.conditional_requests = false
# URLを取得
top_url = 'https://sample.co.jp/'
# MechanizeにてURLからHTMLファイルを取得し、パースを阻害するJavascript関連のタグを削除。
html = agent.get(top_url).body.gsub!(/<script.*?>/, "").gsub!(/<\/script>/, "")
# 以降で必要なパースなどを行う
・Mechanizeのgetメソッド: URLが表すページを取得する
・Mechanizeのbodyメソッド: ページのBody部を返す
・gsubメソッド: 文字列を置換する。標準では非破壊的メソッドのため、今回は「!」を付け破壊的メソッドにしている。