Java網路爬蟲實操(2)

sinkinka發表於2018-02-14

上一篇: Java網路爬蟲實操(1)

本篇文章繼續介紹爬蟲框架NetDiscovery的使用:如何發重複請求、如何用爬蟲容器引擎驅動爬蟲程式

1 )重複請求的場景舉例

從2017年下半年開始,比特幣、數字貨幣、虛擬幣、區塊鏈技術、去中心化等等新名詞頻頻出現在媒體上,讓人不想看到都很難。

(本篇文章不研究數字貨幣是不是未來的發展方向)

風險提示:炒幣有風險,入市需謹慎

資料貨幣資訊平臺

找了一個數字貨幣的聚合資訊平臺,上面會定時重新整理每種貨幣的價格。如果要寫一個有實際價值的抓資料程式,那肯定希望這個程式能重複執行抓資料的動作吧。

目標任務:每隔一段時間去獲取這個頁面上的數字貨幣【EOS】的價格資訊

一種數字貨幣的價格資訊

2 )程式碼實現

  • 解析類
package com.sinkinka.parser;

import com.cv4j.netdiscovery.core.domain.Page;
import com.cv4j.netdiscovery.core.parser.Parser;

public class EosParser implements Parser {

   @Override
   public void process(Page page) {

       String xpathStr = "//div[@class='coinprice']/text()";
       String marketPrice = page.getHtml().xpath(xpathStr).get();
       System.out.println("marketPrice=" + marketPrice);

   }
}

複製程式碼
  • 執行方法
package com.sinkinka;

import com.cv4j.netdiscovery.core.Spider;
import com.cv4j.netdiscovery.extra.downloader.httpclient.HttpClientDownloader;
import com.sinkinka.parser.EosParser;

public class EosSpider {

    public static void main(String[] args) {

        String eosUrl = "https://www.feixiaohao.com/currencies/eos/";

        long periodTime = 1000 * 600;

        Spider.create()
                .name("EOS")
                .repeatRequest(periodTime, eosUrl)、
 //下面這行程式碼要注意,要設定>=periodTime,想了解具體作用,可以去分析原始碼
                .initialDelay(periodTime) 
                .parser(new EosParser())
                .downloader(new HttpClientDownloader())
                .run();
    }
}
複製程式碼
  • 執行結果
    演示資料

3 )爬蟲容器引擎

數字貨幣有幾百上千種,每種貨幣資訊都在單獨的頁面上,如果要同時獲取多種數字貨幣的資訊,怎麼處理?

依賴框架,有一種實現方法是:給每種數字貨幣定義一個爬蟲程式,然後把爬蟲程式放到容器裡,統一交給爬蟲引擎去驅動。

程式碼示例:

package com.sinkinka;

import com.cv4j.netdiscovery.core.Spider;
import com.cv4j.netdiscovery.core.SpiderEngine;
import com.cv4j.netdiscovery.extra.downloader.httpclient.HttpClientDownloader;
import com.sinkinka.parser.EosParser;

public class TestSpiderEngine {

    public static void main(String[] args) {
        //爬蟲容器引擎
        SpiderEngine engine = SpiderEngine.create();

        //爬蟲程式1
        String eosUrl = "https://www.feixiaohao.com/currencies/eos/";
        long periodTime1 = 1000 * 5;
        Spider spider1 = Spider.create()
                .name("EOS")
                .repeatRequest(periodTime1, eosUrl)
                .parser(new EosParser())
                .downloader(new HttpClientDownloader())
                .initialDelay(periodTime1);

        engine.addSpider(spider1);

        //可以增加多個爬蟲到容器中,
//        engine.addSpider(spider2);
//        ......

        engine.httpd(8088);     //這一行要注意,通過介面可以獲取訪問爬蟲容器內的狀態
        engine.runWithRepeat();
    }
}
複製程式碼

訪問容器狀態的介面:

介面地址:http://127.0.0.1:8088/netdiscovery/spiders

返回的內容:

{
    "code":200,
    "data":[
        {
            "downloaderType":"HttpClientDownloader",   //用的哪個下載器
            "leftRequestSize":0,                       //佇列中還剩的request數量
            "queueType":"DefaultQueue",                //佇列型別:jdk(DefaultQueue)、redis、kafka
            "spiderName":"EOS",                        //爬蟲的名字,在引擎裡唯一
            "spiderStatus":1,                          //1:執行  2:暫停  4:停止
            "totalRequestSize":1                       //加入到佇列中的request總數量,減去上面的leftRequestSize,等於該爬蟲已經完成的重複請求次數
        }
    ],
    "message":"success"
}
複製程式碼

4 )總結

本篇簡單介紹了NetDiscovery發重複請求這個功能。這就是框架的價值,如果不用框架,自己再去實現的話,要多寫一些程式碼的。 爬蟲引擎還有很多功能,敬請期待。


今天是西方情人節,祝天下有情人節日快樂!

祝大家身體健康、家庭和睦、工作順利!

下一篇:Java網路爬蟲實操(3)

相關文章