search
LoginSignup
58

More than 5 years have passed since last update.

posted at

updated at

NodeとRubyとPythonでスクレイピング

スクレイピングやってみようと思って Node、Ruby、Python でそれぞれ調べてみた。
google.co.jp のタイトルをとってくるという内容で試してみる。

scraping.png

Nodeでやってみる

request でページをとってきて、jQuery的なセレクタが使える cheerio でパースして要素を探索という流れでやってみる。

まずターミナルからモジュールをインストール。

$ npm install request cheerio

適当にファイルつくって実装。

scrape.js
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
Google

cheerio は要素取得だけじゃなくて $.addClass とか $.append とかjQueryの一部のメソッドが実装されてるので、DOMをぐいぐい操作するようなケースによさそう。

Rubyでやってみる

ぐぐったら Nokogiri てのが真っ先にでてきた。これがデファクトぽい。
open-uri でページとってきて、Nokogiri でパースしてみる。

$ gem install nokogiri

open-uri は標準添付なので Nokogiri をインストール。
適当にファイルをつくる。

scrape.rb
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 でパースという流れ。

scrape.py
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
Google

Scrapy(Python)でやってみる

Scrapy はクローラーとスクレイピングがセットになったライブラリみたい。
ちょっとだけ試したのでメモ。

$ pip install scrapy

ドキュメントのチュートリアルをさっと流し読みしてみる。
まず scrapy でプロジェクトテンプレートをつくる。

$ scrapy startproject hello

spiders 直下にファイルをつくって、クローラーとスクレイピング処理を記述していく。

hello/hello/spiders/scrape.py
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']

クローラーもセットになってるので、がっつり作るにはよさそう。

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
What you can do with signing up
58