質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • Ruby on Rails

    7652questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • MySQL

    6143questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • Cloud9

    457questions

    Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

mysqlとanemoneの接続ができません。

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 375

s.k

score 249

前提・実現したいこと

anemone専用のmysql2プラグインを導入してmysqlを使いたいです。

発生している問題・エラーメッセージ

エラーにはmysqlがないと出てきているのですが、
ダウンロードしたはずなんです、、、

$ ruby anemone-mongo.rb
anemone-mongo.rb:9:in `<main>': undefined method `MySQL' for Anemone::Storage:Module (NoMethodError)

該当のソースコード

$ gem list
mysql2 (0.4.5)

以下、全て同じディレクトリ階層です。

【mysql.rb】

# coding: utf-8

begin
  require 'mysql2'
rescue LoadError
  puts "You need the mysql2 gem to use Anemone::Storage::MySQL"
  exit
end

module Anemone
  module Storage
    class MySQL

      def initialize(opts = {})
        host = opts[:host] || 'localhost'
        username = opts[:username] || 'crawler'
        password = opts[:password] || 'anemone_pass'
        database = opts[:database] || 'anemone'
        @db = Mysql2::Client.new(:host => host, :username => username, :password => password, :database => database)
        create_schema
      end

      def [](url)
        value = @db.query("SELECT data FROM anemone_storage WHERE page_key = '#{get_hash_value(url)}'").first['data']
        if value
          Marshal.load(value)
        end
      end

      def []=(url, value)
        data = Marshal.dump(value)
        key = get_hash_value(url)
        if has_key?(url)
          @db.query("UPDATE anemone_storage SET page_data = '#{data}' WHERE page_key = '#{key}'")
        else
          @db.query("INSERT INTO anemone_storage (page_key, page_data) VALUES('#{key}', '#{data}')")
        end
      end

      def delete(url)
        page = self[url]
        @db.query("DELETE FROM anemone_storage WHERE page_key = '#{get_hash_value(url)}'")
        page
      end

      def each
        @db.execute("SELECT page_key, page_data FROM anemone_storage ORDER BY id") do |row|
          value = Marshal.load(row[1])
          yield row[0], value
        end
      end

      def merge!(hash)
        hash.each { |key, value| self[key] = value }
        self
      end

      def size
        @db.query('SELECT COUNT(*) FROM anemone_storage')
      end

      def keys
        @db.query("SELECT page_key FROM anemone_storage ORDER BY id").map{|t| t[0]}
      end

      def has_key?(url)
        key = get_hash_value(url)
        result = @db.query("SELECT count(id) FROM anemone_storage WHERE page_key = '#{key}'")
        if result.first['count(id)'] > 0
          return true
        else
          return false
        end
      end

      def close
        @db.close
      end

      private

      def create_schema
        @db.query <<SQL
          create table if not exists anemone_storage (
            id int(11) NOT NULL auto_increment,
            page_key varchar(255),
            page_data BLOB,
            PRIMARY KEY (id),
            key (page_key)
          ) DEFAULT CHARSET=utf8;
SQL
      end

      def load_page(hash)
        BINARY_FIELDS.each do |field|
          hash[field] = hash[field].to_s
        end
        Page.from_hash(hash)
      end

      def get_hash_value(key)
        Digest::SHA1.hexdigest(key)
      end
    end
  end
end

【storage.rb】

def self.MySQL(opts = {})
    require 'anemone/storage/mysql'
    self::MySQL.new(opts)
end

【anemone-mongo.rb】

# -*- coding: utf-8 -*-
require 'anemone'


urls = []
urls.push("http://www.yahoo.co.jp")

opts = {
    :storage => Anemone::Storage::MySQL(),
    :depth_limit => 0
}

Anemone.crawl(urls, opts) do |anemone|
    anemone.on_every_page do |page|
        puts page.url
        puts page.doc.xpath("//title/text()").to_s if page.doc
    end
end
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby on Rails

    7652questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • MySQL

    6143questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • Cloud9

    457questions

    Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。