2016-08-22 1 views
-1

Я создал рубиновый скрипт, который отлично работает, если я запустил его из консоли.Задача рейка не сохранять или создавать новую запись в базе данных

Сценарий извлекает некоторую информацию с различных сайтов и сохраняет ее в моей таблице базы данных.

Однако, когда я хочу превратить код в граблированную задачу, код все еще работает, но он не сохраняет никаких новых записей. Я также не получаю никаких ошибок от рейка.

# 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 

Код выполняется нормально, если я сохраняю файл как crawler.rb и открыть его в консоли, выполнив -> «нагрузки„./crawler2.rb“». Когда я использую тот же самый код в задаче rake, я не получаю никаких новых записей.

+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 планировщика :-)

Спасибо за помощь, ребята, и извините за плохое форматирование. Надеюсь, этот ответ может помочь другим.

Смежные вопросы