2016-08-22 1 views
-1

J'ai créé un script ruby ​​qui s'exécute bien si je l'exécute à partir de la console.Rake tâche ne pas enregistrer ou créer un nouvel enregistrement dans la base de données

Le script extrait des informations de divers sites Web et les enregistre dans ma base de données.

Toutefois, lorsque je veux transformer le code en une tâche rake, le code est toujours exécuté, mais il n'enregistre aucun nouvel enregistrement. Je ne reçois aucune erreur du râteau non plus.

# 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 

Le code exécute bien, si j'enregistrez le fichier comme crawler.rb et l'ouvrir dans la console en faisant -> « charge" ./crawler2.rb ». Lorsque j'utilise exactement le même code dans une tâche rake, je n'ai pas de nouveaux enregistrements.

+0

se sent comme s'il manquait quelque chose ici. la 'tâche: crawler do' n'est jamais fermée avec un' end'. La création de l'article est-elle réellement à l'intérieur de la tâche? L'indentation suggère peut-être pas? – jaydel

+0

Merci pour votre contribution, mais je crains que ce ne soit pas le cas. J'ai testé avec quelques déclarations d'impression/puts et ceux-ci fonctionnent parfaitement aussi bien. C'est comme si le code saute simplement la partie .create. Je ne sais pas si j'utilise Rake dans le mauvais sens ou si la syntaxe est fausse? –

+0

La syntaxe est incorrecte. un «do» exige et «fin» quelque part. – jaydel

Répondre

0

J'ai compris ce qui n'allait pas.

Je dois enlever:

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

et au lieu de modifier les éléments suivants:

task :crawler => :environment do 

Maintenant, le robot exécute toutes les dix minutes avec un peu d'aide du planificateur Heroku :-)

Merci pour l'aide les gars - et désolé pour le mauvais formatage. J'espère que cette réponse peut aider les autres.