V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
backfrw
V2EX  ›  Java

请教一个 Java 获得 Python 执行结果的方法

  •  
  •   backfrw · 2017-04-13 23:43:45 +08:00 · 7196 次点击
    这是一个创建于 2814 天前的主题,其中的信息可能已经有所发展或是发生改变。
    前段时间交了毕业设计的开题报告,本来打算就 java 写个网站,老师说不行,太简单,改报告。。。
    最后是 python 写爬虫,通过关键字爬取信息,存数据库,用 java 的 SSM 框架写个后台,从数据库获得关键字相关的信息展示在页面上,之前想的是关键字通过 java 存数据库, python 从数据库拿关键字爬网站,算是通过开题报告了

    等真正开始写才觉得不对,主要流程上 java 怎么在 python 结束后运行,就把自己想死机了。。。。

    长期潜水看 V2EX 学姿势,大佬们能不能讲讲怎么开发比较容易啊?
    目前是 python 小白,正在一边看教程一边写
    42 条回复    2017-05-20 11:41:43 +08:00
    pierre1994
        1
    pierre1994  
       2017-04-13 23:45:46 +08:00
    rpc
    backfrw
        2
    backfrw  
    OP
       2017-04-13 23:57:34 +08:00
    @pierre1994 好的,我去研究,谢谢大佬
    ChasYuan
        3
    ChasYuan  
       2017-04-14 00:14:49 +08:00 via Android
    感觉楼主和我毕设差不多啊。不会一个专业吧。。我都是用 Java 实现的
    backfrw
        4
    backfrw  
    OP
       2017-04-14 00:17:32 +08:00
    @ChasYuan 网络工程,,,应该不是一个专业吧
    casparchen
        5
    casparchen  
       2017-04-14 00:57:58 +08:00
    java 不该从数据库读数据么,应该和 python 没关系吧
    backfrw
        6
    backfrw  
    OP
       2017-04-14 01:16:48 +08:00
    @casparchen 但是没有 java 存的关键字, python 不知道爬什么,没有 python 爬的数据, java 不知道展示什么,似乎陷入了循环
    casparchen
        7
    casparchen  
       2017-04-14 01:36:49 +08:00
    @backfrw python 每隔 10 秒读一下数据库?
    Lpl
        8
    Lpl  
       2017-04-14 02:47:21 +08:00 via iPhone   ❤️ 1
    写一个 webhook , java 出现存储关键字的操作后,通过 hook 通知 python 关键字更新了
    NoAnyLove
        9
    NoAnyLove  
       2017-04-14 03:01:16 +08:00   ❤️ 1
    以前看过一种设计,为了尽量的解耦合,不同部分都是通过数据库进行数据交换,所以每个部分都要周期性地读取数据库,如果有了数据就执行,没有就继续睡大觉。好处是实现简单,而且各部分没有很强的依赖关系。虽然获取数据会有一定延迟,不过应该能满足需求。

    此外,也许可以试试 Pyro , Python 端提供远程对象调用,同时又 Java 和.net 端接口。我没用过,但是感觉应该能满足你的需求 https://pythonhosted.org/Pyro4/pyrolite.html
    Lpl
        10
    Lpl  
       2017-04-14 03:05:06 +08:00
    忘了说了,不建议你去用 rpc ,用 rpc 还得考虑协议、序列化的东西。对于你要实现的东西来说太重,并且没有意义。市面上比较常见的与语言无关的 rpc 框架是 gRPC 。

    大概跟你讲下,你使用 java 写个简单的存储操作,有个 web 端的界面,存储操作简称“操作 A ”。你用 Python 写个 post 类型的接口,这个接口简称“接口 B ”。

    当你发生操作 A 的时候,向接口 B 发送 POST 请求,这个请求的数据可以是你新增的标签。如果 B 接收到请求,那么就开始爬网站,然后写入数据库。有了数据后, Java 自然就可以拿数据出来做展示。这就相当于一个简单的钩子
    Lpl
        11
    Lpl  
       2017-04-14 03:07:37 +08:00   ❤️ 1
    这样子做的话能解耦,比如说:你有多台爬虫机,那么就会有多个接口。你可以把接口在 java 端写活,比如存储进数据库。当你 java 发生存储操作的时候,就向数据库中的这些接口发送请求。

    嗯,这样子也有利于你的功能扩展
    Cbdy
        12
    Cbdy  
       2017-04-14 08:17:13 +08:00 via Android   ❤️ 1
    java 在 python 结束后运行?
    python pyapp.py | java -jar japp.jar

    或者起一个 Java 主进程,当需要爬东西的时候由这个进程 fork 一个 python 进程跑爬虫, java 阻塞直到 python 进程返回,有兴趣的话还可以研究一下 jython
    wwqgtxx
        13
    wwqgtxx  
       2017-04-14 08:27:01 +08:00 via iPhone
    消息交互用 rabbitmq 来交互不就行了
    louzhumuyou
        14
    louzhumuyou  
       2017-04-14 08:41:03 +08:00
    @Lpl 同样推荐 webhook 。👍
    arischow
        15
    arischow  
       2017-04-14 08:43:48 +08:00 via iPhone
    redis
    zwl2012
        16
    zwl2012  
       2017-04-14 09:08:14 +08:00 via iPhone
    为什么不统一语言呢? JAVA 也可以做爬虫呀
    hand515
        17
    hand515  
       2017-04-14 09:32:52 +08:00   ❤️ 1
    数据库生成一个任务记录, python 完成后更新状态, java 轮询状态,这不就很简单了吗。
    数据库改为 redis 效率更高, 还可以通过 pub/sub 实时通知
    kimchan
        18
    kimchan  
       2017-04-14 09:34:50 +08:00
    本来就是两个独立服务. 用接口不是很简单吗?
    blackFool
        19
    blackFool  
       2017-04-14 09:48:42 +08:00
    kafka
    domty
        20
    domty  
       2017-04-14 09:54:29 +08:00
    没考虑过用消息队列解耦
    woostundy
        21
    woostundy  
       2017-04-14 10:14:43 +08:00   ❤️ 1
    拿 redis 做个消息队列呗。
    vjnjc
        22
    vjnjc  
       2017-04-14 10:19:33 +08:00   ❤️ 1
    简单的来说楼主是缺乏出发程序的时机,那这样就简单了。
    python 操作好了通过 http 访问 java 后台接口,反之亦然
    ipwx
        23
    ipwx  
       2017-04-14 10:22:29 +08:00   ❤️ 1
    restful api
    bk201
        24
    bk201  
       2017-04-14 10:25:17 +08:00
    我都觉得根本不需要数据库
    debuggerx
        25
    debuggerx  
       2017-04-14 10:51:38 +08:00   ❤️ 1
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;

    /**
    * Created by debuggerx on 17-2-14.
    */
    public class ImageLocalizationUtil {
    public static String ImageLocalization(String uploadpath , String content) {
    String res = "";
    try {
    String[] cmd = {"python", uploadpath + "/ImageLocalization.py" ,uploadpath + "/xiumi/", content};
    Process process = Runtime.getRuntime().exec(cmd);
    String line = null;

    InputStream is = process.getInputStream();

    BufferedReader reader = new BufferedReader(new InputStreamReader(is));

    while ((line = reader.readLine()) != null) {
    System.out.println(line);
    res += line;
    }
    //process.waitFor();
    is.close();
    reader.close();
    process.destroy();

    } catch (Exception e) {
    e.printStackTrace();
    }
    return res;
    }
    }

    我这个因为就在一台服务器上跑的,所以 java 调用 python 并阻塞就拉倒了。。
    或者直接用 linux 的 pipe 管道做通讯,直接重定向输入输出就很随意了。
    不同机器上最简单的就是 python 执行结束后 urllib 调一下 java 写的 web 接口了事
    backfrw
        26
    backfrw  
    OP
       2017-04-14 11:08:15 +08:00
    @Lpl @NoAnyLove @wwqgtxx @ipwx 谢谢大佬,感觉学到了新东西
    backfrw
        27
    backfrw  
    OP
       2017-04-14 11:12:10 +08:00
    @Cbdy @arischow @hand515 @vjnjc 谢谢啦,回头试试
    backfrw
        28
    backfrw  
    OP
       2017-04-14 11:14:51 +08:00
    @zwl2012 因为老师没给过
    backfrw
        29
    backfrw  
    OP
       2017-04-14 11:15:15 +08:00
    @debuggerx 谢谢大佬,学到了
    RFC2109
        30
    RFC2109  
       2017-04-14 11:18:31 +08:00   ❤️ 1
    从场景上来说,应该用消息队列。用 redis 的 pub sub 就可以了。
    linsist
        31
    linsist  
       2017-04-14 11:18:36 +08:00   ❤️ 1
    Java 拿到关键词后在数据库中新建记录,同时推送任务到消息队列,然后轮询数据库的记录状态;
    Python 常驻监听消息队列,拿到任务,解决,然后回写数据库的记录状态。不过这种方式毕设还行,到了生产估计就不够用了吧。

    感觉楼主只是没绕过那个弯,两者之间怎么形成一个工作流
    backfrw
        32
    backfrw  
    OP
       2017-04-14 11:24:42 +08:00
    @linsist 谢谢啦,看了这么多建议,已经转过来啦,感谢各位回答的大佬
    backfrw
        33
    backfrw  
    OP
       2017-04-14 11:26:38 +08:00
    @RFC2109 感谢建议,谢谢啦
    wyntergreg
        34
    wyntergreg  
       2017-04-14 12:36:10 +08:00
    消息队列
    简单来说, redis 的 list 就足够了
    哪那么多事啊还 rpc ,怎么不上套 hadoop 啊
    denonw
        35
    denonw  
       2017-04-14 15:39:59 +08:00
    mq 吧
    Ixizi
        36
    Ixizi  
       2017-04-14 16:23:49 +08:00
    楼上正解。
    Jackeriss
        37
    Jackeriss  
       2017-04-14 20:06:04 +08:00
    @zwl2012 不是应该说 Python 也可以写网站吗?做个毕设分分钟的事。
    wc951
        38
    wc951  
       2017-04-14 23:05:37 +08:00 via Android
    杀鸡用什么牛刀,写个 http 接口顶天了
    woshixiaohao1982
        39
    woshixiaohao1982  
       2017-04-15 13:50:01 +08:00
    序列化 mq 队列搞起
    breezeFP
        40
    breezeFP  
       2017-05-04 15:38:30 +08:00
    直接用 java 去爬不好吗,当年我就是用 java 的一个框架 webcollect (好像是这个名字)做的,挺简单
    kwdfmzhu
        41
    kwdfmzhu  
       2017-05-19 21:24:30 +08:00
    同样推荐使用 rabbitmq,java 和 python 都使用很方便
    zonghua
        42
    zonghua  
       2017-05-20 11:41:43 +08:00 via iPhone
    jython
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2734 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 11:40 · PVG 19:40 · LAX 03:40 · JFK 06:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.