這里是維基百科對網(wǎng)絡(luò)爬蟲的詞條頁面。網(wǎng)絡(luò)爬蟲以叫網(wǎng)絡(luò)蜘蛛,網(wǎng)絡(luò)機(jī)器人,這是一個(gè)程序,其會自動(dòng)的通過網(wǎng)絡(luò)抓取互聯(lián)網(wǎng)上的網(wǎng)頁,這種技術(shù)一般可能用來檢查你的站點(diǎn)上所有的鏈接是否是都是有效的。當(dāng)然,更為高級的技術(shù)是把網(wǎng)頁中的相關(guān)數(shù)據(jù)保存下來,可以成為搜索引擎。
從技相來說,實(shí)現(xiàn)抓取網(wǎng)頁可能并不是一件很困難的事情,困難的事情是對網(wǎng)頁的分析和整理,那是一件需要有輕量智能,需要大量數(shù)學(xué)計(jì)算的程序才能做的事情。下面一個(gè)簡單的流程:
在這里,我們只是說一下如何寫一個(gè)網(wǎng)頁抓取程序。
首先我們先看一下,如何使用命令行的方式來找開網(wǎng)頁。
telnet somesite.com 80
GET /index.html HTTP/1.0
按回車兩次
使用telnet就是告訴你其實(shí)這是一個(gè)socket的技術(shù),并且使用HTTP的協(xié)議,如 GET方法來獲得網(wǎng)頁,當(dāng)然,接下來的事你就需要解析HTML文法,甚至還需要解析Javascript,因?yàn)楝F(xiàn)在的網(wǎng)頁使用Ajax的越來越多了,而很多網(wǎng)頁內(nèi)容都是通過Ajax技術(shù)加載的,因?yàn)椋皇呛唵蔚亟馕鯤TML文件在未來會遠(yuǎn)遠(yuǎn)不夠。當(dāng)然,在這里,只是展示一個(gè)非常簡單的抓取,簡單到只能做為一個(gè)例子,下面這個(gè)示例的偽代碼:
取網(wǎng)頁
for each 鏈接 in 當(dāng)前網(wǎng)頁所有的鏈接
{
if(如果本鏈接是我們想要的 || 這個(gè)鏈接從未訪問過)
{
處理對本鏈接
把本鏈接設(shè)置為已訪問
}
}
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”)
下面是一些和網(wǎng)絡(luò)爬蟲相關(guān)的開源網(wǎng)絡(luò)項(xiàng)目
from:
http://coolshell.cn/?p=27
posted on 2010-02-18 21:54
chatler 閱讀(702)
評論(0) 編輯 收藏 引用 所屬分類:
SearchEngine