📝Clojure Scraping

📝Clojure Scraping

Clojureによるスクレイピング技術まとめ.

Cljure Scraping Basic #

いろいろとしらべると, HTTPクライアント(http-kit or clj-http) + enliveが王道. enlive はClojureにおけるHTML parserの筆頭. HTTPクライアントのGet RequestでHTMLデータを取得してあとはゴリゴリ解析すればいい.

スクレイピングにClojureを選択する利点は,

  • Lispはそもそもparser処理に強い.
  • REPLによるインタラクティブな解析.
  • defaultでパラレルな処理に長けている.

つまりライブラリがなくともデフォルトで強い. いざとなればJavaのライブラリが使える(playwright とか).


基本的には以下の流れだ.

  • url指定で get requestでHTMLの素のデータを取得.
  • enliveでhtmlデータをHashMapに変換.
  • defでREPLにbinding(キャッシュする).
  • キャッシュしたHashMapに対するパーサーをREPLと対話しながら作成.

enlive-html #

ref: Getting started · cgrand/enlive Wiki

enlive はClojureにおけるテンプレートエンジンであるが, その中でもenlive-htmlがCSS-baseパーサーライブラリ.

(require '[net.cgrand.enlive-html :as html])

html-resource で URLに対してget requestをしてbodyをtreeデータ(hash-maps)にパースしてくれる. もしくは, 自前でhttp getしてbodyを html-snipet に突っ込んでもい.

(html/html-resource (java.net.URL url))

そしてこのデータは単なるClojureのhash-mapに過ぎないので,素のClojure関数でゴリゴリ中をみれるわけだ. clojure.pprint/pprint なんかでREPLに出力できる(HTMLデータが大きいときは注意).

enliveには select という関数があり, これでCSSセレクタを指定してアクセスできる. get-in のようにアクセス可能.

enlive select Idioms #

enliveのよくあるパターンの例まとめ. 🏷cljidiom

ref. Enlive selectors syntax - GitHub

タイトル取得 #

;; title取得
(html/select [:title])

;; head取得
(html/select [:head])

name属性取得 #

name=“description"という属性をもつ要素を取得.

(html/select page [(html/attr= :name "description")])

section id=xxx 取得 #

References #


Tags