QA@IT
«回答へ戻る

プログラムの誤り訂正

250
 
     puts "--------------------"
 
-    rank,title = title.gsub(" ", "").split(".")
+    rank,title = title.gsub(" ", "").split(".",2)
 
     url ="https://play.google.com" + node[:href]
 

斜め読みした感じでは、crontabからの実行による影響は無さそうですが、あくまで斜め読みなので。

質問1.
crontabから実行されるコマンドから、何らかの出力があった場合、または終了コードが0でない場合は、その出力が、crontabのユーザー宛にメールされますので、普通はメールで実行結果を知ります。
メールで無くファイルに残したい場合は、crontabで、
0 6 * * * ruby foo >foo.log 2>&1
のようにします。

質問2.
多くの場合(ほとんどの場合)は、環境変数です。
Rubyスクリプトの場合は、先頭でp ENVしておくと環境変数が分かるのでいいかと。

権限は、crontabのユーザーで実行されるので、共用レンタルサーバーの場合だと、コマンドラインからの実行の場合と同じです。専用サーバーの場合は、どのユーザーで実行しているかは自分で分かっていると思うので。

あとは、起動時のカレントディレクトリはcrontabのユーザーのホームディレクトリです。これもコマンドラインからの場合と普通は同じでしょう。上に書いた例だと、foo と foo.log はホームディレクトリのファイルです。

質問3.
なんかゴチャゴチャしているので、多分こういう結果が欲しいんだろうという物に単純化してみました。

require "open-uri"
require "nokogiri"

# スクレイピングするURL
url = 'https://play.google.com/store/apps/collection/topgrossing'

charset = nil
html = open(url) do |f|
  charset = f.charset
  f.read
end

File.open("check02.txt","w") do |file|
  file.puts(charset)
  file.puts(html)
  file.puts(url)
end

#要素格納用配列 utf-8
arRankTitle = []
arRankUrl = []
arRankNum = []

# htmlをパース(解析)してオブジェクトを作成
doc = Nokogiri::HTML.parse(html, nil, charset)

#タイトル
quTitle = doc.title
puts quTitle

#アプリタイトルとURLを
doc.xpath("//div[@class = 'details']/a").each do |node|
    title = node.text
    #からオブジェクトが居るので間引く
    next if title.empty?

    puts "--------------------"

    rank,title = title.gsub(" ", "").split(".",2)

    url ="https://play.google.com" + node[:href]

    puts "#{rank} <=順位です。"
    puts title

    arRankTitle << title
    arRankUrl << url
    arRankNum << rank
end
斜め読みした感じでは、crontabからの実行による影響は無さそうですが、あくまで斜め読みなので。

質問1.
crontabから実行されるコマンドから、何らかの出力があった場合、または終了コードが0でない場合は、その出力が、crontabのユーザー宛にメールされますので、普通はメールで実行結果を知ります。
メールで無くファイルに残したい場合は、crontabで、
0 6 * * * ruby foo >foo.log 2>&1
のようにします。

質問2.
多くの場合(ほとんどの場合)は、環境変数です。
Rubyスクリプトの場合は、先頭で`p ENV`しておくと環境変数が分かるのでいいかと。

権限は、crontabのユーザーで実行されるので、共用レンタルサーバーの場合だと、コマンドラインからの実行の場合と同じです。専用サーバーの場合は、どのユーザーで実行しているかは自分で分かっていると思うので。

あとは、起動時のカレントディレクトリはcrontabのユーザーのホームディレクトリです。これもコマンドラインからの場合と普通は同じでしょう。上に書いた例だと、foo と foo.log はホームディレクトリのファイルです。

質問3.
なんかゴチャゴチャしているので、多分こういう結果が欲しいんだろうという物に単純化してみました。
```ruby
require "open-uri"
require "nokogiri"

# スクレイピングするURL
url = 'https://play.google.com/store/apps/collection/topgrossing'

charset = nil
html = open(url) do |f|
  charset = f.charset
  f.read
end

File.open("check02.txt","w") do |file|
  file.puts(charset)
  file.puts(html)
  file.puts(url)
end

#要素格納用配列 utf-8
arRankTitle = []
arRankUrl = []
arRankNum = []

# htmlをパース(解析)してオブジェクトを作成
doc = Nokogiri::HTML.parse(html, nil, charset)

#タイトル
quTitle = doc.title
puts quTitle

#アプリタイトルとURLを
doc.xpath("//div[@class = 'details']/a").each do |node|
    title = node.text
    #からオブジェクトが居るので間引く
    next if title.empty?

    puts "--------------------"

    rank,title = title.gsub(" ", "").split(".",2)

    url ="https://play.google.com" + node[:href]

    puts "#{rank} <=順位です。"
    puts title

    arRankTitle << title
    arRankUrl << url
    arRankNum << rank
end
```

