2016-04-28 9 views
0

Ich schreibe einen Screen Scraper, der eine Liste von URLs von einem Beitrag nimmt, dann die URLs besucht und eine Liste aller Links auf der Seite erhält. Dann besucht es alle Links (Original und von den Schrammen) und erhält eine Liste von Bildern. Alles funktioniert gut, wenn ich den Job inline ausführe (mit der Ausnahme, dass es 30 Sekunden dauert, um zu beenden, was ein Problem ist, da es ewig dauert, auf den API-Aufruf zu antworten). Aus irgendeinem Grund, wenn ich den gleichen Code verwende und einen Hintergrund-Worker verwende, um ihn auszuführen, gibt es 2 URLs, die niemals auf abgeschlossen aktualisiert werden. Es sind immer die gleichen 2 URLs.Attribut wird nicht aktualisiert, wenn es im Hintergrund läuft, aber funktioniert gut, wenn es inline ausgeführt wird

Was seltsamer ist, dass ich die Fehlermeldung

3 TID-ov9t89ido WARN: NoMethodError: undefined method `search' for #<Mechanize::File:0x007f9d86e77a40> 

3 TID-ov9t89ido WARN bin immer: /app/app/models/scraper.rb:16:in scrape_images' /app/app/workers/image_worker.rb:5:in durchführen‘ /app/Anbieter /bundle/ruby/2.2.0/gems/sidekiq-4.1.1/lib/sidekiq/processor.rb:151:in execute_job' /app/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.1.1/lib/sidekiq/processor.rb:133:in Block (2 Ebenen) in Bearbeitung ' /app/vendor/bundle/ruby/2.2.0 /gems/sidekiq-4.1.1/lib/sidekiq/middleware/chain.rb:127:in block in invoke' /app/vendor/bundle/ruby/2.2.0/gems/newrelic_rpm-3.12.1.298/lib/new_relic/agent/instrumentation/sidekiq.rb:33:in Anruf blockieren ' /app/vendor/bundle/ruby/2.2.0/gems/newrelic_rpm-3.12.1.298/lib /new_relic/agent/instrumentation/controller_instrumentation.rb:361:in perform_action_with_newrelic_trace' /app/vendor/bundle/ruby/2.2.0/gems/newrelic_rpm-3.12.1.298/lib/new_relic/agent/instrumentation/sidekiq.rb:29:in ' /app/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.1.1/lib/sidekiq/middleware/chain.rb:129:in block in invoke' /app/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.1.1/lib/sidekiq/middleware/server/active_record.rb:6:in rufen Sie' /app/vendor/bundle/ruby /2.2.0/gems/sidekiq-4.1.1/lib/sidekiq/middleware/chain.rb:129:in block in invoke' /app/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.1.1/lib/sidekiq/middleware/server/retry_jobs.rb:74:in rufen Sie ' /app/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.1.1 /lib/sidekiq/middleware/chain.rb:129:in block in invoke' /app/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.1.1/lib/sidekiq/middleware/server/logging.rb:11:in Anruf blockieren ' /app/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.1.1/lib/sidekiq/logging.rb:31 : in with_context' /app/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.1.1/lib/sidekiq/middleware/server/logging.rb:7:in rufen Sie ' /app/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.1.1/lib/sidekiq/middleware/chain.rb:129:in block in invoke' /app/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.1.1/lib/sidekiq/middleware/chain.rb:132:in rufen Sie' /app/vendor/bundle /ruby/2.2.0/gems/sidekiq-4.1.1/lib/sidekiq/middleware/chain.rb:132:in invoke' /app/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.1.1/lib/sidekiq/processor.rb:128:in Block in Bearbeitung ' /app/v endor/bundle/ruby ​​/ 2.2.0/edelsteine ​​/ sidekiq-4.1.1/lib/sidekiq/prozessor.rb: 167: in stats' /app/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.1.1/lib/sidekiq/processor.rb:127:in prozess ' /app/vendor/bundle/ruby/2.2.0/gems/sidekiq- 4.1.1/lib/sidekiq/processor.rb: 79: in process_one' /app/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.1.1/lib/sidekiq/processor.rb:67:in run ' /app/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.1.1/lib/sidekiq/util.rb:16: in watchdog' /app/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.1.1/lib/sidekiq/util.rb:24:in Block in safe_thread‘

, die von diesem Code kommt:

def self.scrape_images(uri) 
    page = get_page(uri) 
    base_url = page.uri.to_s 
    images = page.search('//img') || [] 
    qualify_images(uri, images).push(base_url) 
    end 

ich sehe, dass Mechanize nicht sicher ist, Threads, ich denke, könnte mein Problem sein, aber ich sehe nicht, wie das mir geben würde, Dieser Fehler, wenn es für alles andere funktioniert. Jede Hilfe wäre herrlich und danke fürs Lesen.

+0

Ich füge die Antwort hinzu, da ich nicht einen auf SO fand, als ich suchte. Wenn Mechanize eine Seite mit dem Inhaltstyp .txt aufruft, gibt sie kein Page-Objekt zurück, sondern gibt ein File-Objekt zurück. Ich habe es mit einer Wächterklausel in meinem Fall gelöst: –

Antwort

0

Ich füge die Antwort hinzu, da ich keine SO gefunden habe, als ich gesucht habe. Wenn Mechanize eine Seite mit dem Inhaltstyp .txt aufruft, gibt sie kein Page-Objekt zurück, sondern gibt ein File-Objekt zurück. Ich löste es mit einer Wachtklausel in meinem Fall:

return [] unless page.class == Mechanize::Page 
Verwandte Themen