V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
backfrw
V2EX  ›  Java

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

  •  
  •   backfrw · Apr 13, 2017 · 8153 views
    This topic created in 3307 days ago, the information mentioned may be changed or developed.
    前段时间交了毕业设计的开题报告,本来打算就 java 写个网站,老师说不行,太简单,改报告。。。
    最后是 python 写爬虫,通过关键字爬取信息,存数据库,用 java 的 SSM 框架写个后台,从数据库获得关键字相关的信息展示在页面上,之前想的是关键字通过 java 存数据库, python 从数据库拿关键字爬网站,算是通过开题报告了

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

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

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

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

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

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

    或者起一个 Java 主进程,当需要爬东西的时候由这个进程 fork 一个 python 进程跑爬虫, java 阻塞直到 python 进程返回,有兴趣的话还可以研究一下 jython
    wwqgtxx
        13
    wwqgtxx  
       Apr 14, 2017 via iPhone
    消息交互用 rabbitmq 来交互不就行了
    louzhumuyou
        14
    louzhumuyou  
       Apr 14, 2017
    @Lpl 同样推荐 webhook 。👍
    arischow
        15
    arischow  
       Apr 14, 2017 via iPhone
    redis
    zwl2012
        16
    zwl2012  
       Apr 14, 2017 via iPhone
    为什么不统一语言呢? JAVA 也可以做爬虫呀
    Finest
        17
    Finest  
       Apr 14, 2017   ❤️ 1
    数据库生成一个任务记录, python 完成后更新状态, java 轮询状态,这不就很简单了吗。
    数据库改为 redis 效率更高, 还可以通过 pub/sub 实时通知
    kimchan
        18
    kimchan  
       Apr 14, 2017
    本来就是两个独立服务. 用接口不是很简单吗?
    blackFool
        19
    blackFool  
       Apr 14, 2017
    kafka
    domty
        20
    domty  
       Apr 14, 2017
    没考虑过用消息队列解耦
    woostundy
        21
    woostundy  
       Apr 14, 2017   ❤️ 1
    拿 redis 做个消息队列呗。
    vjnjc
        22
    vjnjc  
       Apr 14, 2017   ❤️ 1
    简单的来说楼主是缺乏出发程序的时机,那这样就简单了。
    python 操作好了通过 http 访问 java 后台接口,反之亦然
    ipwx
        23
    ipwx  
       Apr 14, 2017   ❤️ 1
    restful api
    bk201
        24
    bk201  
       Apr 14, 2017
    我都觉得根本不需要数据库
    debuggerx
        25
    debuggerx  
       Apr 14, 2017   ❤️ 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
       Apr 14, 2017
    @Lpl @NoAnyLove @wwqgtxx @ipwx 谢谢大佬,感觉学到了新东西
    backfrw
        27
    backfrw  
    OP
       Apr 14, 2017
    @Cbdy @arischow @hand515 @vjnjc 谢谢啦,回头试试
    backfrw
        28
    backfrw  
    OP
       Apr 14, 2017
    @zwl2012 因为老师没给过
    backfrw
        29
    backfrw  
    OP
       Apr 14, 2017
    @debuggerx 谢谢大佬,学到了
    RFC2109
        30
    RFC2109  
       Apr 14, 2017   ❤️ 1
    从场景上来说,应该用消息队列。用 redis 的 pub sub 就可以了。
    linsist
        31
    linsist  
       Apr 14, 2017   ❤️ 1
    Java 拿到关键词后在数据库中新建记录,同时推送任务到消息队列,然后轮询数据库的记录状态;
    Python 常驻监听消息队列,拿到任务,解决,然后回写数据库的记录状态。不过这种方式毕设还行,到了生产估计就不够用了吧。

    感觉楼主只是没绕过那个弯,两者之间怎么形成一个工作流
    backfrw
        32
    backfrw  
    OP
       Apr 14, 2017
    @linsist 谢谢啦,看了这么多建议,已经转过来啦,感谢各位回答的大佬
    backfrw
        33
    backfrw  
    OP
       Apr 14, 2017
    @RFC2109 感谢建议,谢谢啦
    wyntergreg
        34
    wyntergreg  
       Apr 14, 2017
    消息队列
    简单来说, redis 的 list 就足够了
    哪那么多事啊还 rpc ,怎么不上套 hadoop 啊
    denonw
        35
    denonw  
       Apr 14, 2017
    mq 吧
    Ixizi
        36
    Ixizi  
       Apr 14, 2017
    楼上正解。
    Jackeriss
        37
    Jackeriss  
       Apr 14, 2017
    @zwl2012 不是应该说 Python 也可以写网站吗?做个毕设分分钟的事。
    wc951
        38
    wc951  
       Apr 14, 2017 via Android
    杀鸡用什么牛刀,写个 http 接口顶天了
    woshixiaohao1982
        39
    woshixiaohao1982  
       Apr 15, 2017
    序列化 mq 队列搞起
    breezeFP
        40
    breezeFP  
       May 4, 2017
    直接用 java 去爬不好吗,当年我就是用 java 的一个框架 webcollect (好像是这个名字)做的,挺简单
    kwdfmzhu
        41
    kwdfmzhu  
       May 19, 2017
    同样推荐使用 rabbitmq,java 和 python 都使用很方便
    zonghua
        42
    zonghua  
       May 20, 2017 via iPhone
    jython
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2378 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 82ms · UTC 05:54 · PVG 13:54 · LAX 22:54 · JFK 01:54
    ♥ Do have faith in what you're doing.