読者です 読者をやめる 読者になる 読者になる

歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【Ruby】HTMLをYAMLに変換して他サイトの改修をチェックする (ver2)

Ruby Nokogiri スクレイピング

スクレイピングで他サイトの改修をチェックして自社サイトの参考にしよう」という上司の無茶振り要望に応えてあげようキャンペーン第二弾です。

kiito.hatenablog.com

前回のコードを回して、一応改修箇所は検知できていたようですが、正直全然使い物になるレベルではありませんでした。 主に、以下のような変化があった場合にyamlの見た目上の変更箇所が大きく出てしまうことが原因のようでした。

  1. hrefやsrcなど、リンク先のちょっとした変化(css等のキャッシュ用パラメータ等)
  2. (特に商品一覧ページで)商品数の変化すると、<li>タグの数が代わった場合

というわけで、前回のコードを書き直してみました。

  1. htmlの要素のnode_nameattributesが同じだった場合に一つにまとめ、最初の要素を取るようにした
  2. 一応要素の変化も検知できるように、count:というパラメータを導入した
  3. href, src, altタグを無視するようにした

また、Pythonでは辞書(ハッシュテーブル)で順番が保存されず何かと不便なため、Rubyで書き直しました。 Python3.6からは辞書の挿入順が保存されるらしいので、もうちょっと後だったらPythonで書いてたかもしれません。

$ bundle exec ruby honenuki.rb --url='http://google.com' --user-agent='hogehoge-bot' | head   
---
:name: html
:attributes:
  :itemscope: ''
  :itemtype: http://schema.org/WebPage
  :lang: ja
:children:
- :name: head
  :count: 1
  :children:

利用すると↑こんなのが標準出力されます。

肝心のコードはGistにアップしています。