日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

實(shí)現(xiàn)Java多線程爬蟲的兩點(diǎn)

汽車玩家 ? 來源: 黑馬程序員 ? 作者: 黑馬程序員 ? 2020-05-05 21:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在我們調(diào)試爬蟲程序的時(shí)候,單線程爬蟲沒什么問題,但是當(dāng)我們?cè)诰€上環(huán)境使用單線程爬蟲程序去采集網(wǎng)頁時(shí),單線程就暴露出了兩個(gè)致命的問題:

采集效率特別慢,單線程之間都是串行的,下一個(gè)執(zhí)行動(dòng)作需要等上一個(gè)執(zhí)行完才能執(zhí)行

對(duì)服務(wù)器的CUP等利用率不高,想想我們的服務(wù)器都是 8核16G,32G 的只跑一個(gè)線程會(huì)不會(huì)太浪費(fèi)啦

線上環(huán)境不可能像我們本地測試一樣,不在乎采集效率,只要能正確提取結(jié)果就行。在這個(gè)時(shí)間就是金錢的年代,不可能給你時(shí)間去慢慢的采集,所以單線程爬蟲程序是行不通的,我們需要將單線程改成多線程的模式,來提升采集效率和提高計(jì)算機(jī)利用率。

多線程的爬蟲程序設(shè)計(jì)比單線程就要復(fù)雜很多,但是與其他業(yè)務(wù)在高并發(fā)下要保證數(shù)據(jù)安全又不同,多線程爬蟲在數(shù)據(jù)安全上到要求不是那么的高,因?yàn)槊總€(gè)頁面都可以被看作是一個(gè)獨(dú)立體。要做好多線程爬蟲就必須做好兩點(diǎn):第一點(diǎn)就是統(tǒng)一的待采集 URL 維護(hù),第二點(diǎn)就是 URL 的去重,下面我們簡單的來聊一聊這兩點(diǎn)。

維護(hù)待采集的 URL

多線程爬蟲程序就不能像單線程那樣,每個(gè)線程獨(dú)自維護(hù)這自己的待采集 URL,如果這樣的話,那么每個(gè)線程采集的網(wǎng)頁將是一樣的,你這就不是多線程采集啦,你這是將一個(gè)頁面采集的多次?;谶@個(gè)原因我們就需要將待采集的 URL 統(tǒng)一維護(hù),每個(gè)線程從統(tǒng)一 URL 維護(hù)處領(lǐng)取采集 URL ,完成采集任務(wù),如果在頁面上發(fā)現(xiàn)新的 URL 鏈接則添加到 統(tǒng)一 URL 維護(hù)的容器中。下面是幾種適合用作統(tǒng)一 URL 維護(hù)的容器:

JDK 的安全隊(duì)列,例如 LinkedBlockingQueue

高性能的 NoSQL,比如 Redis、Mongodb

MQ 消息中間件

URL 的去重

URL 的去重也是多線程采集的關(guān)鍵一步,因?yàn)槿绻蝗ブ氐脑?,那么我們將采集到大量重?fù)的 URL,這樣并沒有提升我們的采集效率,比如一個(gè)分頁的新聞列表,我們?cè)诓杉谝豁摰臅r(shí)候可以得到 2、3、4、5 頁的鏈接,在采集第二頁的時(shí)候又會(huì)得到 1、3、4、5 頁的鏈接,待采集的 URL 隊(duì)列中將存在大量的列表頁鏈接,這樣就會(huì)重復(fù)采集甚至進(jìn)入到一個(gè)死循環(huán)當(dāng)中,所以就需要 URL 去重。URL 去重的方法就非常多啦,下面是幾種常用的 URL 去重方式:

將 URL 保存到數(shù)據(jù)庫進(jìn)行去重,比如 redis、MongoDB

將 URL 放到哈希表中去重,例如 hashset

將 URL 經(jīng)過 MD5 之后保存到哈希表中去重,相比于上面一種,能夠節(jié)約空間

使用 布隆過濾器(Bloom Filter)去重,這種方式能夠節(jié)約大量的空間,就是不那么準(zhǔn)確。

關(guān)于多線程爬蟲的兩個(gè)核心知識(shí)點(diǎn)我們都知道啦,下面我畫了一個(gè)簡單的多線程爬蟲架構(gòu)圖,如下圖所示:

