摘要:將內(nèi)容格式化作者第頁(yè)第頁(yè)內(nèi)容爬取完畢。。。
前文鏈接 : java爬取捧腹網(wǎng)段子
上一篇文章講述了如何使用Java爬取內(nèi)容并寫入文件,但是速度堪憂,今天將代碼搞成了多線程版本,
具體方式如下:
新建一個(gè)splider類,繼承callable接口,用于存放我們需要多線程執(zhí)行的邏輯:
將上一篇文章中爬取網(wǎng)頁(yè)內(nèi)容的代碼搬過(guò)來(lái)
public class Splider implements Callable { // 使用atomicInteger保證共享變量的安全自增 private AtomicInteger pageNum = new AtomicInteger(0); @Override public StringBuilder call() throws Exception { // 當(dāng)前頁(yè)碼 Integer privateNum = this.pageNum.addAndGet(1); // 存儲(chǔ)當(dāng)前頁(yè)的文本 StringBuilder currentPageText = new StringBuilder(); System.out.println("正在爬取第" + privateNum + "頁(yè)內(nèi)容。。。"); String html = ConnectionUtil.Connect("https://www.pengfu.com/xiaohua_" + privateNum + ".html"); Document doc = Jsoup.parse(html); Elements titles = doc.select("h1.dp-b"); for (Element titleEle : titles) { Element parent = titleEle.parent(); String title = titleEle.getElementsByTag("a").text(); String author = parent.select("p.user_name_list > a").text(); String content = parent.select("div.content-img").text(); // 將內(nèi)容格式化 currentPageText.append(title) .append(" 作者:").append(author) .append(" ").append(content) .append(" ").append(" "); } currentPageText.append("-------------第").append(privateNum).append("頁(yè)-------------").append(" "); System.out.println("第" + privateNum + "頁(yè)內(nèi)容爬取完畢。。。"); // 將當(dāng)前頁(yè)內(nèi)容返回給future對(duì)象 return currentPageText; } }
主函數(shù):
public static void main(String[] args) throws ExecutionException, InterruptedException { long startTime = System.currentTimeMillis(); // 創(chuàng)建大小為5的線程池 ExecutorService esPool = Executors.newFixedThreadPool(5); List> futureList = new ArrayList<>(); Splider splider = new Splider(); for (int i = 1; i <= 10; i++) { futureList.add(esPool.submit(splider)); } List finishCount = new ArrayList<>(); for (Future future : futureList) { // 線程結(jié)束,將線程返回的內(nèi)容添加到list finishCount.add(future.get()); } /* * 所有內(nèi)容爬取完畢,將內(nèi)容統(tǒng)一寫入磁盤 */ if (finishCount.size() == 10) { StringBuilder allText = new StringBuilder(); /* * finishCount中future.get()的順序 和 futureList中的future順序一致 * 所以內(nèi)容是從第1頁(yè)...第N頁(yè)順序?qū)懭? */ for (StringBuilder pageNum : finishCount) { allText.append(pageNum); } // 寫入磁盤 Test.writeToFile(allText.toString()); long endTime = System.currentTimeMillis(); System.out.println("耗時(shí) : " + (endTime - startTime)); // 關(guān)閉線程池 esPool.shutdownNow(); } }
執(zhí)行結(jié)果:
查看本地文件,順序和內(nèi)容也都沒(méi)有問(wèn)題:
總結(jié):
多個(gè)線程共享變量,只new一個(gè)實(shí)例,傳給多個(gè)線程使用;
可以使用atomit類、synchronized、volitaile、lock保證多線程共享變量的安全性;
future.get()順序和executorService.submit()順序一致,和誰(shuí)先執(zhí)行完畢無(wú)關(guān)
使用callable + future可以獲取線程返回值、捕獲;
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76671.html
摘要:引入的包用于解析開始分析網(wǎng)站捧腹網(wǎng)段子首先找到我們需要的內(nèi)容作者標(biāo)題和正文查看其元素,我這里查看的是標(biāo)題標(biāo)簽知道其結(jié)構(gòu)之后,就可以獲取我們想要的內(nèi)容了正在爬取第頁(yè)內(nèi)容。。。將內(nèi)容寫入磁盤參考文章爬蟲入門一爬取糗百 先上效果圖: showImg(https://segmentfault.com/img/bVbe5kf?w=1001&h=320); showImg(https://segm...
摘要:前提好幾周沒(méi)更新博客了,對(duì)不斷支持我博客的童鞋們說(shuō)聲抱歉了。熟悉我的人都知道我寫博客的時(shí)間比較早,而且堅(jiān)持的時(shí)間也比較久,一直到現(xiàn)在也是一直保持著更新狀態(tài)。 showImg(https://segmentfault.com/img/remote/1460000014076586?w=1920&h=1080); 前提 好幾周沒(méi)更新博客了,對(duì)不斷支持我博客的童鞋們說(shuō)聲:抱歉了!。自己這段時(shí)...
摘要:通過(guò)本文的學(xué)習(xí),可以快速掌握網(wǎng)絡(luò)爬蟲基礎(chǔ),結(jié)合實(shí)戰(zhàn)練習(xí),寫出一些簡(jiǎn)單的爬蟲項(xiàng)目。從技術(shù)手段來(lái)說(shuō),網(wǎng)絡(luò)爬蟲有多種實(shí)現(xiàn)方案,如。二網(wǎng)絡(luò)爬蟲技術(shù)基礎(chǔ)在本次課中,將使用技術(shù)手段進(jìn)行項(xiàng)目的編寫。 摘要:本文詳細(xì)講解了python網(wǎng)絡(luò)爬蟲,并介紹抓包分析等技術(shù),實(shí)戰(zhàn)訓(xùn)練三個(gè)網(wǎng)絡(luò)爬蟲案例,并簡(jiǎn)單補(bǔ)充了常見(jiàn)的反爬策略與反爬攻克手段。通過(guò)本文的學(xué)習(xí),可以快速掌握網(wǎng)絡(luò)爬蟲基礎(chǔ),結(jié)合實(shí)戰(zhàn)練習(xí),寫出一些簡(jiǎn)單的...
摘要:學(xué)習(xí)網(wǎng)絡(luò)爬蟲主要分個(gè)大的版塊抓取,分析,存儲(chǔ)另外,比較常用的爬蟲框架,這里最后也詳細(xì)介紹一下。網(wǎng)絡(luò)爬蟲要做的,簡(jiǎn)單來(lái)說(shuō),就是實(shí)現(xiàn)瀏覽器的功能。 Python學(xué)習(xí)網(wǎng)絡(luò)爬蟲主要分3個(gè)大的版塊:抓取,分析,存儲(chǔ) 另外,比較常用的爬蟲框架Scrapy,這里最后也詳細(xì)介紹一下。 首先列舉一下本人總結(jié)的相關(guān)文章,這些覆蓋了入門網(wǎng)絡(luò)爬蟲需要的基本概念和技巧:寧哥的小站-網(wǎng)絡(luò)爬蟲,當(dāng)我們?cè)跒g覽器中輸入...
摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
閱讀 3380·2021-11-04 16:10
閱讀 3878·2021-09-29 09:43
閱讀 2714·2021-09-24 10:24
閱讀 3385·2021-09-01 10:46
閱讀 2523·2019-08-30 15:54
閱讀 603·2019-08-30 13:19
閱讀 3252·2019-08-29 17:19
閱讀 1068·2019-08-29 16:40