freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于多線程的網(wǎng)絡(luò)爬蟲的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文-資料下載頁

2025-06-27 20:16本頁面
  

【正文】 actus 和 HTMLUnit 都使用了 HttpClient。而對網(wǎng)頁的抓取,只是它的一個簡單應(yīng)用。 網(wǎng)頁相關(guān)度 蜘蛛將網(wǎng)頁下載到本地后,需要使用基于內(nèi)容的主題判別方法計(jì)算該網(wǎng)頁的主題相關(guān)度值,主題相關(guān)度低于某一閾值的網(wǎng)頁被丟棄。 什么是網(wǎng)頁標(biāo)題通常瀏覽一個網(wǎng)頁時(shí),通過瀏覽器頂端的藍(lán)色顯示條出現(xiàn)的信息就是“網(wǎng)頁標(biāo)題”。在網(wǎng)頁HTML代碼中,網(wǎng)頁標(biāo)題位于標(biāo)簽之間。網(wǎng)頁標(biāo)題是對于一個網(wǎng)頁的高度概括,一般來說,網(wǎng)站首頁的標(biāo)題就是網(wǎng)站的正式名稱,而網(wǎng)站中文章內(nèi)容頁面的標(biāo)題就是這文章的題目,欄目首頁的標(biāo)題通常是欄目名稱。當(dāng)然這種一般原則并不是固定不變的,在實(shí)際工作中可能會有一定的變化,但是無論如何變化,總體上仍然會遵照這種規(guī)律。 算法實(shí)現(xiàn)步驟和算法描述:,并通過詞頻計(jì)算來得到與主題向量維數(shù)相等的標(biāo)題向量和正文向量。:A=4B+C。,設(shè)定相關(guān)度閾值為2,網(wǎng)頁與主題的相關(guān)度A2,則認(rèn)為該網(wǎng)頁與主題相關(guān)的。 HttpClient 類庫與Jericho HTML Parser類庫 為了簡化系統(tǒng)實(shí)現(xiàn)難度和提高系統(tǒng)穩(wěn)定性,本系統(tǒng)主要使用了這兩個第三方類庫,前文已經(jīng)多次提到這兩個類庫。 HttpClient HTTP 協(xié)議可能是現(xiàn)在 Internet 上使用得最多、最重要的協(xié)議了,越來越多的 Java 應(yīng)用程序需要直接通過 HTTP 協(xié)議來訪問網(wǎng)絡(luò)資源。雖然在 JDK 的 java net包中已經(jīng)提供了訪問 HTTP 協(xié)議的基本功能,但是對于大部分應(yīng)用程序來說,JDK 庫本身提供的功能還不夠豐富和靈活。HttpClient 是 Apache Jakarta Common 下的子項(xiàng)目,用來提供高效的、最新的、功能豐富的支持 HTTP 協(xié)議的客戶端編程工具包,并且它支持 HTTP 協(xié)議最新的版本和建議。HttpClient 的范圍通常為:基于HttpCore的客戶端HTTP運(yùn)輸實(shí)現(xiàn)庫;基于經(jīng)典(阻塞)I/O ;內(nèi)容無關(guān)Client 特性主要是,基于標(biāo)準(zhǔn),;以可擴(kuò)展的面向?qū)ο蟮慕Y(jié)構(gòu)實(shí)現(xiàn)了Http全部的方法 (GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE);支持HTTPS協(xié)議;通過Http代理建立透明的連接;利用CONNECT 方法通過Http代理建立隧道的連接;Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos 認(rèn)證方案;插件式的自定義認(rèn)證方案;便攜可靠的套接字工廠使它更容易的使用第三方解決方案;,。 Jericho Html Parser Jericho HTML Parser是一個簡單而功能強(qiáng)大的Java HTML解析器庫,可以分析和處理HTML文檔的一部分,包括一些通用的服務(wù)器端標(biāo)簽,同時(shí)也可以重新生成無法識別的或無效的HTML。它也提供了一個有用的HTML表單分析器。Jericho Html Parser的核心的類便是Source類,source類代表了html文檔,他可以從URL得到文檔或者從String得到。 多線程設(shè)計(jì) 為了提高系統(tǒng)的運(yùn)行效率,本系統(tǒng)采用的多線程技術(shù)。圖41系統(tǒng)的結(jié)構(gòu)圖我們可以把每個線程看作是一個獨(dú)立的網(wǎng)絡(luò)爬蟲,它們對同一個URL集合進(jìn)行操作。在對臨界資源訪問的時(shí)候必須使用對象鎖的機(jī)制,避免同時(shí)有多個線程對URL集合進(jìn)行操作。在Java中提供了synchronized 關(guān)鍵字,代表這個方法加鎖,相當(dāng)于不管哪一個線程(例如線程A),運(yùn)行到這個方法時(shí),都要檢查有沒有其它線程B(或者C、 D等)正在用這個方法,有的話要等正在使用synchronized方法的線程B(或者C 、D)運(yùn)行完這個方法后再運(yùn)行此線程A,沒有的話,直接運(yùn)行。它包括兩種用法:synchronized 方法和 synchronized 塊。但是synchronized 方法的缺陷:若將一個大的方法聲明為synchronized 將會大大影響效率,典型地,若將線程類的方法 run() 聲明為 synchronized ,由于在線程的整個生命期內(nèi)它一直在運(yùn)行,因此將導(dǎo)致它對本類任何 synchronized 方法的調(diào)用都永遠(yuǎn)不會成功。當(dāng)然我們可以通過將訪問類成員變量的代碼放到專門的方法中,將其聲明為 synchronized ,并在主方法中調(diào)用來解決這一問題,但是 Java 為我們提供了更好的解決辦法,那就是 synchronized 塊通過 synchronized關(guān)鍵字來聲明synchronized 塊。語法如下: synchronized(syncObject) {//允許訪問控制的代碼}synchronized 塊是這樣一個代碼塊,其中的代碼必須獲得對象 syncObject (如前所述,可以是類實(shí)例或類)的鎖方能執(zhí)行,具體機(jī)制同前所述。由于可以針對任意代碼塊,且可任意指定上鎖的對象,故靈活性較高。5 系統(tǒng)實(shí)現(xiàn)在本章將結(jié)合代碼對系統(tǒng)主要部分進(jìn)行分析。 實(shí)現(xiàn)工具 操作系統(tǒng)是Windows8 ;;。 系統(tǒng)模塊實(shí)現(xiàn) 本節(jié)將結(jié)合代碼分析系統(tǒng)主要模塊的實(shí)現(xiàn)方式。 URL隊(duì)列這個類(LinkQueue)主要封裝了URL的集合和對它的一些相關(guān)操作。主要代碼如下:// 已訪問的 url 集合 private static SetString visitedUrl = new HashSetString()。 // 待訪問的 url 集合,按優(yōu)先級從高到底排序 private static QueueString unVisitedUrl = new PriorityQueueString()。visitedUrl存放已經(jīng)訪問過的URL,用于在解析出來的新的URL進(jìn)行添加時(shí),進(jìn)行判斷是否已經(jīng)訪問過,若已經(jīng)訪問過,舍棄。unVisitedUrl 用于存放未訪問過的URL集合。為了避免URL重復(fù)使用了hashset該類還有如下方法: public synchronized static QueueString getUnVisitedUrl() { return unVisitedUrl。 } // 添加到訪問過的URL隊(duì)列中 public synchronized static void addVisitedUrl(String url) { (url)。 } // 移除訪問過的URL public synchronized static void removeVisitedUrl(String url) { (url)。 } // 未訪問的URL出隊(duì)列 public synchronized static Object unVisitedUrlDeQueue() { return ()。 } // 保證每個 url 只被訪問一次 public synchronized static void addUnvisitedUrl(String url) { if (url != null amp。amp。 !().equals() amp。amp。 !(url) amp。amp。 !(url)) (url)。 } // 獲得已經(jīng)訪問的URL數(shù)目 public synchronized static int getVisitedUrlNum() { return ()。 } public synchronized static int getUnVisitedUrlNum() { return ()。 } 網(wǎng)頁下載DownloadFile類主要封裝了下載網(wǎng)頁的方法,其中核心代碼 /* HttpClinet 對象并設(shè)置參數(shù) */ HttpClient Client = new DefaultHttpClient()。 // 設(shè)置 Http 連接超時(shí) 6s ().setParameter( , 6000)。 /* GetMethod 對象并設(shè)置參數(shù) */ HttpGet Get = new HttpGet(url)。 // 設(shè)置 get 請求超時(shí) 6s ().setParameter( , 6000)。 // 設(shè)置請求重試處理 // ().setIntParameter(RedirectHandler, true)。 /* HTTP GET 請求 */ try { HttpResponse response = (Get)。 int statusCode = ().getStatusCode()。 // 判斷訪問的狀態(tài)碼 if (statusCode != ) { .println(Method failed: + ())。 filePath = null。 } else { /* HTTP 響應(yīng)內(nèi)容 */ HttpEntity Entity = ()。// 讀取為字節(jié)數(shù)組 // 根據(jù)網(wǎng)頁 url 生成保存時(shí)的文件名 fileType = (ContentType).getValue() .toLowerCase()。 //根據(jù)響應(yīng)類型生成文件路徑 filePath = temp\\ + getFileNameByUrl(url, fileType)。 (filePath)。 //根據(jù)生成的文件路徑保存文件 (new FileOutputStream(new File(filePath)))。 提取URL該類主要封裝了分析網(wǎng)頁并提取URL的方法。其中核心代碼:// 訪問URL,將對應(yīng)網(wǎng)頁封裝成一個source對象 Source source = new Source(new URL(url))。 // 方法提取網(wǎng)頁中的URL getUrls((), links)。 // 根據(jù)正則表達(dá)式,篩選出符合規(guī)則的有效URL matcher = (var)。 StringBuffer buffer = new StringBuffer()。 while (()) { (())。 url = new String(buffer); Spider類 該類封裝了網(wǎng)絡(luò)爬蟲的主要工作流程。主要代碼如下。 //當(dāng)問訪問的URL隊(duì)列為空,或訪問的網(wǎng)站數(shù)量達(dá)到指定的數(shù)量退出線程。 while (() = ()) { if (() == 0) { (待訪問隊(duì)列為空,該線程暫停 100 毫秒!)。 (100)。 } // 隊(duì)頭URL出隊(duì)列 visitUrl = (String) ()。 if (visitUrl == null) { continue。 } DownLoadFile downLoader = new DownLoadFile()。 // 下載網(wǎng)頁 (visitUrl)。 // 該 url 放入到已訪問的 URL 中 (visitUrl)。 // 提取出下載網(wǎng)頁中的 URL // (())。 SetString links = (visitUrl)。 // 新的未訪問的 URL 入隊(duì) if (links != null) for (String link : links) (link)。前面已經(jīng)介紹了數(shù)據(jù)庫表的設(shè)計(jì),本節(jié)找介紹數(shù)據(jù)庫操作的邏輯。對于數(shù)據(jù)庫操作有一套相對固定的流程,一般如下:()。url = jbbc:oracle。thin:@localhot:1521:ora9i ora是數(shù)據(jù)庫的sidConnection conn = (url,username,pwd)。 也就是通過發(fā)射源 向數(shù)據(jù)庫傳遞sql語句Statement stmt = ()。sql = SELECT * FROM student。ResultSet rs = (sql)。 //把查詢的結(jié)果放在一個記錄集中()。//記錄集的指針指向第一條上方獲取第一條必須下移比如說 (name)。其中的參數(shù)為要獲取字段的字段名5。最后不要忘了關(guān)閉連接close()對于本系統(tǒng),為了提高系統(tǒng)效率并不是每條記錄都存入數(shù)據(jù)庫。只有當(dāng)兩個隊(duì)列中的元素個數(shù)達(dá)到一定數(shù)量時(shí)才進(jìn)行數(shù)據(jù)庫操作。默認(rèn)的時(shí)當(dāng)待訪問的URL達(dá)到500,已經(jīng)訪問的URL達(dá)到200,或者待訪問URL數(shù)量小于100的時(shí)候才進(jìn)行數(shù)據(jù)庫操作。主要代碼如下:int unVis = ()。 int vis = ()。 if (unVis 500)// 待訪問的URL達(dá)到500 ()。 if (vis 200)// 已經(jīng)訪問的URL達(dá)到200 ()。 if (unVis 100) {//待訪問URL數(shù)量小于100 ()。6 系統(tǒng)運(yùn)行測試 系統(tǒng)運(yùn)行測試以。設(shè)置工作線程數(shù)量為5(默認(rèn)數(shù)為10),最大訪問量無限制,然后用爬蟲程序去運(yùn)行。程序的啟動界面如圖61圖61 程序起始界面開始時(shí)使用默認(rèn)參數(shù),運(yùn)行:工作線程數(shù)為5,訪問數(shù)量不限制(1)。圖62 程序運(yùn)行截(一)圖62是點(diǎn)擊開始按鈕程序開始運(yùn)行,我們可以觀察到程序剛開始運(yùn)行時(shí),待訪問的隊(duì)列只有一個網(wǎng)址,所以除一號線程意外都暫停的一段時(shí)間。當(dāng)程序運(yùn)行一段時(shí)間以后此種情況將大有改善。圖63是運(yùn)行一段時(shí)間過后的情況,我們可以看到,所有工作線程都已經(jīng)開始工作圖63 程序運(yùn)行截圖(二)通過截圖我們可以觀察到線程的運(yùn)行順序是不可預(yù)測的,這也增大了我們編程的難度。尤其是到對臨界資源進(jìn)行操作時(shí)
點(diǎn)擊復(fù)制文檔內(nèi)容
醫(yī)療健康相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1