自己写一个网络爬虫蜘蛛程序 28 April 2010 22:33 Wednesday by 小屋 分享收藏

 

这里是维基百科对网络 爬虫的词条页面网络 爬虫以叫网络 蜘蛛网络 机器人,这是一个程序 ,其会自动的通过网络 抓取 互联网 上的网页 ,这种技术 一般可能用来检查你的站点上所有的链接是否是都是有效的。当然,更为高级的技术 是把网页 中的相关数据 保存下来,可以成为搜索引 擎。

从技相来说,实现抓取 网页 可能并不是一件很困难的事情 ,困难的事情 是对网页 的分析和整理 ,那是一件需要有轻量智能,需要大量数学计算的程序 才能做的事情 。下面一个简单的流程:


在这里,我们只是说一下如何写一个网页 抓取 程序

首先我们先看一下,如何使用 命令 行的方式 来找开网页

telnet somesite.com 80
GET /index.html HTTP/1.0
按回车两次

使用 telnet就是告诉你其实这是一个socket的技术 ,并且使用 HTTP的协议,如GET方法获得 网页 ,当然,接下来的事你就需要解析HTML文法,甚至还需要解析Javascript,因为现在的网页 使用 Ajax的越来越 了,而很 网页 内容 都是通过Ajax技术 加载 的,因为,只是简单地解析HTML文件 在未来会远远不够。当然,在这里,只是展示一个非常简单的抓取 ,简单到只能做为一个例子,下面这个示例 的伪代码

网页


for each 链接 in 当前网页

所有的链接
{
        if(如果本链接是我们想要的 || 这个链接从未访问过)
        {
                处理对本链接
                把本链接设置

为已访问
        }
}

require “rubygems”
require “mechanize”

class Crawler < WWW::Mechanize

  attr_accessor :callback
  INDEX = 0
  DOWNLOAD = 1
  PASS = 2

  def initialize
    super
    init
    @first = true
    self.user_agent_alias = “Windows IE 6″
  end

  def init
    @visited = []
  end

  def remember(link)
    @visited << link
  end

  def perform_index(link)
    self.get(link)
    if(self.page.class.to_s == “WWW::Mechanize::Page”)
      links = self.page.links.map {|link| link.href } - @visited
      links.each do |alink|
        start(alink)
      end
    end
  end

  def start(link)
    return if link.nil?
    if(!@visited.include?(link))
      action = @callback.call(link)
      if(@first)
        @first = false
        perform_index(link)
      end
      case action
        when INDEX
          perform_index(link)
        when DOWNLOAD
          self.get(link).save_as(File.basename(link))
        when PASS
          puts “passing on #{link}”
      end
    end
  end

  def get(site)
    begin
      puts “getting #{site}”
      @visited << site
      super(site)
    rescue
      puts “error getting #{site}”
    end
  end
end

上面的代码 就不必 说了,大家可以去试试。下面是如何使用 上面的代码

require “crawler”

x = Crawler.new
callback = lambda do |link|
  if(link =~/\\.(zip|rar|gz|pdf|doc)
    x.remember(link)
    return Crawler::PASS
  elsif(link =~/\\.(jpg|jpeg)/)
    return Crawler::DOWNLOAD
  end
  return Crawler::INDEX;
end

x.callback = callback
x.start(”http://somesite.com”)

下面是一些和网络 爬虫相关的开源网络 项目

作者: Sjolzy

--EOF--

引用地址:

相关评论:

  1. gravatar face
    hehe 4 月 30 日 对 “自己写一个网络爬虫蜘蛛程序” 发表最新评论。
    这篇文章是你的个人原创吗?示例代码是什么语言写的?

    这篇文章是你的个人原创吗?示例代码是什么语言写的?

      评分:5

  2. 1
    hehe :

    这篇文章是你的个人原创吗?示例代码是什么语言写的?

    博主回复:代码不是我写的啦,实例代码是Ruby,借鉴一下思想

发表评论:

  给 “自己写一个网络爬虫蜘蛛程序” 评分

广告、无意义的评论必删!