スクレイピングやってみようと思って Node、Ruby、Python でそれぞれ調べてみた。
google.co.jp のタイトルをとってくるという内容で試してみる。
Nodeでやってみる
request でページをとってきて、jQuery的なセレクタが使える cheerio でパースして要素を探索という流れでやってみる。
まずターミナルからモジュールをインストール。
$ npm install request cheerio
適当にファイルつくって実装。
var request = require('request'),
cheerio = require('cheerio');
var url = 'http://google.co.jp';
request(url, function (error, response, body)
{
if (!error && response.statusCode === 200)
{
var $ = cheerio.load(body),
title = $('title').text();
console.log(title);
}
});
実行してみる。
$ node scrape.js
cheerio は要素取得だけじゃなくて $.addClass とか $.append とかjQueryの一部のメソッドが実装されてるので、DOMをぐいぐい操作するようなケースによさそう。
Rubyでやってみる
ぐぐったら Nokogiri てのが真っ先にでてきた。これがデファクトぽい。
open-uri でページとってきて、Nokogiri でパースしてみる。
$ gem install nokogiri
open-uri は標準添付なので Nokogiri をインストール。
適当にファイルをつくる。
require 'open-uri'
require 'nokogiri'
url = 'http://www.google.co.jp/'
html = open(url)
doc = Nokogiri::HTML.parse(html)
puts doc.css('title').text
HTML.parse で返ってきたオブジェクトは XPath か CSS、またはその両方でも探索できるみたい。CSSセレクタは手軽でいいな。
実行してみる。
$ ruby scrape.rb
"Google"
さくっとやるにはとってもよさげ。
Pythonでやってみる
最初に Scrapy てのをみつけたのだけど、ちょっと大きめのライブラリなので、もうちょいカジュアルな BeautifulSoup で試してみる。
標準の HTMLParser もあるみたいだけど、BeautifulSoup はいろいろよしなにやってくれるらしい。
インストールは pip ではだめだったので easy_install で入れた。
$ easy_install BeautifulSoup
urllib でページをとってきて、BeautifulSoup でパースという流れ。
import urllib
import BeautifulSoup
url = 'http://www.google.co.jp/'
html = urllib.urlopen(url).read()
soup = BeautifulSoup.BeautifulSoup(html)
print soup.find('title').string
実行してみる。
$ python scrape.py
Scrapy(Python)でやってみる
Scrapy はクローラーとスクレイピングがセットになったライブラリみたい。
ちょっとだけ試したのでメモ。
$ pip install scrapy
ドキュメントのチュートリアルをさっと流し読みしてみる。
まず scrapy でプロジェクトテンプレートをつくる。
$ scrapy startproject hello
spiders 直下にファイルをつくって、クローラーとスクレイピング処理を記述していく。
from scrapy.spider import Spider
from scrapy.selector import Selector
class HelloSpider(Spider):
name = "hello"
allowed_domains = ["google.co.jp"]
start_urls = ["http://www.google.co.jp/"]
def parse(self, response):
sel = Selector(response)
title = sel.css('title::text').extract()
print title
要素取得には XPath か CSS セレクタが使える。
で、これをターミナルから実行してみる。
$ scrapy crawl hello
出力結果
[u'Google']
クローラーもセットになってるので、がっつり作るにはよさそう。