本篇文章繼續(xù)介紹爬蟲框架NetDiscovery的使用:如何發(fā)重復(fù)請求涧狮、如何用爬蟲容器引擎驅(qū)動爬蟲程序
1 )重復(fù)請求的場景舉例
從2017年下半年開始,比特幣、數(shù)字貨幣般卑、虛擬幣擒贸、區(qū)塊鏈技術(shù)干旁、去中心化等等新名詞頻頻出現(xiàn)在媒體上盖喷,讓人不想看到都很難
(本篇文章不研究數(shù)字貨幣是不是未來的發(fā)展方向)
風(fēng)險提示:炒幣有風(fēng)險,入市需謹(jǐn)慎
找了一個數(shù)字貨幣的聚合信息平臺雷绢,上面會定時刷新每種貨幣的價格泛烙。如果要寫一個有實際價值的抓數(shù)據(jù)程序,那肯定希望這個程序能重復(fù)執(zhí)行抓數(shù)據(jù)的動作吧翘紊。
目標(biāo)任務(wù):每隔一段時間去獲取這個頁面上的數(shù)字貨幣【EOS】的價格信息
2 )代碼實現(xiàn)
- 解析類
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 = "http://div[@class='coinprice']/text()";
String marketPrice = page.getHtml().xpath(xpathStr).get();
System.out.println("marketPrice=" + marketPrice);
}
}
- 執(zhí)行方法
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)胶惰、
//下面這行代碼要注意,要設(shè)置>=periodTime霞溪,想了解具體作用孵滞,可以去分析源代碼
.initialDelay(periodTime)
.parser(new EosParser())
.downloader(new HttpClientDownloader())
.run();
}
}
-
執(zhí)行結(jié)果
3 )爬蟲容器引擎
數(shù)字貨幣有幾百上千種,每種貨幣信息都在單獨的頁面上鸯匹,如果要同時獲取多種數(shù)字貨幣的信息坊饶,怎么處理?
依賴框架殴蓬,有一種實現(xiàn)方法是:給每種數(shù)字貨幣定義一個爬蟲程序匿级,然后把爬蟲程序放到容器里,統(tǒng)一交給爬蟲引擎去驅(qū)動染厅。
代碼示例:
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); //這一行要注意痘绎,通過接口可以獲取訪問爬蟲容器內(nèi)的狀態(tài)
engine.runWithRepeat();
}
}
訪問容器狀態(tài):
接口地址:http://127.0.0.1:8088/netdiscovery/spiders
返回的內(nèi)容:
{
"code":200,
"data":[
{
"downloaderType":"HttpClientDownloader", //用的哪個下載器
"leftRequestSize":0, //隊列中還剩的request數(shù)量
"queueType":"DefaultQueue", //隊列類型:jdk(DefaultQueue)、redis肖粮、kafka
"spiderName":"EOS", //爬蟲的名字孤页,在引擎里唯一
"spiderStatus":1, //1:運行 2:暫停 4:停止
"totalRequestSize":1 //加入到隊列中的request總數(shù)量,減去上面的leftRequestSize涩馆,等于該爬蟲已經(jīng)完成的重復(fù)請求次數(shù)
}
],
"message":"success"
}
4 )總結(jié)
本篇簡單介紹了NetDiscovery中發(fā)重復(fù)請求這個功能行施。這就是框架的價值,如果不用框架魂那,自己再去實現(xiàn)的話蛾号,要多寫一些代碼的。
爬蟲引擎還有很多功能涯雅,敬請期待鲜结。
今天是西方情人節(jié),祝天下有情人節(jié)日快樂!
祝大家身體健康精刷、家庭和睦拗胜、工作順利!