该篇博客主要是java代码,如需相应脚本及java连接elasticsearch工具类代码,请移步到上一篇博客(https://www.cnblogs.com/chenyuanbo/p/9973685.html)

一、创建连接执行Linux脚本工具类

package com.yjlc.platform.utils.Elasticsearch;

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.StreamGobbler; import java.io.*;
/**
* --------------------------------------------------------------
* CopyRights(c)2018,YJLC
* All Rights Reserved
* <p>
* FileName: SingletonUtil.java
* Description:
* Author: cyb
* CreateDate: 2018-11-15
* --------------------------------------------------------------
*/
public class SingletonUtil {
//无参构造
private SingletonUtil(){}
private volatile static SingletonUtil instance;
//字符编码默认是utf-8
public static String DEFAULTCHART="UTF-8";
public static Connection conn;
private String ip;
private String userName;
private String userPwd;
public static Boolean flag=false;
//有参构造
public SingletonUtil(String ip, String userName, String userPwd) {
this.ip = ip;
this.userName = userName;
this.userPwd = userPwd;
} public SingletonUtil getInstance(String ip, String userName, String userPwd){
if(instance==null){
synchronized(SingletonUtil.class){
//防止多线程多次创建
if(instance==null){
instance=new SingletonUtil(ip,userName, userPwd);
}
}
}
flag= instance.login();//调用登录方法
return instance;
}
//登录
public Boolean login(){
boolean flg=false;
try {
System.out.println("进入连接");
conn = new Connection(ip);
try {
conn.connect();//连接
} catch (IOException e) {
e.printStackTrace();
}
flg=conn.authenticateWithPassword(userName, userPwd);//认证
if (flg){
System.out.println("认证成功!");
}
} catch (IOException e) {
e.printStackTrace();
}
return flg;
} /**
*@description:纯文本格式返回
*@author:cyb
*@date: 2018-11-15 16:56
*@param: in
*@param: charset
*@return: java.lang.String
*/
public static String processStdout(InputStream in, String charset){
InputStream stdout = new StreamGobbler(in);
StringBuffer buffer = new StringBuffer();;
try {
BufferedReader br = new BufferedReader(new InputStreamReader(stdout,charset));
String line=null;
while((line=br.readLine()) != null){
buffer.append(line+"\n");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return buffer.toString();
}
}

二、控制层

/**
*@description:开启爬虫
*@author:cyb
*@date: 2018-11-14 15:59
*@param: id
*@param: execute
*@return: java.util.Map<java.lang.String,java.lang.Object>
*/
@RequestMapping("openTask")
@ResponseBody
public Map<String,Object> openTask(String id,Boolean execute){
Map<String,Object> map = new HashMap<>();
//根据id查询任务详细信息
BsKnowledgeInfoDTO knowledgeInfoDTO= knolegeService.getDataInfoById(id);
if(execute==true){
execute=false;
}else {
execute=true;
}
knowledgeInfoDTO.setExecute(execute);//修改任务的状态(开启、关闭)
int k = knolegeService.updateDataInfo(knowledgeInfoDTO);
// StringBuilder url = new StringBuilder(knowledgeInfoDTO.getPath()) ;//爬虫目标路径
StringBuilder url= new StringBuilder("https://mil.news.sina.com.cn/");
StringBuilder reptileMethod= new StringBuilder("http://192.168.200.8:8000/news");//爬虫方法http://192.168.200.8:8000/news
StringBuilder themeid= new StringBuilder("hottopic");//存储索引名称
//http://192.168.200.8:8000/news?themeid=hottopic&url=https://mil.news.sina.com.cn/history/2018-11-15/doc-ihmutuec0443667.shtml
StringBuilder path =reptileMethod.append("?").append("themid=").append(themeid).append("&").append("url=").append(url);
String ip="192.168.200.8";//Linux 路径
String userName ="root";
String userPwd ="yjlc20148";
int w = knolegeService.reptile(path.toString(),ip,userName,userPwd);
if(w==200){
map.put("code",200);
map.put("message","爬虫成功!");
}else if(w==206){
map.put("code",206);
map.put("message","连接失败!");
}
return map;
}

三、service层(此处省略了service接口层)

/**
*@description: 爬虫
*@author:cyb
*@date: 2018-11-15 20:52
*@param: path 爬虫方法路径+ES存储索引+爬虫目标url合集
*@param: ip 连接ip地址
*@param: userName :用户名
*@param: userPwd:用户密码
*@return: int
*/
@Override
public int reptile(String path,String ip,String userName,String userPwd) {
SingletonUtil singletonUtil = new SingletonUtil("192.168.200.8", "root","yjlc20148");
singletonUtil.getInstance(ip, userName,userPwd);
Boolean b =SingletonUtil.flag;//看是否连接成功
if(b==true){
System.out.println("=====第一个步骤=====");
Session session= null;//打开一个会话
try {
session = singletonUtil.conn.openSession();
session.execCommand("sh /opt/zc/linux_sina.sh");//执行命令
} catch (IOException e) {
e.printStackTrace();
}
//TODO:多条命令
String result=singletonUtil.processStdout(session.getStdout(),singletonUtil.DEFAULTCHART);
//如果为得到标准输出为空,说明脚本执行出错了
if(StringUtils.isBlank(result)){
System.out.println("脚本出错");
result=singletonUtil.processStdout(session.getStderr(),singletonUtil.DEFAULTCHART);
}
System.out.println("第一个步骤脚本运行成功"+result);
ConnectNetworkUtil connectNetworkUtil = new ConnectNetworkUtil();
connectNetworkUtil.ConnectNetwork(path);
System.out.println("采集成功!");
session.close();//关闭session
singletonUtil.conn.close();//爬虫关闭连接
return 200;//爬虫成功
}else {
return 206;//连接失败
} }

以上代码已省略了service接口层和java连接elasticsearch工具类(上一篇博客中已写到),以上代码仅供参考,若代码中有不合理或者不规范的地方,请各位指出,技术在于交流!

java调用Linux执行Python爬虫,并将数据存储到elasticsearch中--(java后台代码)的更多相关文章

  1. java调用Linux执行Python爬虫,并将数据存储到elasticsearch--(环境脚本搭建)

    java调用Linux执行Python爬虫,并将数据存储到elasticsearch中 一.以下博客代码使用的开发工具及环境如下: 1.idea: 2.jdk:1.8 3.elasticsearch: ...

  2. Python2爬虫获取的数据存储到MySQL中时报错"Incorrect string value: '\\xE6\\x96\\xB0\\xE9\\x97\\xBB' for column 'new' at row 1"的解决办法

    由于一直使用python3进行编码,在使用Python2时,将爬虫数据连接数据库进行存储时,出现如上的报错,经查资料 是数据库编码问题. 如下转自:http://www.cnblogs.com/liu ...

  3. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作(二)

    CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...

  4. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作

    http://www.cnblogs.com/wgp13x/p/4934521.html 内容一样,样式好的版本. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据 ...

  5. Java调用Linux命令执行

    调用方式 Java调用linux命令执行的方式有两种,一种是直接调用linux命令,一种是将linux命令写到.sh脚本中,然后调用脚本执行. 详细说明 直接调用:使用java中lang包下面的Run ...

  6. Java调用Javascript、Python算法总结

    最近项目中经常需要将Javascript或者Python中的算法发布为服务,而发布Tomcat服务则需要在Java中调用这些算法,因此就不免要进行跨语言调用,即在Java程序中调用这些算法. 不管是调 ...

  7. Java调用Linux命令(cd的处理)

    一.Java调用Linux系统的命令非常简单 这是一个非常常用的调用方法示例: public String executeLinuxCmd(String cmd) { System.out.print ...

  8. java调用cmd执行maven命令

    一.原理介绍 Java的Runtime.getRuntime().exec(commandStr)可以调用执行cmd指令. cmd /c dir 是执行完dir命令后封闭命令窗口. cmd /k di ...

  9. java调用linux下的so库

    1.编写java类 public class Abc { static { System.loadLibrary("abc"); } public native static St ...

随机推荐

  1. Linux 学习手记(1):命令行BASH的基本操作

    1. Shell 是什么 Shell(壳)是用户与操作系统底层(通常是内核)之间交互的中介程序,负责将用户指令.操作传递给操作系统底层. Shell一般分为:图形化Shell(GUI).命令行Shel ...

  2. Eureka多机高可用

    线上Eureka高可用集群,至少三个节点组成一个集群,推荐部署在不同的服务器上,IP用域名绑定,端口保持一致. 10.1.22.26:876210.1.22.27:876210.1.22.28:876 ...

  3. idea 中解决maven 包冲突的问题(maven helper)

    转:链接 一.冲突问题 比如项目中引用了两个 fastjson.jar的版本,分别为 fastjson:1.2.28fastjson:1.2.3 我们用到了1.2.28中的某个类, 比如 A类,在版本 ...

  4. CEF C++环境搭建

    第一步:下载CEF 到这里下载最新版本的CEF http://cefbuilds.com/ 下载解压之后,大概会看到如下图所示的文件 cefclient:是一个比较复杂的示例代码cefsimple:是 ...

  5. [Luogu 3613] 睡觉困难综合征

    Description 给定一棵 \(n\) 个点的树,每个点上有位运算 \(opt\) 和一个权值 \(x\),位运算有 &,|,^ 三种. 要求支持: 修改点 \(v\) 的 \(opt\ ...

  6. Linux进程间通信(System V) --- 消息队列

    消息队列 IPC 原理 消息队列是消息的链式队列,如下图为消息队列的模型.整个消息队列有两种类型的数据结构. 1.msqid_ds 消息队列数据结构:描述整个消息队列的属性,主要包括整个消息队列的权限 ...

  7. Linux终端命令全面介绍

    Linux终端命令 一.文件目录类 1.建立目录:mkdir 目录名2.删除空目录:rmdir 目录名3.无条件删除子目录: rm -rf 目录名4.改变当前目录:cd 目录名 (进入用户home目录 ...

  8. AngularJS+Ionic开发-1.搭建开发环境

    临时项目需要使用AngularJS+Ionic+Cordova技术,半年前跟别人用过一段时间做过几个页面,目前别人已经无法联系了,只能我自己上了. 上次做完项目后,想抽时间好好巩固一下这方面的知识面来 ...

  9. linux下使用gcc编译运行C/C++程序

    编译C  首先,程序编译过程有: 1.预处理(展开宏,头文件,检查代码是否有误) 2.编译(将.c转为汇编代码.s) 3.汇编(将汇编代码.s转为机器代码.o) 4.链接(将所有机器代码.o和库文件链 ...

  10. 二进制值和十六进制字符串相互转换的C++代码

    #include <iostream> #include <string> #include <stdint.h> using namespace std; str ...