1
pierre1994 2017-04-13 23:45:46 +08:00
rpc
|
2
backfrw OP @pierre1994 好的,我去研究,谢谢大佬
|
3
ChasYuan 2017-04-14 00:14:49 +08:00 via Android
感觉楼主和我毕设差不多啊。不会一个专业吧。。我都是用 Java 实现的
|
5
casparchen 2017-04-14 00:57:58 +08:00
java 不该从数据库读数据么,应该和 python 没关系吧
|
6
backfrw OP @casparchen 但是没有 java 存的关键字, python 不知道爬什么,没有 python 爬的数据, java 不知道展示什么,似乎陷入了循环
|
7
casparchen 2017-04-14 01:36:49 +08:00
@backfrw python 每隔 10 秒读一下数据库?
|
8
Lpl 2017-04-14 02:47:21 +08:00 via iPhone 1
写一个 webhook , java 出现存储关键字的操作后,通过 hook 通知 python 关键字更新了
|
9
NoAnyLove 2017-04-14 03:01:16 +08:00 1
以前看过一种设计,为了尽量的解耦合,不同部分都是通过数据库进行数据交换,所以每个部分都要周期性地读取数据库,如果有了数据就执行,没有就继续睡大觉。好处是实现简单,而且各部分没有很强的依赖关系。虽然获取数据会有一定延迟,不过应该能满足需求。
此外,也许可以试试 Pyro , Python 端提供远程对象调用,同时又 Java 和.net 端接口。我没用过,但是感觉应该能满足你的需求 https://pythonhosted.org/Pyro4/pyrolite.html |
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 自然就可以拿数据出来做展示。这就相当于一个简单的钩子 |
11
Lpl 2017-04-14 03:07:37 +08:00 1
这样子做的话能解耦,比如说:你有多台爬虫机,那么就会有多个接口。你可以把接口在 java 端写活,比如存储进数据库。当你 java 发生存储操作的时候,就向数据库中的这些接口发送请求。
嗯,这样子也有利于你的功能扩展 |
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 |
13
wwqgtxx 2017-04-14 08:27:01 +08:00 via iPhone
消息交互用 rabbitmq 来交互不就行了
|
14
louzhumuyou 2017-04-14 08:41:03 +08:00
@Lpl 同样推荐 webhook 。👍
|
15
arischow 2017-04-14 08:43:48 +08:00 via iPhone
redis
|
16
zwl2012 2017-04-14 09:08:14 +08:00 via iPhone
为什么不统一语言呢? JAVA 也可以做爬虫呀
|
17
hand515 2017-04-14 09:32:52 +08:00 1
数据库生成一个任务记录, python 完成后更新状态, java 轮询状态,这不就很简单了吗。
数据库改为 redis 效率更高, 还可以通过 pub/sub 实时通知 |
18
kimchan 2017-04-14 09:34:50 +08:00
本来就是两个独立服务. 用接口不是很简单吗?
|
19
blackFool 2017-04-14 09:48:42 +08:00
kafka
|
20
domty 2017-04-14 09:54:29 +08:00
没考虑过用消息队列解耦
|
21
woostundy 2017-04-14 10:14:43 +08:00 1
拿 redis 做个消息队列呗。
|
22
vjnjc 2017-04-14 10:19:33 +08:00 1
简单的来说楼主是缺乏出发程序的时机,那这样就简单了。
python 操作好了通过 http 访问 java 后台接口,反之亦然 |
23
ipwx 2017-04-14 10:22:29 +08:00 1
restful api
|
24
bk201 2017-04-14 10:25:17 +08:00
我都觉得根本不需要数据库
|
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 接口了事 |
30
RFC2109 2017-04-14 11:18:31 +08:00 1
从场景上来说,应该用消息队列。用 redis 的 pub sub 就可以了。
|
31
linsist 2017-04-14 11:18:36 +08:00 1
Java 拿到关键词后在数据库中新建记录,同时推送任务到消息队列,然后轮询数据库的记录状态;
Python 常驻监听消息队列,拿到任务,解决,然后回写数据库的记录状态。不过这种方式毕设还行,到了生产估计就不够用了吧。 感觉楼主只是没绕过那个弯,两者之间怎么形成一个工作流 |
34
wyntergreg 2017-04-14 12:36:10 +08:00
消息队列
简单来说, redis 的 list 就足够了 哪那么多事啊还 rpc ,怎么不上套 hadoop 啊 |
35
denonw 2017-04-14 15:39:59 +08:00
mq 吧
|
36
Ixizi 2017-04-14 16:23:49 +08:00
楼上正解。
|
38
wc951 2017-04-14 23:05:37 +08:00 via Android
杀鸡用什么牛刀,写个 http 接口顶天了
|
39
woshixiaohao1982 2017-04-15 13:50:01 +08:00
序列化 mq 队列搞起
|
40
breezeFP 2017-05-04 15:38:30 +08:00
直接用 java 去爬不好吗,当年我就是用 java 的一个框架 webcollect (好像是这个名字)做的,挺简单
|
41
kwdfmzhu 2017-05-19 21:24:30 +08:00
同样推荐使用 rabbitmq,java 和 python 都使用很方便
|
42
zonghua 2017-05-20 11:41:43 +08:00 via iPhone
jython
|