it-swarm-ru.tech

Каковы хорошие веб-сканеры на основе Ruby?

Я пытаюсь написать свою собственную, но мне интересно, есть ли какие-нибудь хорошие веб-сканеры, написанные на Ruby.

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

20
Jordan Dea-Mattson

Я создаю wombat, Ruby DSL для сканирования веб-страниц и извлечения контента. Проверьте это на github https://github.com/felipecsl/wombat

Он все еще находится на ранней стадии, но уже функционален с базовой функциональностью. Другие вещи будут добавлены очень скоро.

19
Felipe Lima

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

В Ruby есть несколько отличных драгоценных камней, чтобы упростить это:

  • Nokogiri мой выбор №1 для парсера HTML. Раньше я использовал Hpricot, но нашел несколько сайтов, которые заставили его взорваться в огне. После этого я переключился на Нокогири и был очень доволен этим. Я регулярно использую его для разбора HTML, RDF/RSS/Atom и XML. Ox тоже выглядит интересно, так что это может быть другим кандидатом, хотя я нахожу, что поиск в DOM намного проще, чем пытаться пройти через большой хеш, такой как то, что возвращает Ox.
  • OpenURI хорош в качестве простого HTTP-клиента, но он может помешать, если вы хотите сделать более сложные вещи или вам нужно запустить несколько запросов одновременно. Я бы порекомендовал посмотреть HTTPClient или Typhoeus with Hydra для скромных и тяжеловесных работ. Curb тоже хорошо, потому что он использует библиотеку cURL, но интерфейс для меня не такой интуитивно понятный. Хотя стоит посмотреть. HTTPclient тоже стоит посмотреть, но я склоняюсь к ранее упомянутым.

    Примечание: OpenURI имеет некоторые недостатки и уязвимости, которые могут повлиять на ничего не подозревающих программистов, поэтому он несколько потерял популярность. RestClient очень достойный преемник.

  • Вам понадобится резервная база данных и способ поговорить с ней. Это не задача для Rails per se, но вы можете использовать ActiveRecord, отсоединенный от Rails, для общения с базой данных , Я сделал это пару раз, и все работает хорошо. Вместо этого мне действительно нравится продолжение для моей ORM. Он очень гибок в том, как позволяет вам общаться с базой данных, от использования простого SQL до использования способности Sequel для программного создания запросов, моделирования базы данных и использования миграций. Создав базу данных, вы можете использовать Rails, чтобы выступать в качестве внешнего интерфейса для данных.
  • Если вы собираетесь перемещаться по сайтам каким-либо образом, помимо простого захвата страниц и перехода по ссылкам, вам нужно взглянуть на Механизация . Это позволяет легко заполнять формы и отправлять страницы. В качестве дополнительного бонуса вы можете получить содержимое страницы в виде HTML-документа Nokogiri и проанализировать, используя множество хитростей Nokogiri.
  • Для массирования/перенаправления URL мне действительно нравится Addressable :: URI . Это более полнофункциональный, чем встроенный модуль URI. Хорошая вещь, которую делает URI, - это метод RI # extract для сканирования строки на предмет URL-адресов. Если эта строка окажется телом веб-страницы, это будет альтернативный способ поиска ссылок, но ее недостатком является то, что вы также получите ссылки на изображения, видео, рекламу и т.д., И вам придется отфильтровать их. Возможно, это приведет к большему количеству работы, чем при использовании парсера и поиске исключительно тегов <a>. В этом отношении Mechanize также имеет метод links , который возвращает все ссылки на странице, но вам все равно придется отфильтровать их, чтобы определить, хотите ли вы следовать или игнорировать их.
  • Если вы считаете, что вам нужно иметь дело со страницами, управляемыми Javascript, или страницами, которые динамически получают свое содержимое из AJAX, вам следует использовать один из вариантов WATIR . Существуют варианты для разных браузеров в разных ОС, таких как Firewatir, Safariwatir и Operawatir, так что вам придется выяснить, что работает для вас.
  • Вы НЕ хотите полагаться на то, чтобы сохранить в памяти список URL-адресов для посещения или посещенных URL-адресов. Разработайте схему базы данных и сохраните эту информацию там. Потратьте некоторое время на предварительное проектирование схемы, думая о том, что вы хотите знать, собирая ссылки на сайте. SQLite3, MySQL и Postgres являются отличным выбором, в зависимости от того, насколько большой, по вашему мнению, будут потребности вашей базы данных. Один из моих анализаторов сайта был специально разработан, чтобы помочь нам рекомендовать изменения SEO для компании из списка Fortune 50. Он работал более трех недель, охватывая около двадцати различных сайтов, прежде чем у нас было достаточно данных и остановил их. Представьте, что произошло бы, если бы у нас было отключение питания, и все эти данные были помещены в корзину.

После всего, что вы захотите, чтобы ваш код также знал о правильном этикете: Каковы основные соображения при создании веб-сканера?

68
the Tin Man

Итак, вы хотите хороший Ruby-ориентированный веб-сканер ?

Попробуйте паук или анемон . Оба имеют твердое использование в соответствии с количеством загрузок RubyGems.

Пока что другие ответы подробные и полезны , но они не сфокусированы на вопросе как лазер, который запрашивает Ruby библиотеки для веб-сканеров . Казалось бы, это различие может запутаться: см. мой ответ на "Сканирование против веб-скребинга?"

5
David J.

Всеобъемлющий Жестяный человечек список - это хорошо, но частично устарело для меня.

Большинство сайтов, с которыми работают мои клиенты, сильно зависят от AJAX/Javascript. Я использую Watir/watir-webdriver/Selenium и в течение нескольких лет, но накладные расходы, связанные с необходимостью загрузки скрытого веб-браузера на бэкэнд для рендеринга этого материала DOM, просто нецелесообразны, не говоря уже о том, что все это время они до сих пор не реализовали полезное "повторное использование сеанса браузера", чтобы позволить новому коду повторно использовать старый браузер в памяти для этой цели, отбрасывая тикеты, которые в конечном итоге могли бы пробиться вверх по уровням API. (ссылка на https://code.google.com/p/Selenium/issues/detail?id=18 ) **

https://rubygems.org/gems/phantomjs

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

** Альтернативные подходы также не удавались:

1
Marcos

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

Если вы хотите написать свое, то пишите свое. Сканер не совсем сложный процесс, он состоит из:

  1. Загрузка сайта.
  2. Нахождение URL-адресов на этом веб-сайте, отфильтрованные, как бы вы ни старались, пожалуйста.
  3. Для каждого URL на этом сайте повторите шаг 1.

О, и это, кажется, дубликат " веб-сканер в Ruby ".

0
Arafangion