虽然爬别人的页面有点不道德,但是要做项目没办法,于是花了点时间写了个爬虫。
  主要用到了Ruby的open-uri和nokogiri库,加上ruby本身很简洁,所以代码量不大。
  这段代码主要为了爬 www.techcrunch.com 上的一些新闻,因此对链接直接使用了hard code,事实上对于有一定深度的爬虫,应该也只能根据网页源码的特征来hard code。代码如下:
  #!/usr/bin/env ruby
  # parse_techcrunch.rb
  # 两个主要的库,分别用于发起http请求和解析html源码
  require 'nokogiri'
  require 'open-uri'
  # 打开连接,并解析源码
  page = Nokogiri::HTML(open("http://www.techcrunch.com"))
  # 初始化分页变量
  next_page = nil
  page.css("div.page-next a").each do |link|
  next_page = link['href']
  end
  # 计数器,用于脚本调试信息的输出
  counter = 1
  puts "Begin to grasp page contents..."
  # 迭代的循环体
  while(!next_page.nil?) do
  # 根据一页纸内的多篇新闻水平迭代
  page.css('a.more-link').each do |link|
  puts "The #{counter} page..."
  doc = Nokogiri::HTML(open(link['href']))
  title = doc.css("h1.headline").text
  puts "Get #{title}..."
  puts "Write File..."
  # 把需要的信息解析出来,写入顺序编码的html文件
  File.open("techcrunch/#{counter}.html", 'w') do |file|
  file.puts "<div class='link'><a href=\"#{link['href']}\">#{link['href']}</a></div>"
  file.puts "<div class='title'>#{title}</div>"
  abstract = doc.css(".body-copy p:first").text
  file.puts "<p class='abstract'>#{abstract.slice(0, 400)}</p>"
  end
  counter += 1
  end
  # 解析下一页的source code
  page = Nokogiri::HTML(open(next_page))
  next_page_arr = page.css("div.page-next a")
  if next_page_arr.nil?
  next_page = nil
  else
  next_page_arr.each do |link|
  next_page = link['href']
  end
  end
  # 下一次进入垂直迭代流程,直到分页变量为空,循环结束
  end
  对分页显示的新闻数据流做了两级的迭代处理,生成了一堆用东营医疗网连续ID命名的文件,方便后续用脚本parse以后生成SQL脚本直接导入数据库。
  好久没有写技术贴,欢迎交流和拍砖。