オフラインでも開発を継続してできるように、ローカルのファイルをクローリングできるようにしたときにanemoneで同じようにやろうとしてはまったこと
結論からいうと、anemoneはHTTPリクエスト以外の場合では正常に動作しないとのこと。よく考えてみればanemoneってwebクローラーだったし、当たり前のことなんだけど、、
ローカルファイルをクロールするには、anemoneを使う必要はない。anemoneのgemをインストールした際に一緒にインストールされるnokogiriを利用すれば問題なし。nokogiriを使ったクローリングについては
このURLに書いてある。英語のドキュメントだけど、タイトルに[ FILE ]とかあるからだいたいどこ見ればいいかはわかると思う。
てことでオフラインでも好き勝手開発できるようになった。あまりニーズはないかもしれないけど、すごく困ったので書いてみた。
この辺を多少冗長な部分があるけど、唯一わかりやすく解説してくれているのは以下のリンク。
Project Name : 周りに勧められてスクレイピングなるものをしてみたいけど何すればいいのかわからなかったあの日の自分へ
やり方
間違っている点、修正したほうがいい表現などがあったらどんどん編集依頼を送っていただけたらとても嬉しいです。
以下、注意点
①ローカルファイルを「File.open(パス)」で指定するだけではダメ
というのも、nokogiriでスクレイピングする際には「xpath」という手法を使うのですが、そのためにはnokogiriのメソッド、またはanemoneのメソッドで呼び出したファイルしかその手法を活用できなかった。
もちろん、ローカルファイルの呼び出しにはfile.open使わなきゃいけないんだけどそのあとにnokogiriで使える形にするために1ステップコーディング
require "nokogiri"
file = File.open("test.html")
doc = Nokogiri::HTML(file)
xmlファイルならば「html」と書いてあるところをすべて「xml」で書き換えれば問題なく利用していくことはできる。
ちなみに、nokogiriの使い方については、日本語のサイトはたいていよくわからないので公式ドキュメントを読みましょう。(よくわかんないメモ書きみたいなのを更新してる俺が言うのもなんだけど笑)
②もちろん、「file:///パス」でいくのもダメ
これはブラウザからローカルのファイルにアクセスするときに、よび出す書き方なんだけど、もちろんこれもダメ。
ブラウザでからアクセスできるが、これはfileプロトコルというものを活用しているのでなんかややこしいことになるからアウト。
これだと、通信プロトコルを使っているからanemoneでクローリングすることは可能。ただ、HTTPプロトコルで通信しているわけではないから色々問題が生じて、結局xpathで指定はできなかった。よびだせるけど、「InvalidURIError」って出てきてxpathで読み込むための形まで変換できないことが原因みたい。(正確なことはわからない)