【正文】
nkedHashMap 來實現(xiàn)的。這個Map 非常好,它總是淘汰重復次數(shù)最少的 URL。這樣就算 URL 數(shù)過大,也可以盡量避免重復下載 URL。它的具體構造如下:public class LRULinkedHashMapK, V extends LinkedHashMapK, V {private static final long serialVersionUID = 1L。private final int maxCapacity。private static final float DEFAULT_LOAD_FACTOR = 。private final Lock lock = new ReentrantLock()。public LRULinkedHashMap(int maxCapacity) {super(maxCapacity, DEFAULT_LOAD_FACTOR, true)。 = maxCapacity。}@Overrideprotected boolean removeEldestEntry(K, V eldest) {return size() maxCapacity。}@Overridepublic V get(Object key) {try {()。return (key)。} finally {()。}}@Overridepublic V put(K key, V value) {try {()。return (key, value)。} finally {()。}}電子科技大學成都學院本科畢業(yè)設計論文26}有了這個 map 以后,我就會用 URL 到里面去碰撞。因為有些網(wǎng)站的 URL寫法不固定。也許是同一個 URL,但是有些在最后一位接續(xù)/符號,而有些則沒有接續(xù)。這樣當進行 URL 去重處理時,會認為它們不是一個 URL。所以我們必須先除去后面的/符號,再進行 URL 去重判斷。public synchronized boolean isContainUrl(String url) {if ((/)) {url = (0, () 1)。}boolean b = ((url))。((url), true)。return b。} URL 等待隊列維護對 URL 等待隊列的操作主要有 2 個:從里面取出 URLs。往里面加入URLs。但是因為 URL 等待隊列會非常巨大,所以我將 URL 等待隊列設計成 3 段式。2 段基于內(nèi)存的 URL 緩存區(qū),和一個基于數(shù)據(jù)庫的儲存區(qū)。所以這里就會有 2 個方法來完成數(shù)據(jù)直接的交接。當加入 URL 緩存太長時,調(diào)用下面的方法,將緩存區(qū)的內(nèi)容加入到數(shù)據(jù)庫。具體的實現(xiàn)方法是,當存入緩存超過一定數(shù)目的時候。調(diào)用 waitQueueDecrease()這個函數(shù),將存入緩存里的數(shù)據(jù)轉移到數(shù)據(jù)庫。方法是取出下標為 0 的元素,將其加入到數(shù)據(jù)庫,然后刪除下標為 0 的元素。不斷重復這個操作,直到存入緩存被清空。下面是具體實現(xiàn)的 JAVA 代碼。public synchronized void waitQueueDecrease() {try {Statement stmt = null。while (() 0) {try {stmt = ().createStatement()。while ((0).size() 0) {String url = (String)(0).get(0)。第五章 系統(tǒng)實現(xiàn)27(0).remove(0)。(insert into middlequeue (url) values(39。+ url + 39。)。)。(insert into databasequeue (url) values(39。+ url + 39。)。)。}當取出緩存區(qū)空以后,需要將數(shù)據(jù)庫的內(nèi)容加入到緩存區(qū)。通過調(diào)用waitQueueAdd()這個函數(shù)來實現(xiàn)。具體的實現(xiàn)方法是:從數(shù)據(jù)庫里搜索前 25 條數(shù)據(jù),因為數(shù)據(jù)庫添加數(shù)據(jù)時是順序往下壓入的。對于 MYSQL 數(shù)據(jù)庫,可以使用 LIMIT 這個關鍵字。檢索存入數(shù)據(jù)庫最上端的 25 條數(shù)據(jù),然后依次將其加入到取出緩存區(qū)。然后刪除數(shù)據(jù)庫中這 25 條數(shù)據(jù)。下面是具體實現(xiàn)的 JAVA 代碼:public synchronized void waitQueueAdd() {String sql = SELECT * FROM middlequeue LIMIT 25。Statement stmt = null。ResultSet res = null。try {stmt = ().createStatement()。res = (sql)。while (()) {((url))。}(delete from middlequeue limit 25)。 數(shù)據(jù)庫設計對于 MYSQL 數(shù)據(jù)庫的設計。我建立了 2 個表,分別為 middlequeue 和databasequeue。middlequeue 表和 databasequeue 表都只有一個字段 URL,同時它作為主鍵,因為存入的 URL 不可能重復。Middlequeue 用于 URL 等待隊列的主存儲部分。而 databasequeue 表記錄爬蟲程序運行得到的所有 URLs。JAVA 程序和數(shù)據(jù)之間的通信是通過 JDBC 實現(xiàn)的。下面是 JAVA 程序連接MYSQL 數(shù)據(jù)庫的代碼。public static Connection conn() {Connection conn = null。電子科技大學成都學院本科畢業(yè)設計論文28try {// 加載Connector/J驅動().newInstance()。// 建立到MySQL的連接conn = (jdbc: root, root)。} catch (Exception ex) {(Error : + ())。}return conn。}第六章 系統(tǒng)測試29第六章 系統(tǒng)測試我以 URL。然后用爬蟲程序去運行。5 分鐘內(nèi)總共爬行出了 2201 個 URL。下面是從數(shù)據(jù)庫里截圖的 2 段爬行結果。圖 部分運行結果圖 為最先爬蟲出來的 URLs 結果。我分析 HTML 代碼。最先檢索出來 href 如下:電子科技大學成都學院本科畢業(yè)設計論文30這是一個相對地址,對應圖 的爬蟲結果。程序將其轉化為了,絕對地址。但分析這個 URL 可以得知。這個 URL 為 ico 文件,是不可能被當作 HTML 解析的。所以這種 URL 因該過濾掉。這是程序設計上的不足。然后被檢索出來的 href 標簽是:這是一段完整 URL,但是其 host 名同初始 URL 不一致,同時它的后綴為css,表明它指向的文件為 css 文件。所以因該被過濾掉。對應圖 的爬蟲結果,可以看到這段 URL 的確被過濾了。第三個被檢索到的 href 標簽為:這是一段很標準的 URL,它的 host 為 并且可以得到 HTML 代碼。所以這個 URL 被加入 URL 隊列。根據(jù)測試結果可以得知爬蟲程序能夠正確解析出頁面 URLs。第六章 系統(tǒng)測試31我在 SpiderWorker 的 run 方法寫入這樣一段代碼:(線程 + biaoji+運行 )。圖 圖 為控制臺打印出來的信息。根據(jù)顯示結果可以看出,不同的線程的確是在交替完成爬行任務。電子科技大學成都學院本科畢業(yè)設計論文32第七章 結論從課題著手到現(xiàn)在論文完成,經(jīng)歷了 3 個月的時間。在這個 3 個月里,我不斷學習,探索,從對網(wǎng)絡爬蟲一無所知,到能成功編寫出網(wǎng)絡爬蟲程序。對網(wǎng)絡爬蟲中比較主流的技術都有了更深的理解。網(wǎng)絡爬蟲是一個自動搜集互聯(lián)網(wǎng)信息的工具,實現(xiàn)了網(wǎng)絡爬蟲,就可以在互聯(lián)網(wǎng)這樣一個巨大的信息海洋里遨游。這篇論文實現(xiàn)了一個基于廣度優(yōu)先策略的多線程爬蟲程序,可以搜集站內(nèi)URLs。但是在功能細節(jié)上還有很多不足,比如系統(tǒng)不夠優(yōu)化,功能不夠強大,沒有解析網(wǎng)頁信息。對于網(wǎng)絡爬蟲這個龐大的知識體系來說,這篇論文實現(xiàn)的功能只能算一些皮毛。要深刻地理解爬蟲程序,在爬蟲程序設計中有所作為,還需要長達幾年,或者更長時間的積累。所以在以后的時間,我將繼續(xù)研究網(wǎng)絡爬蟲技術。分析設計一些比較復雜的爬行策略,優(yōu)化爬蟲程序。希望在這一課題上達到另一個高度。參考文獻33參考文獻,簡析搜索引擎中網(wǎng)絡爬蟲的搜索策略[N],阜陽師范學院學報(自然科學版),2022(09) : P60~63.,基于 JAVA 的多線程 SPIDER 的設計與實現(xiàn)[J] ,福建電腦,2022(06):P62~63.,基于網(wǎng)絡的信息獲取技術淺析[J],福建電腦,2022(04):P60~61.,網(wǎng)絡蜘蛛搜索策略比較研究[A],計算機工程與應用, 2022(04):P131.,支持 Web 信息分類的高性能蜘蛛程序 [J],小型微型計算機系統(tǒng),2022(07):P1309 ~ 1312.,JAVA 線程[A],JAVASE 平臺程序設計和實戰(zhàn),2022(05):P103~135.,搜索引擎中數(shù)據(jù)獲取的設計與實現(xiàn)[J] 沈陽:小型微型計算機系統(tǒng),1999. Diligenti, Frans Coetzee, Steve Lawrence, etal. Focused Craw ling using Context Graph s[J ], Intemat ional Conference on Very Large Databases. 2022, (26) : P 527~534.. 分布式 Web Crawler 的研究: 結構、算法和策略 [J ]. 電子學報, 2022, 30 (12A ).[電子科技大學成都學院本科畢業(yè)設計論文34致謝我要感謝畢業(yè)論文指導老師,朱大勇老師,感謝他在論文方向和論文實施計劃上給予我指導。感謝李廣鎮(zhèn)同學,戴國強同學,潘秀銀同學在程序具體實施過程中給我提供了寶貴的意見和提議。外文資料原文35外文資料原文Efficient URL Caching for World Wide Web CrawlingAndrei Z. BroderIBM TJ Watson Research Center19 Skyline DrHawthorne, NY 10532Marc NajorkMicrosoft Research1065 La AvenidaMountain View, CA 94043Ja L. WienerHewlett Packard Labs1501 Page Mill RoadPalo Alto, CA 94304ABSTRACTCrawling the web is deceptively simple: the basic algorithm is (a)Fetch a page (b) Parse it to extract all linked URLs (c) For all the URLs not seen before, repeat (a)–(c). However, the size of the web (estimated at over 4 billion pages) and its rate of change (estimated at 7% per week) move this plan from a trivial programming exercise to a serious algorithmic and system design challenge. Indeed, these two factors alone imply that for a reasonably fresh and plete crawl of the web, step (a) must be executed about a thousand times per second, and thus the membership test (c) must be done well over ten thousand times per second against a set too large to store in main memory. This requires a distributed architecture, which further plicates the 電子科技大學成都學院本科畢業(yè)設計論文36membership test.A crucial way to speed up the test is to cache, that is, to store in main memory a (dynamic) subset of the “seen” URLs. The main goal of this paper is to carefully investigate several URL caching techniques for web crawling. We consider both practical algorithms: random replacement, static cache, LRU, and CLOCK, and theo