首页 > Web开发, 编程语言 > 如何自己写一个网络爬虫

如何自己写一个网络爬虫

2009年3月2日 发表评论 阅读评论 18,289 人阅读    

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

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

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

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

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”)

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





分类: Web开发, 编程语言 标签: ,
好烂啊有点差凑合看看还不错很精彩 (13 人打了分,平均分: 4.08 )
Loading ... Loading ...
  1. 2009年5月1日00:30 | #1

    网络爬虫程序不简单哦

  2. w水
    2009年5月27日17:01 | #2

    是Ruby?

  3. 2009年7月17日16:24 | #3

    当前比较流行的是定题爬虫,专门提取特定语义的内容,用于建立垂直搜索、情报采集等等,此类爬虫可以剔除不相关的内容,而且一般将提取到的内容存成有结构的格式,例如,存入关系数据库、存成XML文件、CSV或者EXCEL文件等等。

    MetaSeeker工具包就是这样的爬虫,客户端软件99%的代码用Javascript写成,可以读源代码,由于运行在Mozilla平台上,借用了强大的Mozilla平台功能,几乎可以实现任何网页内容的提取,例如,其它工具难于处理的AJAX网站内容。

    软件下载地址:http://www.gooseeker.com

  4. childz
    2009年12月30日13:18 | #4

    我是来学习的:)

  5. lu
    2010年1月25日11:24 | #5

    不错

  6. 小波
    2010年12月24日17:59 | #6

    佩服厉害的人物

  7. 2011年2月23日09:48 | #7

    ..爬虫很有技术含量哦~!

  8. 2011年4月19日12:23 | #8

    为了自己用写了一个在线漫画下载器,典型的HTTP蜘蛛~还好这些网站的页面都很简单,最复杂的也就是javascript的eval-packet压缩。

  9. 大家帮助大家
    2011年4月19日14:42 | #9

    为了自己用写了一个在线图片下载器,典型的HTTP蜘蛛~还好这些网站的页面都很简单,(最复杂的也就是javascript的eval-packet压缩)这个我都没涉及到。就是shell + perl + flashget就搞定了。

  10. hellow
    2011年4月28日17:25 | #10

    可是如果大量的固定的去讀取網路的資料,流量上會容易引起別人注意,而且聽說是違法的??
    以後也不必自己更新內容了,直接從各網站截取資料就好了。

  11. 2011年8月14日10:44 | #11

    很牛!!

  1. 2011年9月14日15:05 | #1

无觅相关文章插件,快速提升流量