實(shí)現(xiàn)Java多線程爬蟲的兩點(diǎn)

多線程爬蟲架構(gòu)圖

上面我們主要了解了多線程爬蟲的架構(gòu)設(shè)計(jì),接下來我們不妨來試試 Java 多線程爬蟲,我們以采集虎撲新聞為例來實(shí)戰(zhàn)一下 Java 多線程爬蟲,Java 多線程爬蟲中設(shè)計(jì)到了 待采集 URL 的維護(hù)和 URL 去重,由于我們這里只是演示,所以我們就使用 JDK 內(nèi)置的容器來完成,我們使用 LinkedBlockingQueue 作為待采集 URL 維護(hù)容器,HashSet 作為 URL 去重容器。下面是 Java 多線程爬蟲核心代碼,詳細(xì)代碼以上傳 GitHub,地址在文末:

實(shí)現(xiàn)Java多線程爬蟲的兩點(diǎn)

實(shí)現(xiàn)Java多線程爬蟲的兩點(diǎn)

實(shí)現(xiàn)Java多線程爬蟲的兩點(diǎn)

我們用 5 個(gè)線程去采集虎撲新聞列表頁看看效果如果?運(yùn)行該程序,得到如下結(jié)果:

實(shí)現(xiàn)Java多線程爬蟲的兩點(diǎn)

多線程采集結(jié)果

結(jié)果中可以看出,我們啟動(dòng)了 5 個(gè)線程采集了 61 頁頁面,一共耗時(shí) 2 秒鐘,可以說效果還是不錯(cuò)的,我們來跟單線程對(duì)比一下,看看差距有多大?我們將線程數(shù)設(shè)置為 1 ,再次啟動(dòng)程序,得到如下結(jié)果:

實(shí)現(xiàn)Java多線程爬蟲的兩點(diǎn)

單線程運(yùn)行結(jié)果

可以看出單線程采集虎撲 61 條新聞花費(fèi)了 7 秒鐘,耗時(shí)差不多是多線程的 4 倍,你想想這可只是 61 個(gè)頁面,頁面更多的話,差距會(huì)越來越大,所以多線程爬蟲效率還是非常高的。

分布式爬蟲架構(gòu)

分布式爬蟲架構(gòu)是一個(gè)大型采集程序才需要使用的架構(gòu),一般情況下使用單機(jī)多線程就可以解決業(yè)務(wù)需求,反正我是沒有分布式爬蟲項(xiàng)目的經(jīng)驗(yàn),所以這一塊我也沒什么可以講的,但是我們作為技術(shù)人員,我們需要對(duì)技術(shù)保存熱度,雖然不用,但是了解了解也無妨,我查閱了不少資料得出了如下結(jié)論:

