如何在Ruby中编写Web scraper?

时间:2011-05-10 08:12:52

标签: ruby web-scraping

我想抓取一个没有API的热门网站(比如Quora)并获取一些特定信息并将其转储到文件中 - 比如csv,.txt或.html很好地格式化:)< / p>

E.g。仅返回Quora用户的所有“Bios”列表,这些用户在其公开信息中列出了职业“用户体验设计师”。

我如何在Ruby中做到这一点?

我对Ruby&amp; Rails工作。我刚刚完成了一个Rails应用程序 - 主要是我自己编写的。但是,无论想象力如何,我都不是大师。

我理解RegExs等。

5 个答案:

答案 0 :(得分:21)

您最好的选择是使用Mechanize。它可以跟随链接,提交表单,您需要的任何内容,Web客户端。顺便说一句,不要使用正则表达式来解析HTML。使用HTML解析器。

答案 1 :(得分:7)

如果你想要更高级别的东西,试试wombat,这是我在Mechanize和Nokogiri之上建立的宝石。它能够使用非常简单和高级别的DSL解析页面并关注链接。

答案 2 :(得分:6)

我知道答案已被接受,但Hpricot在解析HTML方面也很受欢迎。

您所要做的就是查看页面的html源代码并尝试查找与所需元素匹配的XPath或CSS表达式,然后使用类似的内容:

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

答案 3 :(得分:2)

机械化非常棒。如果你想学习新的东西,你可以看看Scrubyt:https://github.com/scrubber/scrubyt。它看起来像Mechanize + Hpricot。我从未使用它,但它看起来很有趣。

答案 4 :(得分:1)

Nokogiri很棒,但我觉得输出很麻烦。我写了一个ruby gem来轻松地创建HTML类:https://github.com/jassa/hyper_api

HyperAPI gem使用Nokogiri通过CSS选择器解析HTML。

E.g。

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>