Как я могу очищать, анализировать и сканировать файлы в Ruby? - PullRequest
1 голос
/ 06 октября 2011

У меня есть несколько файлов данных для обработки из хранилища данных, которые имеют следующий формат:

:header 1 ...
:header n
# remarks 1 ...
# remarks n
# column header 1
# column header 2
DATA ROWS
(Example: "#### ## ## #####   ########  ####### ###afp##      ##e###")

Данные разделены пробелами и имеют как числа, так и другие символы ASCII.Некоторые из этих фрагментов данных будут разделены и станут более значимыми.

Все данные будут помещены в базу данных, первоначально в базу данных SQLite для разработки, а затем отправлены в другое, более постоянное хранилище.

Эти файлы фактически будут извлечены через HTTPс удаленного сервера, и мне придется немного ползти, чтобы получить некоторые из них, поскольку они охватывают папки и много файлов.

Я надеялся получить некоторую информацию о том, какие лучшие инструменты и методы могут быть использованы для достижения этой цели.«Рубиновый путь», а также чтобы абстрагироваться от этого.В противном случае я остановлюсь на этом, вероятно, так же, как в Perl или других подобных подходах, которые я использовал ранее.

Я думал о том, как использовать OpenURI, чтобы открыть каждый URL, затем, если вводэто HTML собирать ссылки для сканирования, иначе обрабатывать данные.Я бы использовал String.scan для правильного разбиения файла каждый раз на многомерный массив, разбирающий каждый компонент на основе установленного форматирования поставщиком данных.По завершении поместите данные в базу данных.Перейти к следующему входному файлу / URI.Промойте и повторите.

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

Кроме того, я буду составлять графики и визуализировать эти данные, а также генерировать отчеты, так что, возможно, это тоже следует учитывать.

Любой вклад в то, что, возможно, лучше или склоняется просто к этому?

Ответы [ 3 ]

2 голосов
/ 08 декабря 2011

Я написал, вероятно, паукообразных пауков и анализаторов сайтов и обнаружил, что в Ruby есть несколько хороших инструментов, которые должны упростить этот процесс.

OpenURI облегчает поискстраницы.

URI.extract позволяет легко находить ссылки на страницах.Из документов:

Описание

Извлекает URI из строки.Если указан блок, выполняется итерация по всем совпадающим URI.Возвращает nil, если данный блок или массив совпадают.

  require "uri"

  URI.extract("text here http://foo.example.org/bla and here mailto:test@example.com and here also.")
  # => ["http://foo.example.com/bla", "mailto:test@example.com"]

Простая, непроверенная, логика запуска может выглядеть так:

require "openuri"
require "uri"

urls_to_scan = %w[
  http://www.example.com/page1
  http://www.example.com/page2
]

loop do
  break if urls_to_scan.empty?
  url = urls_to_scan.shift
  html = open(url).read

  # you probably want to do something to make sure the URLs are not
  # pointing outside the site you're walking.
  #
  # Something like:
  # 
  #     URI.extract(html).select{ |u| u[%r{^http://www\.example\.com}i] }
  #
  new_urls = URI.extract(html)

  if (new_urls.any?)
    urls_to_scan += new_urls
  else
    ; # parse your file as data using the content in html
  end
end

Если вы не являетесь владельцем сайта, на котором вы находитесьползти, хочешь быть добрым и ласковым: не беги как можно быстрее, потому что это не твоя труба.Обратите внимание на файл robot.txt сайта или рискуете быть заблокированным.

Существуют настоящие гемы веб-сканера для Ruby, но основная задача настолько проста, что я никогда не беспокоюсь о них.Если вы хотите проверить другие альтернативы, посетите некоторые ссылки справа для других вопросов по SO, которые касаются этой темы.

Если вам нужна дополнительная сила или гибкость, Nokogiri gem быстро разбирает HTML, позволяя использовать средства доступа CSS для поиска интересующих тегов.Есть несколько довольно мощных гемов для облегчения захвата страниц, таких как typhoeus .

Наконец, в то время как ActiveRecord, который рекомендуется в некоторых комментариях, хорош, найти документацию для его использования снаружиРельсы могут быть сложными или запутанными.Я рекомендую использовать Sequel .Это отличный ORM, очень гибкий и хорошо документированный.

2 голосов
/ 21 июня 2012

Ваш вопрос сосредоточен на деталях «низкого уровня» - парсинг URL-адресов и так далее.Одним из ключевых аспектов «Рубинового пути» является «Не изобретай велосипед».Используйте существующие библиотеки.:)

Моя рекомендация?Во-первых, используйте гусеничный механизм, такой как spider или anemone .Во-вторых, используйте Nokogiri для анализа HTML / XML.В-третьих, сохраните результаты.Я рекомендую это, потому что вы могли бы позже выполнить другой анализ и не хотите отбрасывать тяжелую работу вашего паука.

Не зная слишком много о ваших ограничениях, я бы посмотрел на сохранение ваших результатов в MongoDB .Подумав об этом, я сделал быстрый поиск и нашел хороший урок Очистка блога с Anemone и MongoDB .

1 голос
/ 08 декабря 2011

Привет, я бы начал с того, что очень внимательно посмотрел на камень под названием Механизация , прежде чем запускать какие-либо базовые вещи open-uri - потому что они встроены в механизацию.Это блестящий, быстрый и простой в использовании гем для автоматизации веб-сканирования.Поскольку ваш формат данных довольно странный (по крайней мере, по сравнению с json, xml или html), я не думаю, что вы будете использовать встроенный синтаксический анализатор - но вы все равно можете взглянуть на него.он называется nokogiri и очень умный.Но, в конце концов, после обхода и извлечения ресурсов вам, вероятно, придется пойти на некоторые старые добрые вещи с регулярными выражениями.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...