歡迎您光臨本站 註冊首頁

網路蜘蛛(網路機器人)的秘密

←手機掃碼閱讀     火星人 @ 2014-03-04 , reply:0

網路蜘蛛(網路機器人)的秘密

網路蜘蛛(網路機器人)的秘密

  經常去雅虎、搜狐等網站搜索信息的讀者一定有這樣的疑問:如此龐大的網頁信息,到底是如何被這些網站所收集到的呢?難道都是人工登記並整理的嗎?當然不是。這些搜索引擎能夠快速地找到如此之多的信息,和網路蜘蛛的應用是分不開的。

  網路蜘蛛可以算得上是為Internet而開發的最有用處的工具之一。時至今日,要想從以千萬計的各不相同 的站點中獲取信息,舍網路蜘蛛之外,焉有他哉?

  一個典型的網路蜘蛛(例如雅虎)工作的方式,是查看一個頁面,並從中找到相關信息, 然後它再 從該頁面的所有鏈接中出發,繼續尋找相關的信息。以此類推,直至窮盡。很快地,就可以在資料庫中獲得成 千上萬的頁面和信息。這樣的工作方式就如同一張向外發散的蜘蛛網,這正是「網路蜘蛛」這個名稱的由來。

  接下來讓我們看看如何建立一個網路蜘蛛。在此之前,我們先要了解幾個概念。

一、基本原理

  我們可以用網路蜘蛛搜尋很多東西。事實上,現在有一些特別用途的商用網路蜘蛛,這些軟體為它們的開 發者賺取了大把的鈔票,比如Altavista科技的一份許可證,就價值30萬美元。以下是一個網路蜘蛛的基礎原理:

  * 從各個消息來源收集信息

  從技術角度講,一個網路蜘蛛應該可以不受限制地從任意來源獲取信息。來源多多益善。

  * 準確度

  不管是誰,遇見這樣的事情肯定都會崩潰——搜索引擎向你返回了一百萬個結果,可是,只有最後兩個是 你需要的(這還算好的,如果是中間的兩個呢?)。所以好的網路蜘蛛對其返回的結果應該有足夠的準確度, 而且在有些情況下,還要有特定的功能,也就是說,只返回特定類型的信息——比如www.enfused.com的專為 搜索遊戲設計的網路蜘蛛,就只返回與遊戲相關的東西。

  * 相對更新

  這依賴於你所使用的技術(下面我們會專門提到),網路蜘蛛應該找回更新后的信息,或者至少是比較新 的信息。如果網路蜘蛛總是找回一些幾年前的陳芝麻爛穀子,那你一定會比系統先一步崩潰。

  * 相對快速

  這就不用多說了,如果沒有足夠的速度,那你的網路蜘蛛再怎麼準確,也是白搭。


二、基本技術

  有好幾種方法可以構建網路蜘蛛。第一種,稱之為常規網路蜘蛛,只是簡單地進行頁面尋找,搜索並獲得 你想要的東西。例如,用一個短語作為關鍵詞進行搜索。第二種,特殊網路蜘蛛,只尋找頁面的特定部分。這 種網路蜘蛛在某些特定場合很有用(比如,你只想獲得某一個站點內的新聞標題)。

  常規網路蜘蛛是兩者中相對簡單的一種。首先,你不需要預先知道目標頁面的情況。只需要在該頁面中, 以及在與其鏈接的頁面中,尋找你要的關鍵詞就可以了。你還可以在功能中設定,忽略掉那些在同一站點下的 鏈接,從而保證每一個結果都來源於不同的站點。

  與之相對應,一個特定的網路蜘蛛通常要求你預先知道一些目標頁面的情況,例如表格規劃等。舉個例子 ,如果你搜尋的是一個頁面中的新聞標題,你應該先知道限定此標題的HTML標記。如此你才可以直接搜索頁面 中正確的部分。在這種情況下,是否具備搜索該頁面的所有鏈接的功能顯得不是特別重要,因為你的網路蜘蛛 很可能在別的頁面中無法找到標記,不能進行工作。

  運行網路蜘蛛的時間也有所不同:你可以預先運行,也可以實時運行。預先運行意味著當你的網路蜘蛛運 行時,所有搜集到的信息都存貯在一個資料庫中,以備以後使用。很明顯,如此你將不會獲得最新的數據,但 是如果你經常運行網路蜘蛛,這個問題也不會有什麼大礙。

  實時運行意味著你每次運行網路蜘蛛所獲得的信息都不會被保存下來,你只能現找現用。例如,如果你在 站點設置了搜索功能,在實時狀態下使用網路蜘蛛,則無論何時,只要有用戶輸入一個關鍵詞並點下「發送」 按鈕,你的網路蜘蛛就將運行,而不是僅僅訪問資料庫。儘管這可以保證你的數據總是最新的,但是卻不是大 多數站點的首選,因為網路蜘蛛本身運行和返回數據都需要時間——而時間就是金錢呀!當然,所查找的資料 具有高度時間敏感性的時候例外。


