上一篇: 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)