将Python对象传入CasperJS脚本,遍历对象并返回结果对象到Python
我刚开始学习一些更适合网页的编程语言,不过我之前在Excel中用VBA编程过。
我想做的事情是:
- 把一个列表(用Python写的)传给一个casper.js脚本。
- 在casper.js脚本里,我想遍历这个Python对象(一个搜索词的列表)。
- 在casper脚本中,我想用这些搜索词去查询谷歌。
- 查询完后,我想把这些查询的结果存储在一个数组里,并在遍历Python对象的时候把它们连接起来。
- 最后,当我搜索完所有的搜索词并找到了结果后,我想把这个结果数组返回给Python,这样我就可以进一步处理这些数据。
问题 --> 我不太确定怎么写Python函数来把对象传给casper。
问题 --> 我也不太确定怎么写casper函数来把JavaScript对象传回给Python。
这是我的Python代码。
import os
import subprocess
scriptType = 'casperScript.js'
APP_ROOT = os.path.dirname(os.path.realpath(__file__))
PHANTOM = '\casperjs\bin\casperjs'
SCRIPT = os.path.join(APP_ROOT, test.js)
params = [PHANTOM, SCRIPT]
subprocess.check_output(params)
js代码
var casper = require('casper').create();
casper.start('http://google.com/', function() {
this.echo(this.getTitle());
});
casper.run();
2 个回答
0
你可以使用两个临时文件,一个用来输入,另一个用来输出casperjs脚本的结果。woverton的回答是可以的,但有些细节不够清楚。直接把你的JSON数据保存到文件里比从casperjs的控制台信息中解析要好,因为那些信息可能会夹杂一些调试字符串。
在Python中:
import tempfile
import json
import os
import subprocess
APP_ROOT = os.path.dirname(os.path.realpath(__file__))
PHANTOM = '\casperjs\bin\casperjs'
SCRIPT = os.path.join(APP_ROOT, test.js)
input = tempfile.NamedTemporaryFile(mode="w", delete=False)
output = tempfile.NamedTemporaryFile(mode="r", delete=False)
yourObj = {"someKey": "someData"}
yourJSON = json.dumps(yourObj)
input.file.write(yourJSON)
# you need to close the temporary input and output file because casperjs does operations on them
input.file.close()
input = None
output.file.close()
print "yourJSON", yourJSON
# pass only file names
params = [PHANTOM, SCRIPT, input.name, output.name]
subprocess.check_output(params)
# you need to open the temporary output file again
output = open(output.name, "r")
yourReturnedJSON = json.load(output)
print "returned", yourReturnedJSON
output.close()
output = None
最后,当这些对象不再被使用时,临时文件会自动被删除。
在casperjs中:
var casper = require('casper').create();
var fs = require("fs");
var input = casper.cli.raw.get(0);
var output = casper.cli.raw.get(1);
input = JSON.parse(fs.read(input));
input.casper = "done"; // add another property
input = JSON.stringify(input);
fs.write(output, input, "w"); // input written to output
casper.exit();
这个casperjs脚本其实没做什么有用的事情。它只是把输入文件的内容写到输出文件里,并添加了一个属性。
0
你可以用JSON格式把数据发送到脚本,然后在收到数据时再解码吗?
Python:
json = json.dumps(stuff)
//把对象转换成字符串,以便传给JavaScript
把一个JSON文件加载到Python中:
with open(location + '/module_status.json') as data_file:
data = json.load(data_file);
Javascript:
arr = JSON.parse(json)
//把JSON字符串转换成JavaScript数组
json = JSON.stringify(arr)
//把数组转换成JSON字符串,准备发送给Python