三、構建網路蜘蛛

  那麼如何構建網路蜘蛛呢?答案是:Internet transfer control (ITC)。這個由微軟提供的控制項,將使你能夠通過ASP程序訪問Internet資源。你可以用ITC搜尋Web頁面,訪問FTP伺服器,甚 至可以發送郵件標題。在本文里,我們將著重討論搜尋Web頁面的功能。

  有幾個缺陷必須先說明一下。第一,ASP無權訪問Windows的註冊表,這就使某些ITC正常存儲的常量和數 值不可用。通常你可以通過設置ITC為「不使用默認值」來解決這個問題,這就需要你在運行過程中指明每一 次的值。

  另一個更嚴重的問題是關於許可證書的。由於ASP不具備調用License Manager(一項Windows中的功 能,可以保證組件和控制項的合法使用)的功能,那麼當License Manager檢查當前組件的密鑰密碼,並將 其與Windows註冊表進行比較后,如果發現它們不同,該組件將不會工作。因此,當你想把ITC配置到另一台沒 有所需密鑰的計算機上時,將導致ITC崩潰。解決的辦法之一是將ITC捆綁到另一個VB組件中,由VB組件複製 ITC的路徑和工具,從而進行配置。這項工作很麻煩,但不幸的是,它是必不可少的。

  下面是一些例子:

  你可以用下面的編碼建立ITC:

set Inet1 = CreateObject("InetCtls.Inet")
Inet1.protocol = 4 'HTTP
Inet1.accesstype = 1 'Direct connection to internet
Inet1.requesttimeout = 60'in seconds
Inet1.URL = strURL
trHTML = Inet1.OpenURL'grab HTML page

  現在strHTML保存著strURL指向的整個頁面的HTML內容。要建立一個常規網路蜘蛛,你現在只需要調用 instr() 功能來看看你尋找的串是否在當前位置即可。你也可以按照href標記尋找,解析當前的 URL,然後把它設置到Internet 控制項的屬性中去,接著再繼續打開另一個頁面。用來查看所有鏈接的最 好方法是使用遞歸。

  要注意的是,儘管這種方法很易於實行,卻不是非常準確和強大。今天的許多搜索引擎都可以進行額外的 邏輯檢查,例如計算一個頁面中某一短語重複的次數,相關字詞的近似程度等,有些甚至可以用來判斷所搜尋 的語段與上下文的關係。這些功能將留待我們的讀者們自己去摸索。


四、特定網路蜘蛛

  相對的,一個特定網路蜘蛛要複雜一些。如我們早先提到的,一個特定網路蜘蛛會搜尋一個頁面的特定部 分,因而要求預先知道該部分相關的情況。讓我們先看看下面的HTML:

   <HTML>;<HEAD>;<TITLE>;My News Page</TITLE>;<META Name=&quo t;keywords" Content="News, headlines">;<META Name="descr iption" Content="The current news headlines.">;</HEAD>; ;<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#FF3300 "VLINK="#CC0000" ALINK="#0000FF">;<p>;<h3>;Headlines&l t;/h3>;</p>;<!--put headlines here-->;<a href="/news/8094.asp ">;Stocks prices fall</a>;<a href="/news/8095.asp">;Ne w movies today</a>;<a href="/news/8096.asp">;Bush and&nb sp;Gore to debate tonight</a>;<a href="/news/8097.asp">; Fall TV lineup</a>;<!--end headlines-->;</BODY>;</HTML>;


  在這個頁面內,我們只關心位於「put headlines here」和 「end headlines」這 兩個標記之間的東西。你可以構建一個只返回該區域查找結果的功能設置:

