如何自己寫一個網路爬蟲

freebus發表於2020-02-27

這裡是維基百科對網路爬蟲的詞條頁面。網路爬蟲以叫網路蜘蛛,網路機器人,這是一個程式,其會自動的透過網路抓取網際網路上的網頁,這種技術一般可能用來檢查你的站點上所有的連結是否是都是有效的。當然,更為高階的技術是把網頁中的相關資料儲存下來,可以成為搜尋引擎。


從技相來說,實現抓取網頁可能並不是一件很困難的事情,困難的事情是對網頁的分析和整理,那是一件需要有輕量智慧,需要大量數學計算的程式才能做的事情。下面一個簡單的流程:

如何自己寫一個網路爬蟲




在這裡,我們只是說一下如何寫一個網頁抓取程式。


首先我們先看一下,如何使用命令列的方式來找開網頁。


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

下面是一些和網路爬蟲相關的開源網路專案


arachnode.net is a .NET crawler written in C# using SQL 2005 and Lucene and is released under the GNU General Public License.

DataparkSearch is a crawler and search engine released under the GNU General Public License.

GNU Wget is a command-line-operated crawler written in C and released under the GPL. It is typically used to mirror Web and FTP sites.

GRUB is an open source distributed search crawler that Wikia Search ( ) uses to crawl the web.

Heritrix is the Internet Archive’s archival-quality crawler, designed for archiving periodic snapshots of a large portion of the Web. It was written in Java.

ht://Dig includes a Web crawler in its indexing engine.

HTTrack uses a Web crawler to create a mirror of a web site for off-line viewing. It is written in C and released under the GPL.

ICDL Crawler is a cross-platform web crawler written in C++ and intended to crawl Web sites based on


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31365439/viewspace-2677454/,如需轉載,請註明出處,否則將追究法律責任。

相關文章