#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