话说, python真的是无所不能。
我们在抓app数据的时候,有很大概率会遇见参数加密的情况。我们费了很大力气,找到了加密的位置,扣出了加密的函数,但是由于是反编译后的java代码,对于用python写爬虫的程序员来说,如果再把java翻译成python,有时候就很困难了,特别是遇到了一些移位操作时候,由于python默认会把int转成long,java则是溢出,python和java相同逻辑,得到的结果却是不一样。那就更困难了。
好消息是,python可以直接调用jar包。我们可以直接把加密代码直接打成jar包,供python爬虫来调用,这样一来,省去了很多的麻烦事。
python 调用jar包可以使用jpype模块来实现
安装jpype
需要先安装好python3.7、java8、visual C++编译器,
pip install jpype1
安装出现错误信息请自行百度查找解决方法。
简单使用
启动 jvm 和关闭 jvm
JPype 提供的 startJVM(jvm, *args)
函数的作用是启动java虚拟机,在代码中调用java代码之前,首先要使用此方法来启动java虚拟机。
jvm, 描述你系统中 jvm.dll 文件所在的路径,如“ C:\Program Files\IBM\Java50\jre\bin\j9vm\jvm.dll ”。可以通过调用 jpype.getDefaultJVMPath() 得到默认的 JVM 路径。
args, 为可选参数,会被 JPype 直接传递给 JVM 作为 Java 虚拟机的启动参数。此处适合所有合法的 JVM 启动参数,例如:
-agentlib:libname[=options] -classpath classpath -verbose -Xint
shutdownJVM()
函数的作用是关闭java虚拟机,在结束调用java代码时候,使用此方法可以关闭java虚拟机。
判断java虚拟机是否启动
JPype 提供的 jpype.isJVMStarted() 函数可以判断 JVM 是否已启动。
返回值为 True 表示 JVM 已经启动,返回值为 False 表示 JVM 还未启动
hello world 程序
import jpype
jvmPath = jpype.getDefaultJVMPath()
jpype.startJVM(jvmPath)
jpype.java.lang.System.out.println( “ hello world! ” )
jpype.shutdownJVM()
使用jpype调用jar包
jar包源代码
package wwz.bigeye;
public class JpypeDemo {
public String sayHello(String user){
return "hello" + user;
}
public int calc(int a, int b){
return a + b;
}
}
将此源码打包编译为:JpypeDemo.jar。
python调用代码
# Djava.class.path指定jar包的路径
startJVM(getDefaultJVMPath(), "-ea", "-Djava.class.path=%s" % (os.getcwd() + '\JpypeDemo.jar'))
# 找到class
JYDClass = JClass("wwz.bigeye.JpypeDemo")
# 执行类中的函数
result = (JYDClass.calc(1, 2))
print(result)
shutdownJVM()
执行以上代码,就可以看到执行的结果啦。是不是很简单!
大家可关注一下我的个人公众号,不定时分享一些爬虫案例和技巧
qrcode_for_gh_7dbef0ec6098_258.jpg
网友评论