轨道上的红宝石 - 使用Sidekiq和Nokogiri进行刮擦



我正在将Rails与Nokogiri一起使用。我有一些繁重的抓取任务,我想在后台使用 Sidekiq 执行。

问题是,我按照 sidekiq.org 上提到的三个步骤进行操作,但没有任何反应。我错过了什么?

接下来是我在不使用 Sidekiq 的情况下进行的一次刮擦,它工作正常,但主要问题是,像这样的几次刮擦会使页面加载非常慢。

#my controller
doc = Nokogiri::HTML(open("http://www.example.com"))
@head = {}
doc.xpath('//div[5]/h3/a').each do |link|
@head[link.text.strip] = link['href']
end
#my view
<% if @head %>
<% @head.each do |key, value| %>
<a href="<%= "#{value}" %>" target='_blank'><%= "#{key}" %></a><% end %>
<% end %>

以下是我尝试使用Sidekiq:

#my controller
class HomeController < ApplicationController
HardWorker.index_async('index', 1)
end
#my hard_worker
class HardWorker
include Sidekiq::Worker
def index
doc = Nokogiri::HTML(open("http://www.example.com"))
@head = {}
doc.xpath('//div[5]/h3/a').each do |link|
@head[link.text.strip] = link['href']
end
end
#my view
the same

如果你在 *nix 主机上,我建议运行一个单独的、非 Rails Ruby 脚本,该脚本允许与数据库通信并更新包含您需要返回给客户端的信息的摘要表。没有理由让它在 Rails 中运行,甚至没有理由加载 Rails 堆栈。

您可以使用rails runner来运行 Ruby 代码:

runner在Rails的上下文中以非交互方式运行Ruby代码。

该代码将可以访问Active Record,并且能够使用所有相同的类似Rails的配置和方法,它只是不会加载堆栈的Web端,使其更轻量级,加载速度更快。

使用 cron 定期触发单独的 Ruby 脚本,循环访问表或 YAML 文件,其中包含要处理的 URL,然后插入结果。

相关内容

  • 没有找到相关文章

最新更新