LoginSignup
14
12

More than 5 years have passed since last update.

Atomで手動スクレイピング

Posted at

プログラムいらず!vimで手動スクレイピングという記事があったので、Atomでもやってみた。
vimの場合はexコマンドの組み合わせで実現していたが、AtomならばJavaScriptを使うので「プログラムいらず!」とはならないが、やってみるのも一興であろう。
「表示」 > 「開発」 > 「デベロッパー ツール」からデベロッパーツールを開き、新しいタブを開いた上で下記JavaScriptを実行すると動く。

正規表現による力技

require("http").get("http://b.hatena.ne.jp/ctop/it", function(r){var b = "";r.on("data", function(c){b += c});r.on("end", function(){b.replace(/\n/g, "").match(/<a[^>]*href="([^"]+)"/g).forEach(function(m){atom.workspace.getActiveTextEditor().insertText(m.replace(/<a[^>]*href="([^"]+)"/, function(){return arguments[1] + "\n"}))})})})

なにこれきもちわるい。

DOMオブジェクトにしてみる

Vimは行指向の編集が出来るから、正規表現による力技でもスマートにやれるのだろう。
ならばAtomはJSを扱える強みを生かしてDOMオブジェクトから抽出するのがスマートであるはずだ。

require("http").get("http://b.hatena.ne.jp/ctop/it", function(r){var b = "";r.on("data", function(c){b += c});r.on("end", function(){var p = new DOMParser();var d = p.parseFromString(b, "text/html");[].forEach.call(d.querySelectorAll("a"), function(a){atom.workspace.getActiveTextEditor().insertText(a.getAttribute("href") + "\n")})})})

なにこれきもちわるい。

結論

やる前から分かっていたことだが、素直にプログラム書いて、scriptなりで実行した結果をコピペしたほうがすっきり書けるようだ。

なお、他のOSではどうか知らないが、Windows版であればCtrl + oで開くファイル選択ダイアログの「ファイル名」にURLを貼り付けて「開く」とするとファイルをダウンロードしてから開いてくれるので、参考までに。
(これはAtomに限らずWindowsの「ファイルを開く」ならば大体利用できる)

補足

標準状態で扱えるモジュールのみで完結させようとしたためhttpモジュールやDomParserを使用しているが、恐らくrequestモジュールやcheerioモジュールを使ったほうがスマートに書けるであろう。
しかし、Vimは標準で扱えるものだけで実現していたため、今回はあえてこれらのモジュールを使わずに泥臭く書いている。

最後に、上記のコードをatom-beautifyで整形したものを掲載する。
「ここをこうしたらもっと短くなるのでは」というアイデアがあればコメントにてお教えいただければ幸いである。

"正規表現による力技"の整形

require("http").get("http://b.hatena.ne.jp/ctop/it", function(r) {
  var b = "";
  r.on("data", function(c) {
    b += c
  });
  r.on("end", function() {
    b.replace(/\n/g, "").match(/<a[^>]*href="([^"]+)"/g).forEach(function(m) {
      atom.workspace.getActiveTextEditor().insertText(m.replace(/<a[^>]*href="([^"]+)"/, function() {
        return arguments[1] + "\n"
      }))
    })
  })
})

"DOMオブジェクトにしてみる"の整形

require("http").get("http://b.hatena.ne.jp/ctop/it", function(r) {
  var b = "";
  r.on("data", function(c) {
    b += c
  });
  r.on("end", function() {
    var p = new DOMParser();
    var d = p.parseFromString(b, "text/html");
    [].forEach.call(d.querySelectorAll("a"), function(a) {
      atom.workspace.getActiveTextEditor().insertText(a.getAttribute("href") + "\n")
    })
  })
})
14
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12