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

正文內容

基于多線程的網絡爬蟲的設計與實現(xiàn)畢業(yè)論文-在線瀏覽

2024-08-07 20:16本頁面
  

【正文】 檢索所有新出現(xiàn)的網頁變得越來越困難,因此,在Matthew Gray的Wanderer基礎上,一些編程者將傳統(tǒng)的“蜘蛛”程序工作原理作了些改進。到1993年底,一些基于此原理的搜索引擎開始紛紛涌現(xiàn),但是早期的搜索引擎只是以搜索工具在數據庫中找到匹配信息的先后次序排列搜索結果,因此毫無信息關聯(lián)度可言。最早現(xiàn)代意義上的搜索引擎出現(xiàn)于1994年7月。同年4月,斯坦福(Stanford)大學最為著名的兩名博士生,美籍華人楊致遠(Gerry Yang)和David Filo共同創(chuàng)辦了Yahoo公司,并成功地使搜索引擎的概念深入人心。目前,互聯(lián)網上有名有姓的搜索引擎已達數百家,其檢索的信息量也與從前不可同日而語。 研究現(xiàn)狀和發(fā)展趨勢因為搜索引擎的商業(yè)化應用帶來了巨大的商業(yè)價值,所以作為搜索引擎的核心部分的網絡爬蟲技術,也理所應當的成為了國內外研究的熱點。并催生了像Baidu和Google這樣的網絡巨擘,而其他公司也紛紛推出了自己的搜索引擎。現(xiàn)今,網絡爬蟲主要分為通用爬蟲和聚焦爬蟲兩類。聚焦爬蟲是一個自動下載網頁的程序,它根據既定的抓取目標,有選擇的訪問萬維網上的網頁與相關的鏈接,獲取所需要的信息。同時,支持根據語義信息提出的查詢。除此之外,網絡爬蟲還主要面對著一下的這些問題(摘自百度百科[5]):強制用Cookies。如果未開啟,則無法進行訪問,訪問頁面顯示的也不會正常,這種方式會讓蜘蛛無法進行訪問。有些企業(yè)站和個人站的設置一定要注冊登陸后才能看到相關的文章內容,這種對蜘蛛不是很友好,蜘蛛不會注冊、也不會登陸。動態(tài)URL簡單的說就是帶有問號、等號及參數的網址就是動態(tài)URL,動態(tài)URL不利于搜索引擎蜘蛛的爬行和抓取。有的網站頁面使用Flash視覺效果是很正常的,比如用Flash做的Logo、廣告、圖表等,這些對搜索引擎抓取和收錄是沒有問題的,很多網站的首頁是一個大的Flash文件,這種就叫蜘蛛陷阱,在蜘蛛抓取時HTML代碼中只是一個鏈接,并沒有文字。 無休止的跳轉。2 網絡爬蟲相關技術本章將會對于網絡爬蟲緊密相關的一些技術進行說明。它最初是由蒂姆(摘自百度百科[5]) URL是用于完整地描述Internet上網頁和其他資源的地址的一種標識方法。簡單地說,URL就是Web地址,俗稱“網址”。在物理結構包括扁平結構和樹型結構。這比較適合于小型的網站,因為如果太多文件都放在根目錄下的話,制作和維護起來比較麻煩。邏輯結構就是由網頁內部鏈接所形成的邏輯的或鏈接的網絡圖。統(tǒng)一資源定位符 URL 是對可以從因特網上得到的資源的位置和訪問方法的一種簡潔的表示。只要能夠對資源定位,系統(tǒng)就可以對資源進行各種操作,如存取、更新、替換和查找其屬性。因此 URL 是與因特網相連的機器上的任何可訪問對象的一個指針。 HTTP協(xié)議本課題研究的網絡爬蟲是用于對于Internet上的信息進行獲取,而HTTP協(xié)議是Internet上最重要的協(xié)議之一。超文本傳輸協(xié)議 (HTTPHypertext transfer protocol) 是分布式,協(xié)作式,超媒體系統(tǒng)應用之間的通信協(xié)議。HTTP協(xié)議的主要特點可概括如下:支持客戶/服務器模式。請求方法常用的有GET、HEAD、POST。由于HTTP協(xié)議簡單,使得HTTP服務器的程序規(guī)模小,因而通信速度很快。正在傳輸的類型由ContentType加以標記。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接。 無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。當使用的是GET 方法的時候,body是為空的Response消息的結構, 和Request消息的結構基本一樣。OPTIONS 返回服務器針對特定資源所支持的HTTP請求方法。*39?!EAD 向服務器索要與GET請求相一致的響應,只不過響應體將不會被返回?!ET 向特定的資源發(fā)出請求。其中一個原因是GET可能會被網絡蜘蛛等隨意訪問。數據被包含在請求體中。PUT 向指定資源位置上傳其最新內容。TRACE 回顯服務器收到的請求,主要用于測試或診斷。方法名稱是區(qū)分大小寫的。HTTP服務器至少應該實現(xiàn)GET和HEAD方法,其他方法都是可選的。此外,除了上述方法,特定的HTTP服務器還能夠擴展自定義的方法。它們有著以下的區(qū)別:1. GET提交的數據會放在URL之后,以?分割URL和傳輸數據,參數之間以amp。id=XXX. POST方法是把提交的數據放在HTTP包的Body中.2. GET提交的數據大小有限制(因為瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制.3. 。所有狀態(tài)碼的第一個數字代表了響應的五種狀態(tài)之一。主要包括5大類消息狀態(tài):1xx: 信息;2xx: 表示請求成功; 3xx: 重定向;4xx: 客戶端錯誤;5xx: 服務器錯誤其中200:請求成功(其后是對GET和POST請求的應答文檔)。(摘自百度百科[5]) 定義線程(Thread):每個正在系統(tǒng)上運行的程序都是一個進程。進程也可能是整個程序或者是部分程序的動態(tài)執(zhí)行。也可以把它理解為代碼運行的上下文。通常由操作系統(tǒng)負責多個線程的調度和執(zhí)行。線程和進程的區(qū)別在于,子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,發(fā)揮利用,根據具體情況而定. 線程的運行中需要使用計算機的內存資源和CPU。用戶界面可以更加吸引人,這樣比如用戶點擊了一個按鈕去觸發(fā)某些事件的處理,可以彈出一個進度條來顯示處理的進度。在一些等待的任務實現(xiàn)上如用戶輸入、文件讀寫和網絡收發(fā)數據等,線程就比較有用了。還有其他很多使用多線程的好處,這里就不在累述。 Java多線程編程計算機程序得以執(zhí)行的三個要素是:CPU,程序代碼,可存取的數據。可以形象的理解為,在一個JAVA程序內部虛擬了多臺計算機,每臺計算機對應一個線程,有自己的CPU,可以獲取所需的代碼和數據,因此能獨立執(zhí)行任務,相互間還可以共用代碼和數據。每個JAVA應用程序都至少有一個線程,這就是所謂的主線程。在JAVA中創(chuàng)建線程的一種方式是通過Thread來實現(xiàn)的。創(chuàng)建一個線程。創(chuàng)建一個線程,并指定一個目標。創(chuàng)建一個名為name的目標為target的線程。創(chuàng)建一個名為name的線程。創(chuàng)建一個隸屬于group線程組,目標為target的線程。 每個線程都是通過某個特定Thread對象所對應的方法run()來完成其操作的,方法run()稱為線程體。調用start()方法并不一定馬上會執(zhí)行這個線程,正如上面所說,它只是進入Runnble而不是Running。在使用Runnable接口時,不能直接創(chuàng)建所需類的對象并運行它,而是必須從Thread類的一個實例內部運行它。 JAVA的線程從產生到消失,可分為5種狀態(tài):新建(New),可運行(Runnable),運行(Running),阻塞(Blocked)以及死亡(Dead)。 當使用new來新建一個線程時,它處于New狀態(tài),這個時候,線程并未進行任何操作。 線程調度程序根據調度策略來調度不同的線程,調用線程的run方法給已經注冊的各個線程以執(zhí)行的機會,被調度執(zhí)行的線程進入運行(Running)狀態(tài)。你不能調用restart方法來重新開始一個處于死亡狀態(tài)的線程,但是,你可以調用處于死亡狀態(tài)的線程對象的各個方法。 線程調度程序會根據調度情況,將正在運行中的線程設置為Runnable狀態(tài),例如,有一個比當前運行狀態(tài)線程更高運行等級的線程進入Runnable狀態(tài),就可能將當前運行的線程從Running狀態(tài)“踢出”,讓它回到Runnable狀態(tài)。注意,因為這個方法會引起線程的安全問題,已經被不推薦使用了,所以,不要再程序調用這個方法。JAVA提供了多種機制以實現(xiàn)線程同步。JAVA中從Object對象繼承來的每個對象都有一個單獨的鎖。所以JAVA中的每個對象都有自己的鎖。在JAVA中實現(xiàn)線程同步的另一個方法是通過使用synchronized關鍵字。synchronized關鍵字實現(xiàn)的基本操作是把每個需要線程同步的部分定義為一個臨界區(qū),在臨界區(qū)中同一時刻只有一個線程被執(zhí)行。雖然通過IP地址和端口可以找到網絡上運行的一個程序,但是如果需要進行網絡編程,則還需要了解網絡通訊的過程。TCP/IP 定義了電子設備如何連入因特網,以及數據如何在它們之間傳輸的標準。通俗而言:TCP負責發(fā)現(xiàn)傳輸的問題,有問題就發(fā)出信號,要求重新傳輸,直到所有數據安全正確地傳輸到目的地。TCP/IP協(xié)議不是TCP和IP這兩個協(xié)議的合稱,而是指因特網整個TCP/IP協(xié)議族。(摘自百度百科[5])本課題將采用IPv4協(xié)議作為開發(fā)基礎。IPv4(通常稱之IP)自20世紀80年代早期以來一直是網際協(xié)議族的主力協(xié)議。IPv4給TCP、UDP、SCTP、ICMP和IGMP提供分組遞送服務。TCP傳輸控制協(xié)議(Transmission Control Protocol)。TCP套接字是一種流套接字(stream socket)。大多數因特網應用程序使用TCP。TCP協(xié)議真是通過“三次握手”的方式保證了傳輸的可靠性。 網絡編程步驟無論使用TCP方式還是UDP方式進行網絡通訊,網絡編程都是由客戶端和服務器端組成。所以,下面介紹網絡編程的步驟時,均以C/S結構為基礎進行介紹。(一)客戶端網絡編程步驟客戶端(Client)是指網絡編程中首先發(fā)起連接的程序,客戶端一般實現(xiàn)程序界面和基本邏輯實現(xiàn),在進行實際的客戶端編程時,無論客戶端復雜還是簡單,以及客戶端實現(xiàn)的方式,客戶端的編程主要由三個步驟實現(xiàn):建立網絡連接客戶端網絡編程的第一步都是建立網絡連接。交換數據連接建立以后,就可以通過這個連接交換數據了。根據邏輯需要,可以多次交換數據,但是還是必須遵循請求響應模型。最基本的步驟一般都是這三個步驟,在實際實現(xiàn)時,步驟2會出現(xiàn)重復,在進行代碼組織時,由于網絡編程是比較耗時的操作,所以一般開啟專門的現(xiàn)場進行網絡通訊。服務器端的編程步驟和客戶端不同,是由四個步驟實現(xiàn),依次是:監(jiān)聽端口服務器端屬于被動等待連接,所以服務器端啟動以后,不需要發(fā)起連接,而只需要監(jiān)聽本地計算機的某個固定端口即可。獲得連接當客戶端連接到服務器端時,服務器端就可以獲得一個連接,這個連接包含客戶端的信息,例如客戶端IP地址等等,服務器端和客戶端也通過該連接進行數據交換。交換數據服務器端通過獲得的連接進行數據交換。簡單來說,就是先接收再發(fā)送,這個和客戶端的數據交換數序不同。當然,服務器端的數據交換也是可以多次進行的。關閉連接當服務器程序關閉時,需要關閉服務器端,通過關閉服務器端使得服務器監(jiān)聽的端口以及占用的內存可以釋放出來,實現(xiàn)了連接的關閉。,該包中包含了基本的網絡編程實現(xiàn),該包是網絡編程的基礎。在本章中,將只介紹基礎的網絡編程類。該類的功能是代表一個IP地址,并且將IP地址和域名相關的操作方法包含在該類的內部。這樣方式在實際的網絡編程中,由于傳輸可靠,類似于打電話,如果甲給乙打電話,乙說沒有聽清楚讓甲重復一遍,直到聽清楚為止,實際的網絡傳輸也是這樣,如果發(fā)送的一方發(fā)送的數據接收方覺得有問題,則網絡底層會自動要求發(fā)送方重發(fā),直到接收方收到為止。在進行網絡編程時,底層網絡通訊的細節(jié)已經實現(xiàn)了比較高的封裝,所以在程序員實際編程時,只需要指定IP地址和端口號碼就可以建立連接了。但是由于Java語言的網絡編程比較簡單,所以還是獲得了廣泛的使用。在客戶端網絡編程中,首先需要建立連接,在Java ,所以建立客戶端網絡連接,也就是創(chuàng)建Socket類型的對象,該對象代表網絡連接,示例如下: Socket socket1 = new Socket(“”,10000)。上面的代碼中,至于底層網絡如何實現(xiàn)建立連接,對于程序員來說是完全透明的。連接一旦建立,則完成了客戶端編程的第一步,緊接著的步驟就是按照“請求響應”模型進行網絡數據交換,在Java語言中,數據傳輸功能由Java IO實現(xiàn),也就是說只需要從連接中獲得輸入流和輸出流即可,然后將需要發(fā)送的數據寫入連接對象的輸出流中,在發(fā)送完成以后從輸入流中讀取數據即可。 //獲得輸出流 InputStream is = ()。這里獲得的只是最基本的輸出流和輸入流對象,還可以根據前面學習到的IO知識,使用流的嵌套將這些獲得到的基本流對象轉換成需要的裝飾流對象,從而方便數據的操作。 正則表達式由于要根據用戶所提供的對爬蟲獲取到的URL和網頁內容進行分析。 正則表達式特點正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達對字符串的一種過濾邏輯。正則表達式的特點是:、邏輯性和功能性非常的強;。普通字符包括大小寫的字母和數字,而元字符則具有特殊的含義。而Java中通過了Pattern類,對正則表達式的使用提供了支持。深度優(yōu)先在很多情況下會導致爬蟲的陷入(trapped)問題,目前常見的是廣度優(yōu)先和最佳優(yōu)先方法。Dijkstra 單源最短路徑算法和Prim 最小生成樹算法都采用了和寬度優(yōu)先搜索類似的思想。該算法的設計和實現(xiàn)相對簡單, 屬于盲目搜索。一般使用寬度優(yōu)先搜索方法。 下面先來看看圖的寬度優(yōu)先遍歷過程。在圖中選中一個節(jié)點,作為起始節(jié)點,然后按照層次遍歷的方式,一層一層地進行訪問。具體的算法(1) 頂點V 入隊列。(3) 出隊列,獲得隊頭節(jié)點V,訪問頂點V 并標記V 已經被訪問。(5) 若V 的鄰接頂點col 未被訪問過,則col 進隊列。這個方法有個優(yōu)點是網絡蜘蛛在設計的時候比較容易。深度優(yōu)先搜索所遵循的搜索策略是盡可能“深”地搜索圖. 在深度優(yōu)先搜索中, 對于最新發(fā)現(xiàn)的頂點, 如果它還有以此為起點而未探測到的邊, 就沿此邊繼續(xù)下去. 當結點v 的所有邊都己被探尋過,搜索將回溯到發(fā)現(xiàn)結點v 有那條邊的始結點. 這一過程一直進行到已發(fā)現(xiàn)從源結點可達的所有結點為
點擊復制文檔內容
醫(yī)療健康相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1