上一篇:Java網(wǎng)絡(luò)爬蟲(chóng)實(shí)操(7)
大家好耸别,本篇文章介紹一下NetDiscovery爬蟲(chóng)框架里的downloader對(duì)象
1) 前言
面向?qū)ο笤O(shè)計(jì)仍然是目前編程的核心思想浴讯,從下面截圖可以了解爬蟲(chóng)框架的主要對(duì)象:
程序在本地組織好一個(gè)request后禽篱,交給downloader從網(wǎng)絡(luò)上抓取數(shù)據(jù)到本地,然后由parser處理本地的這些數(shù)據(jù),最終生成可用的信息爵川。
2) downloader介紹
downloader我們也稱(chēng)為下載器,主要功能就是訪(fǎng)問(wèn)網(wǎng)絡(luò)并成功抓回我們要的數(shù)據(jù):例如html網(wǎng)頁(yè)息楔、json/xml數(shù)據(jù)寝贡、二進(jìn)制流(圖片、office文檔等)
目前NetDiscovery支持的downloader實(shí)現(xiàn)有:
面向接口編程是這個(gè)框架的重要設(shè)計(jì)思想之一值依。
以下介紹部分downloader代碼圃泡,這些代碼的共同點(diǎn)是實(shí)現(xiàn)了Downloader接口。
作為程序開(kāi)發(fā)者愿险,你也可以實(shí)現(xiàn)接口com.cv4j.netdiscovery.core.downloader.Downloader颇蜡,創(chuàng)建自己的下載器類(lèi)。
- UrlConnectionDownloader
這個(gè)用的是jdk自帶的包拯啦,java.io澡匪、java.net
//1、構(gòu)建一個(gè)URL對(duì)象
url = new URL(request.getUrl());
//2褒链、獲取一個(gè)HttpURLConnection對(duì)象
conn = url.openConnection();
//3唁情、一堆設(shè)置
conn .setDoOutput(true);
conn .setDoInput(true);
conn .setRequestMethod("POST");
......
//4、訪(fǎng)問(wèn)網(wǎng)絡(luò)服務(wù)
conn.connect();
//5甫匹、執(zhí)行成功的話(huà)甸鸟,獲取結(jié)果
conn.getResponseCode();
conn.getInputStream();
- HttpClientDownloader
這個(gè)是用開(kāi)源包apache httpclient實(shí)現(xiàn)的,代碼就更加簡(jiǎn)潔優(yōu)雅了兵迅。
//1抢韭、獲取一個(gè)HttpManager對(duì)象(框架自己封裝的)
HttpManager httpManager = HttpManager.get();
//2、然后把request扔進(jìn)去恍箭,等結(jié)果就可以了.request也是框架封裝的
httpManager.getResponse(request)
//3刻恭、等來(lái)結(jié)果后,進(jìn)行處理
@Override
public Response apply(CloseableHttpResponse closeableHttpResponse) throws Exception {
String charset = null;
if (Preconditions.isNotBlank(request.getCharset())) {
charset = request.getCharset(); //針對(duì)一些還是GB2312編碼的網(wǎng)頁(yè)
} else {
charset = "UTF-8";
}
String html = EntityUtils.toString(closeableHttpResponse.getEntity(), charset);
Response response = new Response();
response.setContent(html.getBytes());
response.setStatusCode(closeableHttpResponse.getStatusLine().getStatusCode());
if (closeableHttpResponse.containsHeader("Content-Type")) {
response.setContentType(closeableHttpResponse.getFirstHeader("Content-Type").getValue());
}
return response;
}
- VertxDownloader等類(lèi)大家有需要都可以去了解一下扯夭。
3) 總結(jié)
總之鳍贾,爬蟲(chóng)程序本質(zhì)上是一個(gè)網(wǎng)絡(luò)程序,網(wǎng)絡(luò)程序的核心模塊離不開(kāi)對(duì)網(wǎng)絡(luò)數(shù)據(jù)的處理交洗。建議學(xué)習(xí)爬蟲(chóng)的伙伴們骑科,要看源代碼的話(huà),可以先從框架中的downloader相關(guān)代碼開(kāi)始了解构拳。相信一定會(huì)有收獲的咆爽。