2017-09-06 9 views
0

最近、gem watirを使用してRubyでスクラップスクリプトを作成しています。私は結果を.jsonファイルに入れていましたが、最近はMySQL2で作業を始めました。RubyでMySQL2を使用すると、未定義のローカル変数またはメソッド `client 'がmain:Object(NameError)になります。

id、job、linkの3つの列を持つリンクというテーブルを使用して、scrapという名前のdbを作成しました。私はこのために取り組んでいるスクリプトは非常に簡単です:それは、Google検索でクエリを作成し、すべてのリンクのURLを取って、次のページに行く。あなたはそれが非常に厄介だ見ることができるように

require "watir" 
require "json" 
require "mysql2" 
b = Watir::Browser.new(:firefox) 
client = Mysql2::Client.new(:host => "localhost", :username => "root", :password => "xxx", :database => "scrap", :encoding => "utf8") 


def Launch(b) 
    job = "cabinet avocat" 
    ville = "paris" 
    k = 0 
    j = "avocat" 
    b.goto "https://www.google.fr/search?q="+"#{job}"+" "+"#{ville}" "&dcr=0&ei=1-quWY6BDouYgAb0tZq4CA&start="+"#{k}"+"&sa=N&biw=1280&bih=876" 

    loop do 
    l0 = b.div(class:"f kv _SWb", index:0).text 
    client.query("INSERT INTO links(job, link) 
    VALUES('#{j}, '#{l0}')"); 

    l1 = b.div(class:"f kv _SWb", index:1).text 
    client.query("INSERT INTO links(job, link) 
    VALUES('#{j}, '#{l1}')"); 

    l2 = b.div(class:"f kv _SWb", index:2).text 
    client.query("INSERT INTO links(job, link) 
    VALUES('#{j}, '#{l2}')"); 

    l3 = b.div(class:"f kv _SWb", index:3).text 
    client.query("INSERT INTO links(job, link) 
    VALUES('#{j}, '#{l3}')"); 

    l4 = b.div(class:"f kv _SWb", index:4).text 
    client.query("INSERT INTO links(job, link) 
    VALUES('#{j}, '#{l4}')"); 

    l5 = b.div(class:"f kv _SWb", index:5).text 
    client.query("INSERT INTO links(job, link) 
    VALUES('#{j}, '#{l5}')"); 

    l6 = b.div(class:"f kv _SWb", index:6).text 
    client.query("INSERT INTO links(job, link) 
    VALUES('#{j}, '#{l6}')"); 

    l7 = b.div(class:"f kv _SWb", index:7).text 
    client.query("INSERT INTO links(job, link) 
    VALUES('#{j}, '#{l7}')"); 

    l8 = b.div(class:"f kv _SWb", index:8).text 
    client.query("INSERT INTO links(job, link) 
    VALUES('#{j}, '#{l8}')"); 

    l9 = b.div(class:"f kv _SWb", index:9).text 
    client.query("INSERT INTO links(job, link) 
    VALUES('#{j}, '#{l9}')"); 

    k += 10 
    b.goto "https://www.google.fr/search?q="+"#{job}"+" "+"#{ville}" "&dcr=0&ei=1-quWY6BDouYgAb0tZq4CA&start="+"#{k}"+"&sa=N&biw=1280&bih=876" 
    break if k == 200 
    end 
end 

Launch(b) 

、私はそれを承知しているし、これは、すぐに私はそれが仕事を得るように固定されますので、ここで少年です。

test.rb:17:in `block in Launch': undefined local variable or method `client' for main:Object (NameError) 
    from test.rb:15:in `loop' 
    from test.rb:15:in `Launch' 
    from test.rb:62:in `<main>' 

私はかなりどこでも検索しましたし、私の問題への解決策を見つけることができていない、私はするために、ここでアカウントを作成した理由です:私はそれを実行するときに、それは私が取得エラーです他人の質問を見るだけでなく、自分自身を投稿する。

は皆

+0

における第二の属性として割り当てます。 (1) 'client'の宣言を' Launch'メソッドに移すか、または(2)メソッドを再定義してクライアントをパラメータとして渡すか、 'Launch(b、client)'のいずれかです。 –

答えて

0

clientは、スコープの起動方法の外にあるありがとう。

@clientそれがグローバル作るかclient`が宣言されている `、それは` Launch`方法に利用できない場合を考えるとLaunch(b, launch)

+0

答えをありがとう。私は返答しましたが、あなたがそれから通知を受け取るかどうか分からないので、私もコメントしています。 – BTZ

+0

心配はいりません - 上記の問題が解決すれば、それを記入してください。 – Jakub

関連する問題