nodejsでjQueryでスクレイピングしながら本文抽出にかける

バイトで本文抽出器を作成する必要あったのでいろいろ試していた

用意

npm install extract-contet request jquery jsdom

id:yssk22さんのextractcontentを使う。

やる

hackers newsのエントリ一覧にかけてみる。
coffee-script

request = require('request')
jsdom = require('jsdom').jsdom
jquery = require('jquery')
extractor = require('extractcontent')

fetch = (uri,fn)->
  request uri:uri, (error, response, body)->
    fn error,jquery.create jsdom(body).createWindow()

extract = (url,fn)->
  extractor.extractFromUrl url, (error, result)->
    fn error , result

fetch "http://news.ycombinator.com/",(err,$)->
  $("td.title a").each ->
    url=$(@).attr "href"
    if url.indexOf("http")>-1
      console.log "=== #{url} ===" 
      extract url,(err,result)->
        console.log result.content

正直言うとchildprocess.exec など使えばnodeで完結する必要はない。他に完成度が高いモジュールがあるならシェルから引っ張ってこればいい。
今は console.logしてるだけだけど、DBに叩きこんでクローラ作るなりすればいいと思う

node-readabilityを使う

readabilityとは狭い画面向けに読みやすいHTMLを構成してくれるサービスであり、またそのnodejs実装。

GitHub - arrix/node-readability: Server side readability with node.js

npm install readability
# --- 続き ---
readability = require('readability')
fetch "http://news.ycombinator.com/",(err,$)->
  $("td.title a").each ->
    url=$(@).attr "href"
    if url.indexOf("http")>-1
      request uri:url, (error, response, body)->
        readability.parse body, url, (result)->
          console.log(result.content);

iframeで外部サイト読むのをやめたかったので、readability通して扱うことにする