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

正文內(nèi)容

基于多線程的網(wǎng)絡(luò)爬蟲的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文(參考版)

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

【正文】 圖63是運(yùn)行一段時(shí)間過后的情況,我們可以看到,所有工作線程都已經(jīng)開始工作圖63 程序運(yùn)行截圖(二)通過截圖我們可以觀察到線程的運(yùn)行順序是不可預(yù)測(cè)的,這也增大了我們編程的難度。圖62 程序運(yùn)行截(一)圖62是點(diǎn)擊開始按鈕程序開始運(yùn)行,我們可以觀察到程序剛開始運(yùn)行時(shí),待訪問的隊(duì)列只有一個(gè)網(wǎng)址,所以除一號(hào)線程意外都暫停的一段時(shí)間。設(shè)置工作線程數(shù)量為5(默認(rèn)數(shù)為10),最大訪問量無(wú)限制,然后用爬蟲程序去運(yùn)行。 if (unVis 100) {//待訪問URL數(shù)量小于100 ()。 if (unVis 500)// 待訪問的URL達(dá)到500 ()。主要代碼如下:int unVis = ()。只有當(dāng)兩個(gè)隊(duì)列中的元素個(gè)數(shù)達(dá)到一定數(shù)量時(shí)才進(jìn)行數(shù)據(jù)庫(kù)操作。其中的參數(shù)為要獲取字段的字段名5。 //把查詢的結(jié)果放在一個(gè)記錄集中()。sql = SELECT * FROM student。thin:localhot:1521:ora9i ora是數(shù)據(jù)庫(kù)的sidConnection conn = (url,username,pwd)。對(duì)于數(shù)據(jù)庫(kù)操作有一套相對(duì)固定的流程,一般如下:()。 // 新的未訪問的 URL 入隊(duì) if (links != null) for (String link : links) (link)。 // 提取出下載網(wǎng)頁(yè)中的 URL // (())。 // 下載網(wǎng)頁(yè) (visitUrl)。 if (visitUrl == null) { continue。 (100)。 //當(dāng)問訪問的URL隊(duì)列為空,或訪問的網(wǎng)站數(shù)量達(dá)到指定的數(shù)量退出線程。 url = new String(buffer); Spider類 該類封裝了網(wǎng)絡(luò)爬蟲的主要工作流程。 StringBuffer buffer = new StringBuffer()。 // 方法提取網(wǎng)頁(yè)中的URL getUrls((), links)。 提取URL該類主要封裝了分析網(wǎng)頁(yè)并提取URL的方法。 (filePath)。// 讀取為字節(jié)數(shù)組 // 根據(jù)網(wǎng)頁(yè) url 生成保存時(shí)的文件名 fileType = (ContentType).getValue() .toLowerCase()。 filePath = null。 int statusCode = ().getStatusCode()。 // 設(shè)置請(qǐng)求重試處理 // ().setIntParameter(RedirectHandler, true)。 /* GetMethod 對(duì)象并設(shè)置參數(shù) */ HttpGet Get = new HttpGet(url)。 } 網(wǎng)頁(yè)下載DownloadFile類主要封裝了下載網(wǎng)頁(yè)的方法,其中核心代碼 /* HttpClinet 對(duì)象并設(shè)置參數(shù) */ HttpClient Client = new DefaultHttpClient()。 } // 獲得已經(jīng)訪問的URL數(shù)目 public synchronized static int getVisitedUrlNum() { return ()。amp。amp。amp。 } // 未訪問的URL出隊(duì)列 public synchronized static Object unVisitedUrlDeQueue() { return ()。 } // 添加到訪問過的URL隊(duì)列中 public synchronized static void addVisitedUrl(String url) { (url)。unVisitedUrl 用于存放未訪問過的URL集合。 // 待訪問的 url 集合,按優(yōu)先級(jí)從高到底排序 private static QueueString unVisitedUrl = new PriorityQueueString()。 URL隊(duì)列這個(gè)類(LinkQueue)主要封裝了URL的集合和對(duì)它的一些相關(guān)操作。 實(shí)現(xiàn)工具 操作系統(tǒng)是Windows8 ;;。由于可以針對(duì)任意代碼塊,且可任意指定上鎖的對(duì)象,故靈活性較高。當(dāng)然我們可以通過將訪問類成員變量的代碼放到專門的方法中,將其聲明為 synchronized ,并在主方法中調(diào)用來(lái)解決這一問題,但是 Java 為我們提供了更好的解決辦法,那就是 synchronized 塊通過 synchronized關(guān)鍵字來(lái)聲明synchronized 塊。它包括兩種用法:synchronized 方法和 synchronized 塊。在對(duì)臨界資源訪問的時(shí)候必須使用對(duì)象鎖的機(jī)制,避免同時(shí)有多個(gè)線程對(duì)URL集合進(jìn)行操作。 多線程設(shè)計(jì) 為了提高系統(tǒng)的運(yùn)行效率,本系統(tǒng)采用的多線程技術(shù)。它也提供了一個(gè)有用的HTML表單分析器。HttpClient 的范圍通常為:基于HttpCore的客戶端HTTP運(yùn)輸實(shí)現(xiàn)庫(kù);基于經(jīng)典(阻塞)I/O ;內(nèi)容無(wú)關(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)證方案;便攜可靠的套接字工廠使它更容易的使用第三方解決方案;,。雖然在 JDK 的 java net包中已經(jīng)提供了訪問 HTTP 協(xié)議的基本功能,但是對(duì)于大部分應(yīng)用程序來(lái)說(shuō),JDK 庫(kù)本身提供的功能還不夠豐富和靈活。 HttpClient 類庫(kù)與Jericho HTML Parser類庫(kù) 為了簡(jiǎn)化系統(tǒng)實(shí)現(xiàn)難度和提高系統(tǒng)穩(wěn)定性,本系統(tǒng)主要使用了這兩個(gè)第三方類庫(kù),前文已經(jīng)多次提到這兩個(gè)類庫(kù)。:A=4B+C。當(dāng)然這種一般原則并不是固定不變的,在實(shí)際工作中可能會(huì)有一定的變化,但是無(wú)論如何變化,總體上仍然會(huì)遵照這種規(guī)律。在網(wǎng)頁(yè)HTML代碼中,網(wǎng)頁(yè)標(biāo)題位于標(biāo)簽之間。 網(wǎng)頁(yè)相關(guān)度 蜘蛛將網(wǎng)頁(yè)下載到本地后,需要使用基于內(nèi)容的主題判別方法計(jì)算該網(wǎng)頁(yè)的主題相關(guān)度值,主題相關(guān)度低于某一閾值的網(wǎng)頁(yè)被丟棄。HttpClient 已經(jīng)應(yīng)用在很多的項(xiàng)目中,比如 Apache Jakarta 上很著名的另外兩個(gè)開源項(xiàng)目 Cactus 和 HTMLUnit 都使用了 HttpClient。雖然在 JDK 的 包中已經(jīng)提供了訪問 HTTP 協(xié)議的基本功能,但是對(duì)于大部分應(yīng)用程序來(lái)說(shuō),JDK 庫(kù)本身提供的功能還不夠豐富和靈活。 網(wǎng)頁(yè)抓取 為了使系統(tǒng)更快速,更穩(wěn)定,對(duì)于網(wǎng)頁(yè)的抓取使用第三方類庫(kù)HttpClient實(shí)現(xiàn)。當(dāng)這個(gè)List中的數(shù)目過多時(shí),則將List中的內(nèi)容加入到數(shù)據(jù)庫(kù),并清空該List,以便加入新的URLs;第二段為數(shù)據(jù)庫(kù),當(dāng)?shù)谝欢螖?shù)據(jù)過多時(shí),將第一段內(nèi)的數(shù)據(jù)存入數(shù)據(jù)庫(kù);第三段也為一個(gè)List,從這里面分配任務(wù)URL,當(dāng)該List內(nèi)URL不足時(shí),將數(shù)據(jù)庫(kù)里的數(shù)據(jù)再轉(zhuǎn)存入。所以將等待URLs存入數(shù)據(jù)庫(kù)中,并設(shè)計(jì)2個(gè)緩存區(qū),用于向隊(duì)列中加入和取得URLs。Set是一種存放唯一性元素的關(guān)聯(lián)容器,它里面的每一個(gè)元素都稱為關(guān)鍵字,它由二叉搜索樹實(shí)現(xiàn)。這樣待抓取隊(duì)列里的URL越來(lái)越多,并且好多都是重復(fù)的。大家知道,一個(gè)網(wǎng)站中的鏈接非常多,抽象出來(lái)就是一個(gè)巨大的蜘蛛網(wǎng),類似與圖論中的無(wú)向圖。然后再進(jìn)行URL消重處理,最后加入到URL等待隊(duì)列。這些格式的URL是無(wú)法獲取HTML代碼的,也就不可能進(jìn)行URL解析。相對(duì)地址需要先轉(zhuǎn)化為絕對(duì)地址,再進(jìn)行過濾。 URL解析 截取出來(lái)的字符串,可能為相對(duì)地址或者絕對(duì)地址。比如href=”url”這樣情況,我們就可以通過截取雙引號(hào)之間的內(nèi)容來(lái)獲取URL;如果是href=’url’這種情況,我們就需要截取單引號(hào)之間的內(nèi)容來(lái)獲取URL;或者有些是href=url,我們需要以等號(hào)為開始標(biāo)記,而這種情況通常結(jié)尾是空格或者符號(hào)。lia href=XXX/XXX/XXXXX/aem531/em/lilia href=Xxxx/html/ XXXX/a/li 通過觀察得知,一般href標(biāo)簽是以href=這樣的形式出現(xiàn)的。HTML代碼中,頁(yè)面之間的跳轉(zhuǎn),關(guān)聯(lián)是通過href標(biāo)簽來(lái)實(shí)現(xiàn)的。總的來(lái)說(shuō)爬蟲程序根據(jù)輸入獲得URL任務(wù)列表,即初始URL種子,把初始種子保存在臨界區(qū)中,按照廣度搜索運(yùn)算法搜索抓取網(wǎng)頁(yè)并提取URL返回到臨屆區(qū)中,通過判斷主題相關(guān)度算法判斷相關(guān)度,取出不相關(guān)網(wǎng)頁(yè),從而使整個(gè)爬蟲程序循環(huán)運(yùn)行下去。由于 Eclipse 中的每樣?xùn)|西都是插件,對(duì)于給 Eclipse 提供插件,以及給用戶提供一致和統(tǒng)的集成開發(fā)環(huán)境而言,所有工具開發(fā)人員都具有同等的發(fā)揮場(chǎng)所。雖然大多數(shù)用戶很樂于將 Eclipse 當(dāng)作 Java 集成開發(fā)環(huán)境(IDE)來(lái)使用,但 Eclipse 的目標(biāo)卻不僅限于此。就其本身而言,它只是一個(gè)框架和一組服務(wù),用于通過插件組件構(gòu)建開發(fā)環(huán)境。Java平臺(tái)是基于 Java 語(yǔ)言的平臺(tái)。這樣Java程序可以只編譯一次,就可以在各種系統(tǒng)中運(yùn)行。在硬件或操作系統(tǒng)平臺(tái)上安裝一個(gè)Java平臺(tái)之后,Java應(yīng)用程序就可運(yùn)行。Java平臺(tái)由Java虛擬機(jī)(Java Virtual Machine,簡(jiǎn)稱JVM)和Java 應(yīng)用編程接口(Application Programming Interface,簡(jiǎn)稱API)構(gòu)成。由James Gosling和同事們共同研發(fā),并在1995年正式推出。圖32 表示的表用于保存未訪問的URL的信息(URL表)。這是一個(gè)單線程的框架,采用多線程技術(shù)是我們可看成是多個(gè)這個(gè)樣的爬蟲并發(fā)的的執(zhí)行。我們可以把網(wǎng)絡(luò)看成一個(gè)圖M(V,E),網(wǎng)絡(luò)中的網(wǎng)頁(yè)構(gòu)成節(jié)點(diǎn)集V,他們之間的鏈接構(gòu)成邊集E,SPIDER正是從某一節(jié)點(diǎn)開始,沿著邊,遍歷圖M,每訪問到圖中一個(gè)節(jié)點(diǎn)Vi,就進(jìn)行一定的處理。如圖31所示:圖31 系統(tǒng)流程圖站點(diǎn)列表里面存儲(chǔ)著用戶指定的網(wǎng)站首頁(yè)URL,程序運(yùn)行后將其插入到優(yōu)先隊(duì)列,下載模塊從優(yōu)先隊(duì)列里取出URL,把對(duì)應(yīng)的網(wǎng)頁(yè)下載下來(lái),然后將網(wǎng)頁(yè)源碼交給分析模塊,分析模塊對(duì)網(wǎng)頁(yè)進(jìn)行分解,分析模塊維護(hù)著一張字典或Hash表,記錄著所有已經(jīng)訪問的URL,然后分析模塊將所有未訪問過的鏈接URL提取出來(lái)插入到優(yōu)先隊(duì)列,再把提取出的網(wǎng)頁(yè)的標(biāo)題、內(nèi)容、大小等信息存入數(shù)據(jù)庫(kù)。由URL任務(wù)列表開始,根據(jù)預(yù)先設(shè)定的關(guān)鍵字取網(wǎng)頁(yè),同時(shí)判斷URL是否重復(fù),按照一定算法和排序方式搜索頁(yè)面,然后對(duì)頁(yè)面按照一定算法進(jìn)行分析,并提取相關(guān)URL,最后將所得URL返回任務(wù)列表。網(wǎng)絡(luò)蜘蛛把網(wǎng)頁(yè)中的相關(guān)信息抽取出以后插入到數(shù)據(jù)庫(kù)的對(duì)應(yīng)字段中。網(wǎng)絡(luò)遍歷的算法可以是深度優(yōu)先搜索、寬度優(yōu)先搜索、啟發(fā)式搜索等算法。提取網(wǎng)頁(yè)的鏈接也不只是簡(jiǎn)單地提取HTML源碼中所有“href”后面的URL,還包括框架頁(yè)面,以及腳本中的自動(dòng)轉(zhuǎn)向頁(yè)面地址。網(wǎng)頁(yè)的內(nèi)容并不是簡(jiǎn)單地指網(wǎng)頁(yè)的HTML代碼,因?yàn)榇蟛糠值腍TML標(biāo)簽以及JavaScript代碼對(duì)我們的后期要進(jìn)行的查詢工作等都是冗余的,所以應(yīng)該將它們剔除。第三,網(wǎng)絡(luò)蜘蛛只下載網(wǎng)站中的文本信息(如:HTML頁(yè)面、ASP、PHP、JSP等等),并不下載圖片、軟件、視音頻文件等等。其次,網(wǎng)絡(luò)的訪問速度相對(duì)與CPU的運(yùn)算速度來(lái)說(shuō)是非常慢的,因此,如果Web Spider被設(shè)計(jì)成單線程的阻塞模型的程序的話,其抓取速度必然不能讓人滿意。比如說(shuō)在我國(guó),有些網(wǎng)站使用UTF8編碼,有些則使用GB2312。這個(gè)過程看似簡(jiǎn)單,但卻要考慮幾個(gè)問題。網(wǎng)絡(luò)蜘蛛的技術(shù)難度并不是很高,但是要開發(fā)一個(gè)速度快、穩(wěn)定性高的網(wǎng)絡(luò)蜘蛛還是要下一番功夫的。這類爬蟲可以部署很多,而且可以很有侵略性。:很適合部署定題爬蟲,或者叫聚焦爬蟲。(摘自百度百科[5])網(wǎng)絡(luò)爬蟲種類繁多,如果按照部署在哪里分,可以分成::一般是一個(gè)多線程程序,同時(shí)下載多個(gè)目標(biāo)HTML,可以用Java,Python,一般綜合搜索引擎的爬蟲這樣做。定義4:如果超鏈接l指向網(wǎng)頁(yè)t,則網(wǎng)頁(yè)t稱為子網(wǎng)頁(yè),又稱為目標(biāo)網(wǎng)頁(yè)。所有被網(wǎng)絡(luò)爬蟲抓取的網(wǎng)頁(yè)將會(huì)被系統(tǒng)存儲(chǔ),進(jìn)行一定的分析、過濾,并建立索引,對(duì)于主題網(wǎng)絡(luò)爬蟲來(lái)說(shuō),這一過程所得到的分析結(jié)果還可能對(duì)后續(xù)的抓取過程進(jìn)行反饋和指導(dǎo)。通用網(wǎng)絡(luò)爬蟲從一個(gè)或若干初始網(wǎng)頁(yè)的URL開始,獲得初始網(wǎng)頁(yè)上的URL列表;在抓取網(wǎng)頁(yè)的過程中,不斷從當(dāng)前頁(yè)面上抽取新的URL放入待爬行隊(duì)列,直到滿足系統(tǒng)的停止條件。因此需要將最佳優(yōu)先結(jié)合具體的應(yīng)用進(jìn)行改進(jìn),以跳出局部最優(yōu)點(diǎn)。它只訪問經(jīng)過網(wǎng)頁(yè)分析算法預(yù)測(cè)為“有用”的網(wǎng)頁(yè)。如果還存在未被發(fā)現(xiàn)的結(jié)點(diǎn), 則選擇其中一個(gè)作為源結(jié)點(diǎn)并重復(fù)以上過程, 整個(gè)進(jìn)程反復(fù)進(jìn)行直到所有結(jié)點(diǎn)都被發(fā)現(xiàn)為止. 深度優(yōu)先在很多情況下會(huì)導(dǎo)致爬蟲的陷入(trapped)問題, 所以它既不是完備的,也不是最優(yōu)的。本課題選擇使用廣度優(yōu)先策略進(jìn)行網(wǎng)頁(yè)抓取。(6) 繼續(xù)查找V 的其他鄰接頂點(diǎn)col,轉(zhuǎn)到步驟(5),若V 的所有鄰接頂點(diǎn)都已經(jīng)被訪問過,則轉(zhuǎn)到步驟(2)。(4) 查找頂點(diǎn)V 的第一個(gè)鄰接頂點(diǎn)col。(2) 當(dāng)隊(duì)列非空時(shí)繼續(xù)執(zhí)行,否則算法為空。圖的寬度優(yōu)先遍歷需要一個(gè)隊(duì)列作為保存當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。圖的寬度優(yōu)先遍歷(BFS)算法是一個(gè)分層搜索的過程,和樹的層序遍歷算法相同。也有很多研究將寬度優(yōu)先搜索策略應(yīng)用于聚焦爬蟲中. 其基本思想是認(rèn)為與初始URL在一定鏈接距離內(nèi)的網(wǎng)頁(yè)具有主題相關(guān)性的概率很大。在目前為覆蓋盡可能多的網(wǎng)頁(yè)。寬度優(yōu)先搜索算法是沿著樹的寬度遍歷樹的節(jié)點(diǎn), 如果發(fā)現(xiàn)目標(biāo),則算法中止。 寬度優(yōu)先搜索算法(又稱廣度優(yōu)先搜索) 是最簡(jiǎn)便的圖的搜索算法之一,這
點(diǎn)擊復(fù)制文檔內(nèi)容
醫(yī)療健康相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1