Подтвердить что ты не робот

Как написать веб-скребок в Ruby?

Я хотел бы просканировать популярный сайт (скажем, Quora), который не имеет API и получить определенную информацию и выгрузить его в файл - скажем, csv,.txt или .html отлично отформатирован:)

например. возвратите только список всех "Биосов" пользователей Quora, которые, в своей общедоступной информации, указали в "дизайнере UX".

Как мне сделать это в Ruby?

У меня достаточно умеренный уровень понимания того, как работают Ruby и Rails. Я только что закончил приложение Rails - в основном все написано мной. Но я не гуру ни в какой степени воображения.

Я понимаю RegExs и т.д.

4b9b3361

Ответ 1

Лучше всего использовать Mechanize. Он может следить за ссылками, отправлять формы, что угодно, веб-клиент, Кстати, не используйте регулярные выражения для анализа HTML. Используйте парсер HTML.

Ответ 2

Если вы хотите что-то более высокое, попробуйте wombat, который является этим камнем, который я построил на вершине Mechanize и Nokogiri. Он способен анализировать страницы и следовать ссылкам, используя действительно простой и высокий уровень DSL.

Ответ 3

Я знаю, что ответ был принят, но Hpricot также очень популярен для разбора HTML.

Все, что вам нужно сделать, это взглянуть на источник html страниц и попытаться найти выражение XPath или CSS, которое соответствует нужным элементам, а затем использовать что-то вроде:

doc.search("//p[@class='posted']")

Ответ 4

Механизация - это потрясающе. Если вы хотите узнать что-то новое, вы можете взглянуть на Scrubyt: https://github.com/scrubber/scrubyt. Похоже, Mechanize + Hpricot. Я никогда не использовал его, но это кажется интересным.

Ответ 5

Nokogiri отлично, но я нахожу выход бесполезным для работы. Я написал рубиновый камень, чтобы легко создавать классы вне HTML: https://github.com/jassa/hyper_api

Драйвер HyperAPI использует Nokogiri для анализа HTML с помощью селекторов CSS.

например.

Post = HyperAPI.new_class do
  string title: 'div#title'
  string body: 'div#body'
  string author: '#details .author'
  integer comments_count: '#extra .comment' do
    size
  end
end
# => Post

post = Post.new(html_string)
# => #<Post title: 'Hi there!', body: 'This blog post will talk about...', author: 'Bob', comments_count: 74>