2016-08-22 12 views
-1

Consoleから実行するとうまく実行されるrubyスクリプトを作成しました。Rakeタスクがデータベースに新しいレコードを保存または作成しない

スクリプトは、さまざまなWebサイトからいくつかの情報を取得し、それを自分のデータベーステーブルに保存します。

ただし、コードをレーキタスクにする場合、コードは実行されますが、新しいレコードは保存されません。レーキからもエラーは出ません。 >「負荷 『./crawler2.rb』を」 - 私はcrawler.rbとしてファイルを保存し、実行してコンソールで開く場合

# Add your own tasks in files placed in lib/tasks ending in .rake, 
# for example lib/tasks/capistrano.rake, and they will automatically be   available to Rake. 

require File.expand_path('../config/application', __FILE__) 

Rails.application.load_tasks 

require './crawler2.rb' 
task :default => [:crawler] 

task :crawler do 

### ### 

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 

start = Time.now 

$a = 0 

sites = ["http://www.nytimes.com","http://www.news.com"] 

for $a in 0..sites.size-1 

url = sites[$a] 

$i = 75 

$error = 0 

avoid_these_links = ["/tv", "//www.facebook.com/"] 

doc = Nokogiri::HTML(open(url)) 

    links = doc.css("a") 
    hrefs = links.map {|link| link.attribute('href').to_s}.uniq.sort.delete_if {|href| href.empty?}.delete_if {|href| avoid_these_links.any? { |w| href =~ /#{w}/ }}.delete_if {|href| href.size < 10 } 

#puts hrefs.length 

#puts hrefs 

for $i in 0..hrefs.length 
    begin 

     #puts hrefs[60] #for debugging) 

    #file = open(url) 
    #doc = Nokogiri::HTML(file) do 

     if hrefs[$i].downcase().include? "http://" 

      doc = Nokogiri::HTML(open(hrefs[$i])) 

     else 

      doc = Nokogiri::HTML(open(url+hrefs[$i])) 

     end 

     image = doc.at('meta[property="og:image"]')['content'] 
     title = doc.at('meta[property="og:title"]')['content'] 
     article_url = doc.at('meta[property="og:url"]')['content'] 
     description = doc.at('meta[property="og:description"]')['content'] 
     category = doc.at('meta[name="keywords"]')['content'] 

     newspaper_id = 1 


     puts "\n" 
     puts $i 
     #puts "Image: " + image 
     #puts "Title: " + title 
     #puts "Url: " + article_url 
     #puts "Description: " + description 
     puts "Catory: " + category 

      Article.create({ 
      :headline => title, 
      :caption => description, 
      :thumbnail_url => image, 
      :category_id => 3, 
      :status => true, 
      :journalist_id => 2, 
      :newspaper_id => newspaper_id, 
      :from_crawler => true, 
      :description => description, 
      :original_url => article_url}) unless Article.exists?(original_url: article_url) 

     $i +=1 

     #puts $i #for debugging 

     rescue 
     #puts "Error here: " + url+hrefs[$i] if $i < hrefs.length 
     $i +=1 # do_something_* again, with the next i 
     $error +=1 

    end 

end 

puts "Page: " + url 
puts "Articles: " + hrefs.length.to_s 
puts "Errors: " + $error.to_s 

$a +=1 

end 

finish = Time.now 

diff = ((finish - start)/60).to_s 

puts diff + " Minutes" 


### ### 


end 

コードは、罰金を実行します。レーキタスクで全く同じコードを使用すると、新しいレコードは得られません。

+0

ここには何か不足しているように感じます。 'task:crawler do'は決して' end'で閉じられません。記事作成は実際にタスク内にあるのですか?インデントは、おそらくそうではないことを示唆している? – jaydel

+0

入力いただきありがとうございますが、私はそれがそれではないことを恐れています。私はいくつかのprint/putsステートメントでテストしましたが、これらも完全に機能します。これは、コードのように.create部分をスキップするだけです。私はRakeを間違った方法で使うのか、構文が間違っているのか分かりません。 –

+0

構文が間違っています。 「do」はどこかに「必要」と「終わり」を必要とします。 – jaydel

答えて

0

私は何が間違っているかを考え出しました。

私は削除する必要が

require './crawler2.rb' 
task :default => [:crawler] 

を、代わりに次のように編集します。

task :crawler => :environment do 

今クローラが

:-) Herokuのスケジューラからの助けのビットと10分ごとに実行します

お手数をおかけしていただきありがとうございます。この答えが他の人に役立つことを願っています。