分布式爬蟲架構(gòu)跟我們多線程爬蟲架構(gòu)在思路上來說是一樣的,我們只需要在多線程的基礎(chǔ)上稍加改進(jìn)就可以變成一個(gè)簡單的分布式爬蟲架構(gòu)。因?yàn)榉植际脚老x架構(gòu)中爬蟲程序部署在不同的機(jī)器上,所以我們待采集的 URL 和 采集過的 URL 就不能存放在爬蟲程序機(jī)器的內(nèi)存中啦,我們需要將它統(tǒng)一在某臺(tái)機(jī)器上維護(hù)啦,比如存放在 Redis 或者 MongoDB 中,每臺(tái)機(jī)器都從這上面獲取采集鏈接,而不是從 LinkedBlockingQueue 這樣的內(nèi)存隊(duì)列中取鏈接啦,這樣一個(gè)簡單的分布式爬蟲架構(gòu)就出現(xiàn)了,當(dāng)然這里面還會(huì)有很多細(xì)節(jié)問題,因?yàn)槲覜]有分布式架構(gòu)的經(jīng)驗(yàn)

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    3012

    瀏覽量

    116872
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    279

    瀏覽量

    21133
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    黑馬-Java+AI新版V16零基礎(chǔ)就業(yè)班百度云網(wǎng)盤下載+Java+AI全棧開發(fā)工程師

    傳統(tǒng)開發(fā)升級(jí),Java+AI 融合開發(fā)精講——構(gòu)建下一代企業(yè)級(jí)智能應(yīng)用的技術(shù)棧重塑 在人工智能加速滲透至各行各業(yè)的當(dāng)下,Java 開發(fā)者正面臨一個(gè)關(guān)鍵轉(zhuǎn)折點(diǎn):要么被動(dòng)旁觀 AI 能力的邊緣化集成
    發(fā)表于 05-01 11:29

    逆風(fēng)C++QT中控臺(tái)逆向課程

    https://www.bilibili.com/opus/1178756596191199237 QT中控逆向:多線程邏輯與消息處理分析 在軟件逆向工程領(lǐng)域,QT框架因其跨平臺(tái)特性和豐富的功能模塊
    的頭像 發(fā)表于 04-27 10:06 ?71次閱讀

    Java并發(fā)編程的“基石”——多線程概念初識(shí)

    Java 的內(nèi)存可見性機(jī)制(如 happens-before 原則)能夠確保在極端并發(fā)下,任何一個(gè)調(diào)度節(jié)點(diǎn)看到的集群狀態(tài)都是一致且準(zhǔn)確的,從根本上杜絕了“腦裂”和資源超賣。 其次是 精妙的多線程協(xié)同
    發(fā)表于 04-16 18:50

    深視課堂丨點(diǎn)激光位移傳感器SD33系列兩點(diǎn)示教操作指南(第四課)

    在實(shí)際工業(yè)應(yīng)用中,僅設(shè)置單個(gè)閾值點(diǎn)往往無法滿足復(fù)雜檢測任務(wù)的需求。這時(shí),兩點(diǎn)示教模式展現(xiàn)出其獨(dú)特優(yōu)勢(shì),它通過設(shè)定近端和遠(yuǎn)端個(gè)閾值點(diǎn),能夠在設(shè)定區(qū)間內(nèi)穩(wěn)定輸出信號(hào),大幅提升操作易用性,
    的頭像 發(fā)表于 01-19 08:18 ?447次閱讀
    深視課堂丨<b class='flag-5'>點(diǎn)</b>激光位移傳感器SD33系列<b class='flag-5'>兩點(diǎn)</b>示教操作指南(第四課)

    【瑞薩RA × Zephyr評(píng)測】多線程和看門狗

    本文章旨在評(píng)估使用 Zephyr RTOS 在 Renesas FPB-RA6E2 開發(fā)板上實(shí)現(xiàn)多線程調(diào)度與硬件看門狗功能的應(yīng)用。評(píng)估內(nèi)容包括任務(wù)調(diào)度、看門狗初始化流程、主程序邏輯的詳細(xì)解析,以及實(shí)驗(yàn)現(xiàn)象與數(shù)據(jù)分析。
    的頭像 發(fā)表于 01-10 10:23 ?2678次閱讀
    【瑞薩RA × Zephyr評(píng)測】<b class='flag-5'>多線程</b>和看門狗

    京東關(guān)鍵詞搜索商品列表的Python爬蟲實(shí)戰(zhàn)

    京東關(guān)鍵詞搜索商品列表 Python 爬蟲實(shí)戰(zhàn) 你想要實(shí)現(xiàn)京東關(guān)鍵詞搜索商品的爬蟲,我會(huì)從 合規(guī)聲明、環(huán)境準(zhǔn)備、頁面分析、代碼實(shí)現(xiàn)、反爬優(yōu)化 五個(gè)方面展開,幫助你完成實(shí)戰(zhàn)項(xiàng)目。 一、前
    的頭像 發(fā)表于 01-04 10:16 ?1346次閱讀

    解析Linux的進(jìn)程、線程和協(xié)程

    實(shí)現(xiàn)協(xié)程。常見的協(xié)程庫包括libcoro和libco。協(xié)程通常在單線程內(nèi)執(zhí)行,通過手動(dòng)掛起和恢復(fù)來實(shí)現(xiàn)協(xié)程切換。 協(xié)程管理的關(guān)鍵點(diǎn)包括: (1)協(xié)程創(chuàng)建:使用協(xié)程庫提供的函數(shù)來創(chuàng)建和
    發(fā)表于 12-22 11:00

    多線程的系統(tǒng)

    多線程系統(tǒng)的事件響應(yīng)也是在中斷中完成的,但事件的處理是在線程中完成的。在多線程系統(tǒng)中,線程跟中斷一樣,也具有優(yōu)先級(jí),優(yōu)先級(jí)高的線程會(huì)被優(yōu)先執(zhí)
    發(fā)表于 12-08 07:55

    Linux多線程對(duì)比單線程的優(yōu)勢(shì)

    ,而單線程則需要通過進(jìn)程間通信來實(shí)現(xiàn)。「上下文切換開銷小」:線程的上下文切換比進(jìn)程小,因?yàn)樗鼈児蚕硐嗤牡刂房臻g?!柑岣唔憫?yīng)性」:多線程可以使程序更加響應(yīng)用戶輸入或其他事件,避免阻塞。
    發(fā)表于 12-01 06:11

    rt-thread studio 如何進(jìn)行多線程編譯?

    ,使用的是5800h+32g內(nèi)存+sn550 ssd,開啟16線程編譯時(shí)cpu的占用率也只能到30%,編譯完整個(gè)工程需要3分鐘 感覺多線程編譯設(shè)置沒有生效,有辦法提高編譯速度嗎 rtthread studio版本是 2.2.9
    發(fā)表于 10-11 09:16

    Nginx限流與防爬蟲配置方案

    在互聯(lián)網(wǎng)業(yè)務(wù)快速發(fā)展的今天,網(wǎng)站面臨著各種流量沖擊和惡意爬蟲的威脅。作為運(yùn)維工程師,我們需要在保證正常用戶訪問的同時(shí),有效防范惡意流量和爬蟲攻擊。本文將深入探討基于Nginx的限流與防爬蟲解決方案,從原理到實(shí)踐,為大家提供一套完
    的頭像 發(fā)表于 09-09 15:52 ?1094次閱讀

    【HZ-T536開發(fā)板免費(fèi)體驗(yàn)】—— linux創(chuàng)建線程

    的執(zhí)行任務(wù)成為單線程。多線程是程序中包含多個(gè)執(zhí)行流,在一個(gè)程序中可以同時(shí)運(yùn)行多個(gè)不同的線程來執(zhí)行不同的任務(wù)。 多線程提高了CPU的使用鹵率。多線程
    發(fā)表于 09-01 21:31

    多線程的安全注意事項(xiàng)

    多線程安全是指多個(gè)線程同時(shí)訪問或修改共享資源時(shí),能夠保證程序的正確性和可靠性。 開發(fā)者選擇TaskPool或Worker進(jìn)行多線程開發(fā)時(shí),在TaskPool和Worker的工作線程中導(dǎo)
    發(fā)表于 06-20 07:49

    鴻蒙5開發(fā)寶藏案例分享---跨線程性能優(yōu)化指南

    ;>Worker</span>做多線程開發(fā)時(shí),總遇到對(duì)象跨線程卡頓的問題,原來鴻蒙早就提供了解決方案。下面結(jié)合代碼和實(shí)戰(zhàn)案例,帶你徹底玩轉(zhuǎn)性能優(yōu)化! 一、痛點(diǎn):跨線程
    發(fā)表于 06-12 17:13

    工控一體機(jī)多線程任務(wù)調(diào)度優(yōu)化:聚徽分享破解工業(yè)復(fù)雜流程高效協(xié)同密碼

    在當(dāng)今工業(yè) 4.0 的浪潮下,工業(yè)生產(chǎn)正朝著高度自動(dòng)化、智能化的方向大步邁進(jìn)。生產(chǎn)流程日益復(fù)雜,眾多任務(wù)需要同時(shí)、高效地協(xié)同執(zhí)行,這對(duì)工業(yè)控制系統(tǒng)的核心 —— 工控一體機(jī)提出了前所未有的挑戰(zhàn)。多線程
    的頭像 發(fā)表于 05-28 14:06 ?754次閱讀
    宜兰县| 丰顺县| 昭觉县| 德安县| 镇赉县| 孟州市| 来凤县| 化德县| 吴江市| 滦南县| 方城县| 岱山县| 南京市| 兰西县| 临猗县| 洛川县| 武城县| 准格尔旗| 蓬莱市| 鹤庆县| 屏东市| 和平区| 漳浦县| 南木林县| 礼泉县| 盘山县| 镇远县| 大城县| 漳浦县| 阜阳市| 寻乌县| 游戏| 如东县| 秭归县| 岑溪市| 汝阳县| 高雄市| 奉化市| 繁峙县| 乐平市| 正宁县|