使用Nokogiri抓取数据
19 January, 2013
昨晚回上海时写了一个抓取数据的脚本,由于高铁上没网络,今天才得以执行。后来锦森告诉我很多成熟的spider。考虑到写的代码量太少,还是弃用了锦森的建议。目前还是亲力亲为比较好,一来锻炼思路,二来锻炼实战经验。
依赖的gem
mysql2:连接mysql open-uri:打开目标网址 nokogiri:解析网页
执行顺序
- 通过open-uri打开网页
- 转化为Nokogiri::XML对象
- 通过Xpath寻找目标信息
- 更新到数据库
Ryan在Railscast中有相关的视频剪辑,强烈推荐
遇到的问题
-
访问次数过频繁, 接口被封
使用sleep方法,一秒钟访问一次。 sleep 1
-
异常的处理
URL打不开时,重试
begin
…
rescue
retry
end -
请求超时
/Users/xiaoronglv/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/protocol.rb:146:in `rescue in rbuf_fill’: Timeout::Error (Timeout::Error)
NCBI是美国服务器,执行过程中多次出现timeout的情况,给open方法增加options,允许延迟10ms,超时报错的概率降低很多。
a = Nokogiri::XML(open(a_link, :read_timeout => 10))
Nokogiri是目前处理Html、Xml最好的Gem包,今天掌握了基本的使用方法,很满足。