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.
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
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? –
La syntaxe est incorrecte. un «do» exige et «fin» quelque part. – jaydel