将Python对象传入CasperJS脚本,遍历对象并返回结果对象到Python

0 投票
2 回答
561 浏览
提问于 2025-04-18 07:23

我刚开始学习一些更适合网页的编程语言,不过我之前在Excel中用VBA编程过。

我想做的事情是:

  1. 把一个列表(用Python写的)传给一个casper.js脚本。
  2. 在casper.js脚本里,我想遍历这个Python对象(一个搜索词的列表)。
  3. 在casper脚本中,我想用这些搜索词去查询谷歌。
  4. 查询完后,我想把这些查询的结果存储在一个数组里,并在遍历Python对象的时候把它们连接起来。
  5. 最后,当我搜索完所有的搜索词并找到了结果后,我想把这个结果数组返回给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);

在Python中把JSON字符串反序列化为对象

Javascript:

arr = JSON.parse(json) //把JSON字符串转换成JavaScript数组

json = JSON.stringify(arr) //把数组转换成JSON字符串,准备发送给Python

撰写回答