[Ruby]使用Ruby抓取网页及加工处理

并不是专业做网页抓取的爬虫的,只是之前在一个做的挺烂的网站上帮人刷票起步逐渐学习了网页抓取的工具。

最初的时候是用Python的urllib2,拿到网页当文本处理,后来才在论坛上看到有BeautifulSoap这种级别的神器,Python处理起这种来实在是方便,可惜后来我遇到了Ruby及Rails,从此移情别恋,乃至读了Metaprogramming Ruby后更是喜欢的不要不要的。

最近工作压力不大,闲来无事便想抓取一下股市的一些数据。首先遇到的一个问题便是从哪里拿到上市和深市所有的股票代码,即便网上有现成的列表我也想着用程序抓取加工一下才显得牛逼,所以我找到了这个网页:http://quote.eastmoney.com/stocklist.html

看完之后就觉得其实代码并不复杂,只是第一次用Ruby来抓取网页不熟悉,不知道用什么工具以及怎么用而已,经过一番搜索要用到open-uri及Nokogiri。

首先来看一下open-uri,这个是Ruby内建的功能。要想使用open-uri只需要在代码中加入require 'open-uri'即可,使用起来也很简单。

1 open("http://www.ruby-lang.org/en") {|f|
2     f.each_line {|line| p line}
3     p f.base_uri         # <URI::HTTP:0x40e6ef2 URL:http://www.ruby-lang.org/en/>
4     p f.content_type     # "text/html"
5     p f.charset          # "iso-8859-1"
6     p f.content_encoding # []
7     p f.last_modified    # Thu Dec 05 02:45:02 UTC 2002
8 }

open函数提供的文件对象经过了扩展,混入了一些网页的元信息。

打开网页的时候也可以带入User-Agent等选项,用起来也很方便,如下即可

1 open("http://www.ruby-lang.org/en/",
2     "User-Agent" => "Ruby/#{RUBY_VERSION}",
3     "From" => "foo@bar.invalid",
4     "Referer" => "http://www.ruby-lang.org/") {|f|
5     # ...
6 }

Nokogiri是一个gem,据说在此之前还有另一个工具Hpricot,只是简单了解了一下,并不赘述。

首先是Nokogiri读取网页内容,可以用两个方法:

doc = Nokogiri::HTML(open(url)),用这个方法如果有字符集的问题,则可以使用doc = Nokogiri::HTML.parse(open(url), nil, "gb2312")来指定字符集。

其次是定位网页元素,Nokogiri支持XPATH也支持CSS查找。简单介绍几种通过CSS定位的方法:

doc.css('a') 返回网页所有的a标签元素

doc.css('.myclass div ul') 返回所有css样式为myclass下的div的ul标签元素

doc.css('div#main') 返回id为main的div标签元素

上面的内容基本能解决90%的需求了,如果真的用起来还需要问Google老师。