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

正文內(nèi)容

基于多線程的網(wǎng)絡(luò)爬蟲(chóng)的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文-wenkub.com

2025-06-24 20:16 本頁(yè)面
   

【正文】 當(dāng)程序運(yùn)行一段時(shí)間以后此種情況將大有改善。6 系統(tǒng)運(yùn)行測(cè)試 系統(tǒng)運(yùn)行測(cè)試以。 int vis = ()。最后不要忘了關(guān)閉連接close()對(duì)于本系統(tǒng),為了提高系統(tǒng)效率并不是每條記錄都存入數(shù)據(jù)庫(kù)。ResultSet rs = (sql)。url = jbbc:oracle。 SetString links = (visitUrl)。 } DownLoadFile downLoader = new DownLoadFile()。 while (() = ()) { if (() == 0) { (待訪問(wèn)隊(duì)列為空,該線程暫停 100 毫秒!)。 while (()) { (())。其中核心代碼:// 訪問(wèn)URL,將對(duì)應(yīng)網(wǎng)頁(yè)封裝成一個(gè)source對(duì)象 Source source = new Source(new URL(url))。 //根據(jù)響應(yīng)類(lèi)型生成文件路徑 filePath = temp\\ + getFileNameByUrl(url, fileType)。 // 判斷訪問(wèn)的狀態(tài)碼 if (statusCode != ) { .println(Method failed: + ())。 // 設(shè)置 get 請(qǐng)求超時(shí) 6s ().setParameter( , 6000)。 } public synchronized static int getUnVisitedUrlNum() { return ()。 !(url) amp。 } // 保證每個(gè) url 只被訪問(wèn)一次 public synchronized static void addUnvisitedUrl(String url) { if (url != null amp。為了避免URL重復(fù)使用了hashset該類(lèi)還有如下方法: public synchronized static QueueString getUnVisitedUrl() { return unVisitedUrl。主要代碼如下:// 已訪問(wèn)的 url 集合 private static SetString visitedUrl = new HashSetString()。5 系統(tǒng)實(shí)現(xiàn)在本章將結(jié)合代碼對(duì)系統(tǒng)主要部分進(jìn)行分析。但是synchronized 方法的缺陷:若將一個(gè)大的方法聲明為synchronized 將會(huì)大大影響效率,典型地,若將線程類(lèi)的方法 run() 聲明為 synchronized ,由于在線程的整個(gè)生命期內(nèi)它一直在運(yùn)行,因此將導(dǎo)致它對(duì)本類(lèi)任何 synchronized 方法的調(diào)用都永遠(yuǎn)不會(huì)成功。圖41系統(tǒng)的結(jié)構(gòu)圖我們可以把每個(gè)線程看作是一個(gè)獨(dú)立的網(wǎng)絡(luò)爬蟲(chóng),它們對(duì)同一個(gè)URL集合進(jìn)行操作。 Jericho Html Parser Jericho HTML Parser是一個(gè)簡(jiǎn)單而功能強(qiáng)大的Java HTML解析器庫(kù),可以分析和處理HTML文檔的一部分,包括一些通用的服務(wù)器端標(biāo)簽,同時(shí)也可以重新生成無(wú)法識(shí)別的或無(wú)效的HTML。 HttpClient HTTP 協(xié)議可能是現(xiàn)在 Internet 上使用得最多、最重要的協(xié)議了,越來(lái)越多的 Java 應(yīng)用程序需要直接通過(guò) HTTP 協(xié)議來(lái)訪問(wèn)網(wǎng)絡(luò)資源。網(wǎng)頁(yè)標(biāo)題是對(duì)于一個(gè)網(wǎng)頁(yè)的高度概括,一般來(lái)說(shuō),網(wǎng)站首頁(yè)的標(biāo)題就是網(wǎng)站的正式名稱(chēng),而網(wǎng)站中文章內(nèi)容頁(yè)面的標(biāo)題就是這文章的題目,欄目首頁(yè)的標(biāo)題通常是欄目名稱(chēng)。而對(duì)網(wǎng)頁(yè)的抓取,只是它的一個(gè)簡(jiǎn)單應(yīng)用。HTTP 協(xié)議可能是現(xiàn)在 Internet 上使用得最多、最重要的協(xié)議了,越來(lái)越多的 Java 應(yīng)用程序需要直接通過(guò) HTTP 協(xié)議來(lái)訪問(wèn)網(wǎng)絡(luò)資源。URL等待隊(duì)列設(shè)計(jì)成三段式:第一段為一個(gè)List,用來(lái)加入新得到的URL。那么如何才能跳出這個(gè)怪圈呢?Java已經(jīng)為大家提供了一個(gè)叫HashSet的容器(其底層原理使用hash進(jìn)行比較)。 URL判重抓取網(wǎng)頁(yè)時(shí)有一個(gè)非常棘手的問(wèn)題,那就是重復(fù)抓取問(wèn)題。因?yàn)榻馕龀鰜?lái)的URL地址可能是一些文件的地址,或者為JavaScript文件或者CSS文件。為了加快抽取速度,我們可以采用第三方類(lèi)庫(kù),進(jìn)行抽取。我們需要獲取HTML代碼中的URLs,就可以通過(guò)尋找href標(biāo)簽來(lái)達(dá)到目的。,從網(wǎng)頁(yè)中某個(gè)鏈接出發(fā),訪問(wèn)該鏈接網(wǎng)頁(yè)上的所有鏈接,訪問(wèn)完成后,再通過(guò)遞歸算法實(shí)現(xiàn)下一層的訪問(wèn),重復(fù)以上步驟。(摘自百度百科[5])4 網(wǎng)絡(luò)爬蟲(chóng)模型的總體設(shè)計(jì) 網(wǎng)絡(luò)爬蟲(chóng)總體設(shè)計(jì)根據(jù)本網(wǎng)絡(luò)爬蟲(chóng)的概要設(shè)計(jì)本網(wǎng)絡(luò)爬蟲(chóng)是一個(gè)自動(dòng)提取網(wǎng)頁(yè)的程序,根據(jù)設(shè)定的主題判斷是否與主題相關(guān),再根據(jù)已下載的網(wǎng)頁(yè)上繼續(xù)訪問(wèn)其它的網(wǎng)頁(yè),并將其下載直到滿足用戶的需求。幸運(yùn)的是,Eclipse 附帶了準(zhǔn)的插件集,包括Java開(kāi)發(fā)工具(Java Development Kit,JDK)。Sun 公司對(duì) Java 編程語(yǔ)言的解釋是:Java 編程語(yǔ)言是個(gè)簡(jiǎn)單、面向?qū)ο?、分布式、解釋性、健壯、安全與系統(tǒng)無(wú)關(guān)、可移植、高性能、多線程和動(dòng)態(tài)的語(yǔ)言。Java 應(yīng)用編程接口為Java應(yīng)用提供了一個(gè)獨(dú)立于操作系統(tǒng)的標(biāo)準(zhǔn)接口,可分為基本部分和擴(kuò)展部分。圖32 未訪問(wèn)的站點(diǎn)存儲(chǔ)表圖33顯示的是WebFile表的設(shè)計(jì),用于保存已經(jīng)訪問(wèn)的URL的信息圖33 網(wǎng)頁(yè)存儲(chǔ)表 技術(shù)選型 Java 簡(jiǎn)介Java是由Sun Microsystems公司于1995年5月推出的Java面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言(以下簡(jiǎn)稱(chēng)Java語(yǔ)言)和Java平臺(tái)的總稱(chēng)。以下是本程序爬蟲(chóng)使用的框架,看起來(lái)更像是主題爬蟲(chóng)的框架。之后將任務(wù)列表中URL重新開(kāi)始爬取,從而使網(wǎng)絡(luò)爬蟲(chóng)進(jìn)行循環(huán)運(yùn)行。 存儲(chǔ)網(wǎng)頁(yè)由于本項(xiàng)目只是專(zhuān)注與網(wǎng)絡(luò)蜘蛛的實(shí)現(xiàn),為了便于測(cè)試,可以選用Oracle數(shù)據(jù)庫(kù)。網(wǎng)頁(yè)的標(biāo)題并不是簡(jiǎn)單地指網(wǎng)頁(yè)源碼中Title標(biāo)簽內(nèi)的文本,而是指網(wǎng)頁(yè)源碼中最能概括出該網(wǎng)頁(yè)內(nèi)容的某句話??梢钥紤]采用多線程或采用其它的IO模型來(lái)提升蜘蛛的抓取速度。首先,要解決網(wǎng)頁(yè)的編碼問(wèn)題,Internet聯(lián)通世界各個(gè)角落,每個(gè)國(guó)家和地區(qū)的網(wǎng)站使用著不同的編碼,即使同在一個(gè)國(guó)家的網(wǎng)站其使用的網(wǎng)頁(yè)編碼規(guī)則也不盡相同。(摘自百度百科[5]) 系統(tǒng)需求分析本節(jié)內(nèi)容將簡(jiǎn)要的分析一下一個(gè)網(wǎng)絡(luò)蜘蛛應(yīng)該具有的基本功能,包括:下載網(wǎng)頁(yè)、分解網(wǎng)頁(yè)、遍歷網(wǎng)絡(luò)、存儲(chǔ)網(wǎng)頁(yè)等。但是,如果對(duì)方討厭爬蟲(chóng),很可能封掉服務(wù)器的IP,服務(wù)器IP又不容易改,另外耗用的帶寬也是較貴。定義3:如果網(wǎng)頁(yè)p中包含超鏈接l,則p稱(chēng)為鏈接l的父網(wǎng)頁(yè)。3 需求分析和模型設(shè)計(jì) 網(wǎng)絡(luò)爬蟲(chóng)的定義定義1:網(wǎng)絡(luò)爬蟲(chóng)是一個(gè)自動(dòng)提取網(wǎng)頁(yè)的程序,它為搜索引擎從Web上下載網(wǎng)頁(yè),是搜索引擎的重要組成部分。最佳優(yōu)先搜索策略按照一定的網(wǎng)頁(yè)分析算法,預(yù)測(cè)候選URL與目標(biāo)網(wǎng)頁(yè)的相似度,或與主題的相關(guān)性,并選取評(píng)價(jià)最好的一個(gè)或幾個(gè)URL進(jìn)行抓取。這個(gè)方法有個(gè)優(yōu)點(diǎn)是網(wǎng)絡(luò)蜘蛛在設(shè)計(jì)的時(shí)候比較容易。(3) 出隊(duì)列,獲得隊(duì)頭節(jié)點(diǎn)V,訪問(wèn)頂點(diǎn)V 并標(biāo)記V 已經(jīng)被訪問(wèn)。在圖中選中一個(gè)節(jié)點(diǎn),作為起始節(jié)點(diǎn),然后按照層次遍歷的方式,一層一層地進(jìn)行訪問(wèn)。一般使用寬度優(yōu)先搜索方法。Dijkstra 單源最短路徑算法和Prim 最小生成樹(shù)算法都采用了和寬度優(yōu)先搜索類(lèi)似的思想。而Java中通過(guò)了Pattern類(lèi),對(duì)正則表達(dá)式的使用提供了支持。正則表達(dá)式的特點(diǎn)是:、邏輯性和功能性非常的強(qiáng);。 正則表達(dá)式由于要根據(jù)用戶所提供的對(duì)爬蟲(chóng)獲取到的URL和網(wǎng)頁(yè)內(nèi)容進(jìn)行分析。 //獲得輸出流 InputStream is = ()。上面的代碼中,至于底層網(wǎng)絡(luò)如何實(shí)現(xiàn)建立連接,對(duì)于程序員來(lái)說(shuō)是完全透明的。但是由于Java語(yǔ)言的網(wǎng)絡(luò)編程比較簡(jiǎn)單,所以還是獲得了廣泛的使用。這樣方式在實(shí)際的網(wǎng)絡(luò)編程中,由于傳輸可靠,類(lèi)似于打電話,如果甲給乙打電話,乙說(shuō)沒(méi)有聽(tīng)清楚讓甲重復(fù)一遍,直到聽(tīng)清楚為止,實(shí)際的網(wǎng)絡(luò)傳輸也是這樣,如果發(fā)送的一方發(fā)送的數(shù)據(jù)接收方覺(jué)得有問(wèn)題,則網(wǎng)絡(luò)底層會(huì)自動(dòng)要求發(fā)送方重發(fā),直到接收方收到為止。在本章中,將只介紹基礎(chǔ)的網(wǎng)絡(luò)編程類(lèi)。關(guān)閉連接當(dāng)服務(wù)器程序關(guān)閉時(shí),需要關(guān)閉服務(wù)器端,通過(guò)關(guān)閉服務(wù)器端使得服務(wù)器監(jiān)聽(tīng)的端口以及占用的內(nèi)存可以釋放出來(lái),實(shí)現(xiàn)了連接的關(guān)閉。簡(jiǎn)單來(lái)說(shuō),就是先接收再發(fā)送,這個(gè)和客戶端的數(shù)據(jù)交換數(shù)序不同。獲得連接當(dāng)客戶端連接到服務(wù)器端時(shí),服務(wù)器端就可以獲得一個(gè)連接,這個(gè)連接包含客戶端的信息,例如客戶端IP地址等等,服務(wù)器端和客戶端也通過(guò)該連接進(jìn)行數(shù)據(jù)交換。最基本的步驟一般都是這三個(gè)步驟,在實(shí)際實(shí)現(xiàn)時(shí),步驟2會(huì)出現(xiàn)重復(fù),在進(jìn)行代碼組織時(shí),由于網(wǎng)絡(luò)編程是比較耗時(shí)的操作,所以一般開(kāi)啟專(zhuān)門(mén)的現(xiàn)場(chǎng)進(jìn)行網(wǎng)絡(luò)通訊。交換數(shù)據(jù)連接建立以后,就可以通過(guò)這個(gè)連接交換數(shù)據(jù)了。所以,下面介紹網(wǎng)絡(luò)編程的步驟時(shí),均以C/S結(jié)構(gòu)為基礎(chǔ)進(jìn)行介紹。TCP協(xié)議真是通過(guò)“三次握手”的方式保證了傳輸?shù)目煽啃浴CP套接字是一種流套接字(stream socket)。IPv4給TCP、UDP、SCTP、ICMP和IGMP提供分組遞送服務(wù)。(摘自百度百科[5])本課題將采用IPv4協(xié)議作為開(kāi)發(fā)基礎(chǔ)。通俗而言:TCP負(fù)責(zé)發(fā)現(xiàn)傳輸?shù)膯?wèn)題,有問(wèn)題就發(fā)出信號(hào),要求重新傳輸,直到所有數(shù)據(jù)安全正確地傳輸?shù)侥康牡?。雖然通過(guò)IP地址和端口可以找到網(wǎng)絡(luò)上運(yùn)行的一個(gè)程序,但是如果需要進(jìn)行網(wǎng)絡(luò)編程,則還需要了解網(wǎng)絡(luò)通訊的過(guò)程。在JAVA中實(shí)現(xiàn)線程同步的另一個(gè)方法是通過(guò)使用synchronized關(guān)鍵字。JAVA中從Object對(duì)象繼承來(lái)的每個(gè)對(duì)象都有一個(gè)單獨(dú)的鎖。注意,因?yàn)檫@個(gè)方法會(huì)引起線程的安全問(wèn)題,已經(jīng)被不推薦使用了,所以,不要再程序調(diào)用這個(gè)方法。你不能調(diào)用restart方法來(lái)重新開(kāi)始一個(gè)處于死亡狀態(tài)的線程,但是,你可以調(diào)用處于死亡狀態(tài)的線程對(duì)象的各個(gè)方法。 當(dāng)使用new來(lái)新建一個(gè)線程時(shí),它處于New狀態(tài),這個(gè)時(shí)候,線程并未進(jìn)行任何操作。在使用Runnable接口時(shí),不能直接創(chuàng)建所需類(lèi)的對(duì)象并運(yùn)行它,而是必須從Thread類(lèi)的一個(gè)實(shí)例內(nèi)部運(yùn)行它。 每個(gè)線程都是通過(guò)某個(gè)特定Thread對(duì)象所對(duì)應(yīng)的方法run()來(lái)完成其操作的,方法run()稱(chēng)為線程體。創(chuàng)建一個(gè)名為name的線程。創(chuàng)建一個(gè)線程,并指定一個(gè)目標(biāo)。在JAVA中創(chuàng)建線程的一種方式是通過(guò)Thread來(lái)實(shí)現(xiàn)的。可以形象的理解為,在一個(gè)JAVA程序內(nèi)部虛擬了多臺(tái)計(jì)算機(jī),每臺(tái)計(jì)算機(jī)對(duì)應(yīng)一個(gè)線程,有自己的CPU,可以獲取所需的代碼和數(shù)據(jù),因此能獨(dú)立執(zhí)行任務(wù),相互間還可以共用代碼和數(shù)據(jù)。還有其他很多使用多線程的好處,這里就不在累述。用戶界面可以更加吸引人,這樣比如用戶點(diǎn)擊了一個(gè)按鈕去觸發(fā)某些事件的處理,可以彈出一個(gè)進(jìn)度條來(lái)顯示處理的進(jìn)度。通常由操作系統(tǒng)負(fù)責(zé)多個(gè)線程的調(diào)度和執(zhí)行。進(jìn)程也可能是整個(gè)程序或者是部分程序的動(dòng)態(tài)執(zhí)行。主要包括5大類(lèi)消息狀態(tài):1xx: 信息;2xx: 表示請(qǐng)求成功; 3xx: 重定向;4xx: 客戶端錯(cuò)誤;5xx: 服務(wù)器錯(cuò)誤其中200:請(qǐng)求成功(其后是對(duì)GET和POST請(qǐng)求的應(yīng)答文檔)。id=XXX. POST方法是把提交的數(shù)據(jù)放在HTTP包的Body中.2. GET提交的數(shù)據(jù)大小有限制(因?yàn)闉g覽器對(duì)URL的長(zhǎng)度有限制),而POST方法提交的數(shù)據(jù)沒(méi)有限制.3. 。此外,除了上述方法,特定的HTTP服務(wù)器還能夠擴(kuò)展自定義的方法。方法名稱(chēng)是區(qū)分大小寫(xiě)的。PUT 向指定資源位置上傳其最新內(nèi)容。其中一個(gè)原因是GET可能會(huì)被網(wǎng)絡(luò)蜘蛛等隨意訪問(wèn)?!EAD 向服務(wù)器索要與GET請(qǐng)求相一致的響應(yīng),只不過(guò)響應(yīng)體將不會(huì)被返回。OPTIONS 返回服務(wù)器針對(duì)特定資源所支持的HTTP請(qǐng)求方法。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。服務(wù)器處理完客戶的請(qǐng)求,并收到客戶的應(yīng)答后,即斷開(kāi)連接。由于HTTP協(xié)議簡(jiǎn)單,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快。HTTP協(xié)議的主要特點(diǎn)可概括如下:支持客戶/服務(wù)器模式。 HTTP協(xié)議本課題研究的網(wǎng)絡(luò)爬蟲(chóng)是用于對(duì)于Internet上的信息進(jìn)行獲取,而HTTP協(xié)議是Internet上最重要的協(xié)議之一。只要能夠?qū)Y源定位,系統(tǒng)就可以對(duì)資源進(jìn)行各種操作,如存取、更新、替換和查找其屬性。邏輯結(jié)構(gòu)就是由網(wǎng)頁(yè)內(nèi)部鏈接所形成的邏輯的或鏈接的網(wǎng)絡(luò)圖。在物理結(jié)構(gòu)包括扁平結(jié)構(gòu)和樹(shù)型結(jié)構(gòu)。(摘自百度百科[5]) URL是用于完整地描述Internet上網(wǎng)頁(yè)和其他資源的地址的一種標(biāo)識(shí)方法。2 網(wǎng)絡(luò)爬蟲(chóng)相關(guān)技術(shù)本章將會(huì)對(duì)于網(wǎng)絡(luò)爬蟲(chóng)緊密相關(guān)的一些技術(shù)進(jìn)行說(shuō)明。有的網(wǎng)站頁(yè)面使用Flash視覺(jué)效果是很正常的,比如用Flash做的Logo、廣告、圖表等,這些對(duì)搜索引擎抓取和收錄是沒(méi)有問(wèn)題的,很多網(wǎng)站的首頁(yè)是一個(gè)大的Flash文件,這種就叫蜘蛛陷阱,在蜘蛛抓取時(shí)HTML代碼中只是一個(gè)鏈接,并沒(méi)有文字。有些企業(yè)站和個(gè)人站的設(shè)置一定要注冊(cè)登陸后才能看到相關(guān)的文章內(nèi)容,這種對(duì)蜘蛛不是很友好,蜘蛛不會(huì)注冊(cè)、也不會(huì)登陸。除此之外,網(wǎng)絡(luò)爬蟲(chóng)還主要面對(duì)著一下的這些問(wèn)題(摘自百度百科[5]):強(qiáng)制用Cookies。聚焦爬蟲(chóng)是一個(gè)自動(dòng)下載網(wǎng)頁(yè)的程序,它根據(jù)既定的抓取目標(biāo),有選擇的訪問(wèn)萬(wàn)維網(wǎng)上的網(wǎng)頁(yè)與相關(guān)的鏈接,獲取所需要的信息。并催生了像Baidu和Google這樣的網(wǎng)絡(luò)巨擘,而其他公司也紛紛推出了自己的搜索引擎。目前,互聯(lián)網(wǎng)上有名有姓的搜索引擎已達(dá)數(shù)百家,其檢索的信息量也與從前不可同日而語(yǔ)。最早現(xiàn)代意義上的搜索引擎出現(xiàn)于1994年7月。隨著互聯(lián)網(wǎng)的迅速發(fā)展,使得檢索所有新出現(xiàn)的網(wǎng)頁(yè)變得越來(lái)越困難,因此,在Matthew Gray的Wanderer基礎(chǔ)上,一些編程者將傳統(tǒng)的“蜘蛛”程序工作原理作了些改進(jìn)。世界上第一個(gè)用于監(jiān)測(cè)互聯(lián)網(wǎng)發(fā)展規(guī)模的“機(jī)器人”程
點(diǎn)擊復(fù)制文檔內(nèi)容
醫(yī)療健康相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1