スクレイピング したいサイトで、スクレイピングをしすぎるとサーバーを落としてしまい、犯罪になる可能性があります。
サイバー攻撃みたいなことをしないために、ローカルに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
