htmlから本文に当たる箇所を判別し、抽出してくれるライブラリで有名なのがこのReadabilityだが、これまでPythonで書かれたものしかないと思っていた。
けど、どうしてもNode.jsでクローラーを書きたくて、Node.jsベースのものを探してみると、普通にこのReadabilityのNode版があったので使ってみた。
https://github.com/luin/readability
もくじ
readabilityってなに?
webページの本文にあたる箇所のみを抽出してくれるライブラリ。
ヘッダーナビとかサイドバー、関連記事、広告などなど、本文と関係ない部分を全部除いて本文だけのキレーな形にしてくれる。
例えばクローラーなどで丸ごとページのhtmlを取得してしまった時、本文以外の要らん部分がかなり混じる。
そのため、形態素解析にかけたりとか分析用のデータとして使うにはかなりノイズだらけでそのまま使える状態じゃなかったりする。
それをいちいち目で見て整形したり、正規表現でどうにかするのもめんどくさいので、readabilityのようなライブラリで綺麗にしてやる必要があるんだよね。
インストール方法
npmで下記のコマンド一発。
readabilityの特徴
クローラーとしての機能がついてる
Readabilityはクローラー付きなので、url渡してやるとhtml取得からやってくれる。
urlの代わりにそのままhtmlを渡すことも可能っぽいので、細かいことをしたければ、ページ取得はrequestとかcheerio-httpcliでやって、結果のhtmlを読ませるなんてこともできるようだ。(未検証)
→ただ生HTML渡すだけじゃなんかうまくいかないので、やり方わかったらまた追記します。
その他、エンコード変換や絶対パスへの変換などもやってくれる
ついでに、Githubから特徴の箇所を引用すると、
1.Supporting HTML5 tags(article, section) and Microdata API.
2.Focusing on both accuracy and performance. 4x times faster than arc90’s version.
3.Supporting encodings such as GBK and GB2312.
4.Converting relative urls to absolute for images and links automatically(Thank Guillermo Baigorria & Tom Sutton).
とのことだ。雑に訳すと以下のような感じ。
1.article, sectionなどのHTML5のタグとMicrodata APIに対応
2.正確性とパフォーマンスの両方を追求。arc90のバージョン(ベースになったプロジェクト)に比べて4倍高速。
3.GBKとかGBK2312といったエンコーディングに対応。
4.画像やリンクなどの相対パスは絶対パスに自動変換
ちなみに、クロールしたページのエンコードがutf−8以外のものであった場合、自動的にutf−8に変換されるとのこと。
使用例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
const read = require('node-readability'); // 取得したいページのURL(とりあえずこのブログにしてるが、ミスって大量リクエストしないでね!) const url = 'https://sutaba-mac.site/scrapy-s2-settings-and-items/'; read(url, (err, article, meta) => { // Titleタグのテキスト console.log(article.title); // 本文のhtml console.log(article.content); // 本文(テキストのみ抽出) console.log(article.textBody); // Close article to clean up jsdom and prevent leaks article.close(); }); |
結果を貼ると長いから省略するが、ほぼ正確に本文を抽出出来た。無駄なスペースとか改行もない。
注意点
・クロール間隔は最低でも1秒以上開けるようにしよう。何も考えずにfor文に突っ込むとかしないように。
・robots.txtとかでクロール拒否されてないか確認しよう。
・取得したコンテンツの権利は当たり前だがその製作者に属する。そのまま自分のサイトで公開したり、再配布可能な状態にしておくと最悪捕まるので注意。
免責事項
クローラーは色々気をつけて使用しないと、他人に大変な迷惑をかける可能性がありますので十分注意してください。
この記事見た人がなんかやらかしても一切知ったこっちゃありませんので、なんら責任、保証、その他一切の面倒ごとになんら関知するものではありません。
参考にしたもの
GitHub – luin/readability: Turn any web page into a clean view