scribble

吕小荣

Blog Friends RSS About

使用Nokogiri抓取数据

19 January, 2013

昨晚回上海时写了一个抓取数据的脚本,由于高铁上没网络,今天才得以执行。后来锦森告诉我很多成熟的spider。考虑到写的代码量太少,还是弃用了锦森的建议。目前还是亲力亲为比较好,一来锻炼思路,二来锻炼实战经验。

依赖的gem

mysql2:连接mysql open-uri:打开目标网址 nokogiri:解析网页

执行顺序

  1. 通过open-uri打开网页
  2. 转化为Nokogiri::XML对象
  3. 通过Xpath寻找目标信息
  4. 更新到数据库

Ryan在Railscast中有相关的视频剪辑,强烈推荐

遇到的问题

  1. 访问次数过频繁, 接口被封

    使用sleep方法,一秒钟访问一次。 sleep 1

  2. 异常的处理

    URL打不开时,重试

    begin

    rescue
    retry
    end

  3. 请求超时

    /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包,今天掌握了基本的使用方法,很满足。