高拓展性的Java多線(xiàn)程爬蟲(chóng)框架reptile(個(gè)人開(kāi)源項目)
優(yōu)采云 發(fā)布時(shí)間: 2020-05-07 08:03Reptile是一個(gè)具有高拓展性的可支持單機與集群布署Java多線(xiàn)程爬蟲(chóng)框架,該框架可簡(jiǎn)化爬蟲(chóng)的開(kāi)發(fā)流程。該框架各個(gè)組件高內聚松耦合的特點(diǎn)使用戶(hù)可以對不同組件進(jìn)行訂制來(lái)滿(mǎn)足不同的需求。
Reptile.png
Reptile作為爬蟲(chóng)主體可在主線(xiàn)程運行也可以異步運行,爬蟲(chóng)主要有四個(gè)核心組件:
Downloader 執行懇求下載與解析響應ResponseHandler 由使用者提供實(shí)現來(lái)對響應處理,生成Result結果與新的爬取懇求RequestConsumer 來(lái)對處理的結果Result進(jìn)行消費,例如持久化儲存java單機爬蟲(chóng)框架,用戶(hù)可自定義其具體實(shí)現
四個(gè)組件之間的關(guān)系如構架圖所示,它們之間的相互調用產(chǎn)生一個(gè)完整的工作流并在Workflow線(xiàn)程中運行,Reptile爬蟲(chóng)會(huì )依照配置的線(xiàn)程數目通過(guò)線(xiàn)程池創(chuàng )建指定數目的工作流線(xiàn)程并發(fā)執行工作流任務(wù)。
clone項目并建立發(fā)布到本地庫房
git clone git@github.com:xiepuhuan/reptile.git
cd reptile
mvn -Dmaven.test.skip=true
在項目中使用Maven引入對應的依賴(lài)
<dependency>
<groupId>com.xiepuhuan</groupId>
<artifactId>reptile</artifactId>
<version>0.3</version>
</dependency>
實(shí)現ResponseHandler插口,重寫(xiě)isSupport與handle技巧。實(shí)現Consumer插口java單機爬蟲(chóng)框架,重寫(xiě)consume方式,執行對數據的消費,可在該方式中對響應處理結果進(jìn)行持久化等操作,目前提供了ConsoleConsumer,JsonFileConsumer, MongoDBConsumer等實(shí)現,默認使用ConsoleConsumer。
public class ZhihuPageHandler implements ResponseHandler {
private static final String[] URLS = new String[] {
"https://www.zhihu.com/api/v4/search_v3?t=general&q=java"
};
@Override
public List<Request> handle(Response response, Result result) {
Content content = response.getContent();
JSONObject jsonObject = JSON.parseObject(content.getContent(), JSONObject.class);
result.setResults(jsonObject.getInnerMap());
JSONObject paging = jsonObject.getJSONObject("paging");
if (!paging.getBoolean("is_end")) {
List<Request> requests = new ArrayList<>();
requests.add(new Request(paging.getString("next")));
return requests;
}
return null;
}
@Override
public boolean isSupport(Request request, Response response) {
return true;
}
public static void main(String[] args) {
// 構建Reptile爬蟲(chóng)配置類(lèi),
ReptileConfig config = ReptileConfig.Builder.cutom()
.setThreadCount(8)
.appendResponseHandlers(new ZhihuPageHandler())
.setDeploymentMode(DeploymentModeEnum.SINGLE)
.setConsumer(new ConsoleConsumer())
.build();
// 根據reptile配置構建Reptile爬蟲(chóng)并添加爬去的URL
Reptile reptile = Reptile.create(config).addUrls(URLS);
// 啟動(dòng)爬蟲(chóng)
reptile.start();
}
}
分布式布署時(shí),創(chuàng )建配置類(lèi)時(shí)須要通過(guò)setDeploymentMode方式指定布署模式為DeploymentModeEnum.Distributed,并且須要通過(guò)setScheduler方式設置一個(gè)Redis隊列調度器,可以使用RedisFIFOQueueScheduler作為實(shí)現。