Function GetText(strText, strStartTag, strEndTag)
dim intStart
intStart = instr(1, strText, strStartTag, vbtextcompare)
if intStart then
intStart = intStart + len(strStartTag)
intEnd = InStr(intStart + 1, strText, strEndTag, vbtextcompar e)
GetText = Mid(strText, intStart + 1, intEnd - intStart&n bsp;- 1)
else
GetText = " "
end if
End Function

  按照上面構建ITC控制項的例子,你可以很容易地將strHTML中的「 <!--put headlines here-->;」和 「<!--end headlines-->;」作為參數傳 送到GetText中。

  要注意,用於開始和結束的標記都不一定要是實際的HTML專用標記——它們可以是你想使用的任何文本界 定符。在通常情況下,你不容易找到好的HTML標記來界定搜尋區域。你只能使用比較方便稱手的標記——例如 ,你的首尾標記可以分別如下:

 strStartTag = "/td>;<td>;<font face="arial" size=&q uot;2">;<p>;<b>;<u>;"
 strEndTag = "<p>;</td>;</tr>;<tr>;<td>;<o:ums>;&quo t;

  一定要確定搜索的是HTML頁中比較獨特的標識,這樣你才可以準確地獲得你需要的東西。你也可以按照你 所返回的文本部分中的鏈接進行搜尋,不過如果你不知道那些頁面的格式,你的網路蜘蛛將無功而返。


五、保存信息

  在大多數情況下,你會要求將收集到的信息保存在一個資料庫中,以備以後使用。你的需求也許包括很廣 泛的內容,但是在此之前,你要記住以下幾件事:

  在你的資料庫中查找最新信息

  如果你經常使用網路蜘蛛去查找一個站點內的新聞標題,你要先確定比較新的標題已經存在於資料庫內。 然後將其與網路蜘蛛返回的結果相比較,只添加更新過的部分。這樣可以防止你保存一大堆重複數據。

  更新信息

  也許你根本就不想從外部向資料庫中添加新信息。比如,如果你維護的是一個美國各州人口的網上索引, 你只需要在資料庫內部更新——你將不需要在表格內插入新的信息。

  保存所需信息
如果你在查找標題,要確定你也同時查找了該標題指向的鏈接,並將其保存下來。如果沒有鏈接,你 也應該建立一個。例如,如果我從www.yoursite.com查找標題,並在www.mysite .com演示,而該標題與一篇在站點之外的文章有鏈接,那麼我必須先保存http://www.you rsite.com這一鏈接,然後再保存其它鏈接到資料庫內,這些鏈接才可以正常訪問。


  六、結論
  我們已經簡要介紹了如何構建一個比較完整的網路蜘蛛。所有的基本功能都已涉及。現在你需要做的就是 再在裡面加上你自己的東西。

  這一類功能將被應用在一個COM對象或者一個獨立的應用軟體內。在ASP中設置這項功能非常方便, 但是你應該將你的編碼移到另外的地方,以提高速度和安全性。而且這樣也可以令其更容易被打包和傳送。

[附註:本文中使用的是ASP,當然可以轉換為其他語言的,提供給大家關鍵是一種思路和方法。]
《解決方案》

網路蜘蛛(網路機器人)的秘密

UP

支持
《解決方案》

網路蜘蛛(網路機器人)的秘密

收!
謝!
《解決方案》

網路蜘蛛(網路機器人)的秘密

ding
《解決方案》

網路蜘蛛(網路機器人)的秘密

了解,謝謝了…
《解決方案》

這樣的工作方式就如同一張向外發散的蜘蛛網
《解決方案》

2003;P;P;P;P;P;P
我用SNOPPY偽造假IP採集:lol
《解決方案》

強悍,學習了。。。。
《解決方案》

2003,我勒個去

[火星人 ] 網路蜘蛛(網路機器人)的秘密已經有971次圍觀

http://coctec.com/docs/service/show-post-12090.html