Как запретить Anemone хранить определенную информацию?

#ruby #mongodb #web-scraping #web-crawler

#ruby #mongodb #очистка веб-страниц #веб-сканер

Вопрос:

Я использую Anemone для создания некоторых веб-пауков. Я сохраняю результаты объединения в паутину в MongoDB. Anemone позволяет очень легко сделать это с:

   Anemone.crawl("http://www.example.com/") do |anemone|
    anemone.storage = Anemone::Storage.MongoDB
  end
  

как указано здесь.

Однако, используя приведенный выше код, Anemone собирает и хранит много информации, которая мне не нужна, включая ответы каждой страницы. Мне нужно хранить только URL-адреса. И, несмотря на то, что я потратил время на документацию, я не могу понять, как сказать Anemone не хранить определенные фрагменты информации.

Кто-нибудь может посоветовать?

Комментарии:

1. Раздел «Как мне это использовать?» на главной странице проекта rubyforge , похоже, движется в правильном направлении для ваших нужд.

Ответ №1:

Вам нужно настроить класс Page таким образом, чтобы он не хранил дополнительные данные. Итак, что-то вроде:

 module Anemone
  class Page
    def to_hash
      {'url' => @url.to_s,
       'links' => links.map(amp;:to_s),
       'code' => @code,
       'visited' => @visited,
       'depth' => @depth,
       'referer' => @referer.to_s,
       'fetched' => @fetched}
    end
    def self.from_hash(hash)
      page = self.new(URI(hash['url']))
      {'@links' => hash['links'].map { |link| URI(link) },
       '@code' => hash['code'].to_i,
       '@visited' => hash['visited'],
       '@depth' => hash['depth'].to_i,
       '@referer' => hash['referer'],
       '@fetched' => hash['fetched']
      }.each do |var, value|
        page.instance_variable_set(var, value)
      end
      page
    end
  end
end
Anemone.crawl("http://www.example.com/") do |anemone|
  anemone.storage = Anemone::Storage.MongoDB
end
  

Прошло некоторое время с тех пор, как я просматривал внутренние компоненты, но, если я правильно помню, страница должна содержать ссылки, глубину, извлеченные и некоторые другие метаданные, чтобы он знал, что он уже обошел и что ему осталось сделать.

Надеюсь, это поможет.

Ответ №2:

В Rails 3.0.10 с ruby 1.9.2 кажется, вам нужно использовать инициализатор.

config/инициализаторы/anemone.rb

 Anemone::Page.module_eval do
  def to_hash
    {'url' => @url.to_s,
     'links' => links.map(amp;:to_s),
     'code' => @code,
     'visited' => @visited,
     'depth' => @depth,
     'referer' => @referer.to_s,
     'redirect_to' => @redirect_to.to_s,
     'response_time' => @response_time,
     'fetched' => @fetched}
  end

  def self.from_hash(hash)
    page = self.new(URI(hash['url']))
    {'@links' => hash['links'].map { |link| URI(link) },
     '@visited' => hash['visited'],
     '@code' => hash['code'].to_i,
     '@depth' => hash['depth'].to_i,
     '@referer' => hash['referer'],
     '@redirect_to' => URI(hash['redirect_to']),
     '@response_time' => hash['response_time'].to_i,
     '@fetched' => hash['fetched']
    }.each do |var, value|
      page.instance_variable_set(var, value)
    end
    page
  end
end