java调用Linux执行Python爬虫,并将数据存储到elasticsearch中--(java后台代码)
该篇博客主要是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后台代码)的更多相关文章
- java调用Linux执行Python爬虫,并将数据存储到elasticsearch--(环境脚本搭建)
java调用Linux执行Python爬虫,并将数据存储到elasticsearch中 一.以下博客代码使用的开发工具及环境如下: 1.idea: 2.jdk:1.8 3.elasticsearch: ...
- Python2爬虫获取的数据存储到MySQL中时报错"Incorrect string value: '\\xE6\\x96\\xB0\\xE9\\x97\\xBB' for column 'new' at row 1"的解决办法
由于一直使用python3进行编码,在使用Python2时,将爬虫数据连接数据库进行存储时,出现如上的报错,经查资料 是数据库编码问题. 如下转自:http://www.cnblogs.com/liu ...
- 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作(二)
CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...
- 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作
http://www.cnblogs.com/wgp13x/p/4934521.html 内容一样,样式好的版本. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据 ...
- Java调用Linux命令执行
调用方式 Java调用linux命令执行的方式有两种,一种是直接调用linux命令,一种是将linux命令写到.sh脚本中,然后调用脚本执行. 详细说明 直接调用:使用java中lang包下面的Run ...
- Java调用Javascript、Python算法总结
最近项目中经常需要将Javascript或者Python中的算法发布为服务,而发布Tomcat服务则需要在Java中调用这些算法,因此就不免要进行跨语言调用,即在Java程序中调用这些算法. 不管是调 ...
- Java调用Linux命令(cd的处理)
一.Java调用Linux系统的命令非常简单 这是一个非常常用的调用方法示例: public String executeLinuxCmd(String cmd) { System.out.print ...
- java调用cmd执行maven命令
一.原理介绍 Java的Runtime.getRuntime().exec(commandStr)可以调用执行cmd指令. cmd /c dir 是执行完dir命令后封闭命令窗口. cmd /k di ...
- java调用linux下的so库
1.编写java类 public class Abc { static { System.loadLibrary("abc"); } public native static St ...
随机推荐
- 从零开始学 Web 之 DOM(四)节点
大家好,这里是「 Daotin的梦呓 」从零开始学 Web 系列教程.此文首发于「 Daotin的梦呓 」公众号,欢迎大家订阅关注.在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识 ...
- Java并发编程笔记之Timer源码分析
timer在JDK里面,是很早的一个API了.具有延时的,并具有周期性的任务,在newScheduledThreadPool出来之前我们一般会用Timer和TimerTask来做,但是Timer存在一 ...
- 内核开发知识第二讲,编写Kerner 程序中注意的问题.
一丶函数多线程的安全问题 什么是函数多线程安全. 简单来说就是 ,一个函数在调用过程中.还没有返回的时候.再次被其他线程调用了.但是函数执行的结果是可靠的.就可以了说这个函数是安全的. 比如我们在用户 ...
- [转]angular2在运行ng serve的时候卡在95% emitting LicenseWebpackPlugin
本文转自:https://blog.csdn.net/qq919694688/article/details/80912207 放弃使用cnpm,使用yarn 1.删除node_modules (不需 ...
- 如何在framegroup各个frame和window之间共享数据
可以尝试使用execScript,在指定window或者frame中执行脚本,对于frameGroup里面的frame也有效,若name和frameName都未指定,则在当前window中执行脚本,具 ...
- asp.net mvc5轻松实现插件式开发
在研究Nopcommece项目代码的时候,发现Nop.Admin是作为独立项目开发的,但是部署的时候却是合在一起的,感觉挺好 这里把他这个部分单独抽离出来, 主要关键点: 确保你的项目是MVC5 而不 ...
- Java学习笔记之——变量与数据类型、运算符
一.变量 1.变量:变化的值 变量在代码运行期间,开辟了一块空间 .这块空间是有地址的,给这块取了个名字, 这个名字就叫做变量名,这块空间放的东西叫做变量值 2.变量的初始化: (1)先声明再赋值: ...
- 【Dubbo&&Zookeeper】3、Failed to read schema document 'http://code.alibabatech.com/schema/dubbo/dubbo.xsd'问题解决方法
转自:http://blog.csdn.net/gaoshanliushui2009/article/details/50469595 我们公司使了阿里的dubbo,但是阿里的开源网站http://c ...
- 移动端FastClick和editor冲突问题。
FastClick.prototype.needsClickForParent = function (target) { let parent = target.parent ...
- Spring - constructor-arg和property的使用示例
一.说明 constructor-arg:通过构造函数注入. property:通过setter对应的方法注入. 二.property使用实例 1.Model代码: public cla ...