ruby

【Ruby on rails】HTMLファイルをローカルに保存してスクレイピング

スクレイピング したいサイトで、スクレイピングをしすぎるとサーバーを落としてしまい、犯罪になる可能性があります。

サイバー攻撃みたいなことをしないために、ローカルにHTMLファイルをダウンロードしてスクレイピングをしましょう。

今回は、Naverまとめのページをローカルにダウンロードして、ローカルに落としたファイルでスクレイピングをしていく方法をまとめました。

※「まとめました」というよりも、個人的なメモですね。。

HTMLファイルのローカル保存

・open-uriを利用して、NaverまとめのトップページのHTMLファイルをローカルに保存できた。

①ファイル作成

download.rbというファイルをapp/scrapesディレクトリに作成

②以下の内容を記述。

require ‘open-uri’
@path = ‘https://matome.naver.jp/’

fileName = File.basename(@path)

open(fileName, ‘wb’) do |output|
open(@path) do |data|
output.write(data.read)
end
end

③ターミナルにて、以下のコマンドを実行

※コマンドを実行する前にHTMLファイルを保存したいディレクトリに移動
ruby download.rb

【補足】上記①〜③を行った後のディレクトリの構成について

app/scrapes/download.rb
app/scrapes/matome.naver.jp
→今回は「matome.naver.jp」というファイル名を「matome_naver.html.erb」に変更しました。

課題が出てきた。。

ローカルにHTMLファイルをダウンロードすることはできた。

ただ、そのMechanizeでHTMLファイルを読み込むことに失敗している。

読み込むことというよりも

<<MechanizeのgetメソッドでHTMLファイルを見つけられていない。>>

いろいろ調べたところ、Mechanizeの情報があまり見つけられなかったため、nokogiriで調査。

nokogiriを使ったらローカルファイルからスクレイピングしてタイトルを取得できた

require ‘nokogiri’
f = File.open(“matome_naver.html.erb”)
doc = Nokogiri::HTML(f)
f.close()

puts doc.title

こちらをコードに記載して、ruby 【ファイル名】をコンソールで実行

記事タイトル一覧の取得にも成功

ちなみに、nokogiriでCSSセレクタを使う方法を実践したら、以下のコードをファイルに記述して、ruby 【ファイル名】をコンソールで実行したら、タイトル一覧を取得できた。

require ‘nokogiri’
f = File.open(“matome_naver.html.erb”)
doc = Nokogiri::HTML(f)
f.close()

doc.css(“.mdTopMTMList01ItemTtl”).each do |node|
puts node.inner_text
end

記事タイトル一覧ターミナルで出力したもの
ABOUT ME
Ryo
【複業家】会社員をしながら、web関連の事業を個人で行っています。SEOコンサル、Lステップ構築、ボイスパーカッション講師。