成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java爬取捧腹網(wǎng)段子(多線程版)

gekylin / 429人閱讀

摘要:將內(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

相關(guān)文章

  • java爬取捧腹網(wǎng)段子

    摘要:引入的包用于解析開始分析網(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...

    BoYang 評(píng)論0 收藏0
  • 寫這么系列博客,怪不得找不到女朋友

    摘要:前提好幾周沒(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í)...

    JerryWangSAP 評(píng)論0 收藏0
  • 如何快速掌握Python數(shù)據(jù)采集與網(wǎng)絡(luò)爬蟲技術(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)單的...

    W4n9Hu1 評(píng)論0 收藏0
  • Python入門網(wǎng)絡(luò)爬蟲之精華

    摘要:學(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覽器中輸入...

    Bmob 評(píng)論0 收藏0
  • 首次公開,整理12年積累的博客收藏夾,零距離展示《收藏夾吃灰》系列博客

    摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...

    Harriet666 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<