使用 Sidekiq 和 Nokogiri 进行抓取

Using Sidekiq with Nokogiri for scraping

我正在使用 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 主机上,我建议 运行ning 一个单独的、非 Rails Ruby 脚本,允许与数据库对话,并且更新包含您需要 return 给客户的信息的摘要 table。没有理由将它 运行 放在 Rails 中,甚至加载 Rails 堆栈。

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

runner runs Ruby code in the context of Rails non-interactively.

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

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