您的位置:首页 > 其它

使用webpasser爬虫框架对抓取解析后的数据持久化

2016-07-15 09:30 387 查看
摘要: 使用webpasser爬虫框架对抓取解析后的数据持久化

通过webpasser爬虫框架抓取以及解析后的数据是个map,将数据持久化的任务配置是

<!-- 抓取解析后的数据持久化 -->
<resultHandler target="handleResultMapInterface" classPath="com.hxt.webpasser.persistent.impl.DiskJsonHandleResult">
<property name="rootDir" value="downdir/path/test" ></property>
<property name="charSet" value="utf-8" ></property>
</resultHandler>

上述的com.hxt.webpasser.persistent.impl.DiskJsonHandleResult是个持久化的demo(将数据以json的形式保存到硬盘),rootDir和charSet是DiskJsonHandleResult类的两个属性,DiskJsonHandleResult类里rootDir表示将数据存到哪个目录。

自定义持久化类是继承com.hxt.webpasser.persistent.HandleResultMapInterface接口,将持久化操作写在handle方法。如

public class HandleResultServcieDemo implements HandleResultMapInterface{

private String taskName;

public HandleResultServcieDemo(String taskName){
this.taskName= taskName;
}

public void handle(Map<String, Object> resultMap) {

System.out.println("taskName:"+taskName+",data:"+JsonUtil.toJSONString(resultMap));
//持久化具体操作
//如存入mysql,oracle,或push到其他接口

}

public void close() {

}

}

然后任务的配置中改为

<!-- 抓取解析后的数据持久化 -->
<resultHandler target="handleResultMapInterface" classPath="com.hxt.webpasser.persistent.impl.HandleResultServcieDemo">
<!-- 	构造器注入,其中taskName是内置变量 -->
<constructor >
<arg ref="taskName" ></arg>
</constructor>
</resultHandler>

建议另一个系统提供数据存储接口,爬虫系统将数据push到那个接口中。这样爬虫系统不用引用各种数据库驱动包,降低业务处理关联。此种持久化类例子如webpasser.project下的VideoPushServcieImpl(http://git.oschina.net/passer/webpasser/blob/master/webpasser.project/src/main/java/com/hxt/webpasser/persistent/impl/VideoPushServcieImpl.java)。另一系统需要提供http://xxx/xx?json=xxx的形式的http接口,存储成功则返回包含有success的字符串。

/**
* 将数据push到其他系统的接口
*
*/
public class VideoPushServcieImpl implements HandleResultMapInterface{

private String pushUrl;
private HttpClientWrapper httpClientWrapper;

public VideoPushServcieImpl(String taskName){
//读取config.properties
URL path = VideoPushServcieImpl.class.getClassLoader().getResource(
"config.properties");
Properties properties = new Properties();
try {
properties.load(ResourceUtil.getResourceStream("/config.properties"));
} catch (IOException e) {
e.printStackTrace();
}

pushUrl=properties.getProperty("pushUrl");
httpClientWrapper=new HttpClientWrapper();
httpClientWrapper.setCharset("utf-8");

}

public void handle(Map<String, Object> resultMap) {

Map<String, String> paramMap=new HashMap<String, String>();
String json=JsonUtil.toJSONString(resultMap);
paramMap.put("json", json);
boolean isFail=true;
try {
String con=httpClientWrapper.post(pushUrl, paramMap);
if(con.indexOf("success")>-1){
isFail=false;
}
} catch (Exception e) {
e.printStackTrace();
isFail=true;
}
if(isFail){
//写入日志
}
}
public void close() {

}

}

当然,如果业务简单,需要数据库的持久化通用类,后面会增加。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息