backfrw
V2EX  ›  Java

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

  •  
  •   backfrw · Apr 13, 2017 · 8859 views
    This topic created in 3493 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
    pierre1994
    Apr 13, 2017
    1
    rpc
    backfrw
    backfrw
    OP
    Apr 13, 2017
    2
    @pierre1994 好的,我去研究,谢谢大佬
    ChasYuan
    ChasYuan
    Apr 14, 2017 via Android
    3
    感觉楼主和我毕设差不多啊。不会一个专业吧。。我都是用 Java 实现的
    backfrw
    backfrw
    OP
    Apr 14, 2017
    4
    @ChasYuan 网络工程,,,应该不是一个专业吧
    casparchen
    casparchen
    Apr 14, 2017
    5
    java 不该从数据库读数据么,应该和 python 没关系吧
    backfrw
    backfrw
    OP
    Apr 14, 2017
    6
    @casparchen 但是没有 java 存的关键字, python 不知道爬什么,没有 python 爬的数据, java 不知道展示什么,似乎陷入了循环
    casparchen
    casparchen
    Apr 14, 2017
    7
    @backfrw python 每隔 10 秒读一下数据库?
    Lpl
    Lpl
    Apr 14, 2017 via iPhone❤️1
    8
    写一个 webhook , java 出现存储关键字的操作后,通过 hook 通知 python 关键字更新了
    NoAnyLove
    NoAnyLove
    Apr 14, 2017❤️1
    9
    以前看过一种设计,为了尽量的解耦合,不同部分都是通过数据库进行数据交换,所以每个部分都要周期性地读取数据库,如果有了数据就执行,没有就继续睡大觉。好处是实现简单,而且各部分没有很强的依赖关系。虽然获取数据会有一定延迟,不过应该能满足需求。

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

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

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

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

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

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