回答を投稿

斜め読みした感じでは、crontabからの実行による影響は無さそうですが、あくまで斜め読みなので。

質問1.
crontabから実行されるコマンドから、何らかの出力があった場合、または終了コードが0でない場合は、その出力が、crontabのユーザー宛にメールされますので、普通はメールで実行結果を知ります。
メールで無くファイルに残したい場合は、crontabで、
0 6 * * * ruby foo >foo.log 2>&1
のようにします。

質問2.
多くの場合(ほとんどの場合)は、環境変数です。
Rubyスクリプトの場合は、先頭でp ENVしておくと環境変数が分かるのでいいかと。

権限は、crontabのユーザーで実行されるので、共用レンタルサーバーの場合だと、コマンドラインからの実行の場合と同じです。専用サーバーの場合は、どのユーザーで実行しているかは自分で分かっていると思うので。

あとは、起動時のカレントディレクトリはcrontabのユーザーのホームディレクトリです。これもコマンドラインからの場合と普通は同じでしょう。上に書いた例だと、foo と foo.log はホームディレクトリのファイルです。

質問3.
なんかゴチャゴチャしているので、多分こういう結果が欲しいんだろうという物に単純化してみました。

require "open-uri"
require "nokogiri"

# スクレイピングするURL
url = 'https://play.google.com/store/apps/collection/topgrossing'

charset = nil
html = open(url) do |f|
  charset = f.charset
  f.read
end

File.open("check02.txt","w") do |file|
  file.puts(charset)
  file.puts(html)
  file.puts(url)
end

#要素格納用配列 utf-8
arRankTitle = []
arRankUrl = []
arRankNum = []

# htmlをパース(解析)してオブジェクトを作成
doc = Nokogiri::HTML.parse(html, nil, charset)

#タイトル
quTitle = doc.title
puts quTitle

#アプリタイトルとURLを
doc.xpath("//div[@class = 'details']/a").each do |node|
    title = node.text
    #からオブジェクトが居るので間引く
    next if title.empty?

    puts "--------------------"

    rank,title = title.gsub(" ", "").split(".")

    url ="https://play.google.com" + node[:href]

    puts "#{rank} <=順位です。"
    puts title

    arRankTitle << title
    arRankUrl << url
    arRankNum << rank
end
斜め読みした感じでは、crontabからの実行による影響は無さそうですが、あくまで斜め読みなので。

質問1.
crontabから実行されるコマンドから、何らかの出力があった場合、または終了コードが0でない場合は、その出力が、crontabのユーザー宛にメールされますので、普通はメールで実行結果を知ります。
メールで無くファイルに残したい場合は、crontabで、
0 6 * * * ruby foo >foo.log 2>&1
のようにします。

質問2.
多くの場合(ほとんどの場合)は、環境変数です。
Rubyスクリプトの場合は、先頭で`p ENV`しておくと環境変数が分かるのでいいかと。

権限は、crontabのユーザーで実行されるので、共用レンタルサーバーの場合だと、コマンドラインからの実行の場合と同じです。専用サーバーの場合は、どのユーザーで実行しているかは自分で分かっていると思うので。

あとは、起動時のカレントディレクトリはcrontabのユーザーのホームディレクトリです。これもコマンドラインからの場合と普通は同じでしょう。上に書いた例だと、foo と foo.log はホームディレクトリのファイルです。

質問3.
なんかゴチャゴチャしているので、多分こういう結果が欲しいんだろうという物に単純化してみました。
```ruby
require "open-uri"
require "nokogiri"

# スクレイピングするURL
url = 'https://play.google.com/store/apps/collection/topgrossing'

charset = nil
html = open(url) do |f|
  charset = f.charset
  f.read
end

File.open("check02.txt","w") do |file|
  file.puts(charset)
  file.puts(html)
  file.puts(url)
end

#要素格納用配列 utf-8
arRankTitle = []
arRankUrl = []
arRankNum = []

# htmlをパース(解析)してオブジェクトを作成
doc = Nokogiri::HTML.parse(html, nil, charset)

#タイトル
quTitle = doc.title
puts quTitle

#アプリタイトルとURLを
doc.xpath("//div[@class = 'details']/a").each do |node|
    title = node.text
    #からオブジェクトが居るので間引く
    next if title.empty?

    puts "--------------------"

    rank,title = title.gsub(" ", "").split(".")

    url ="https://play.google.com" + node[:href]

    puts "#{rank} <=順位です。"
    puts title

    arRankTitle << title
    arRankUrl << url
    arRankNum << rank
end
```