Python中怎么执行JavaScript代码?
场景:爬虫 遇到的问题:获取页面隐藏的 token 节点,难道通过接口爬的东西,还要去自动化打开网页,取到 token,再塞进接口里边??
2 个问题: 1、python 如何执行 js 2、这种场景的问题,是怎么解决的?难道真要通过 selenium 取打开网页,去找到 token,再回过去把取的值,放到接口里边用?
Python中怎么执行JavaScript代码?
纯 js 没有 DOM 的,你考虑清楚哦。
在Python里跑JS代码,最直接的办法是用 execjs 库。先装一下:pip install PyExecJS。这库背后会根据你系统环境自动找可用的JS运行时,比如Node.js或者系统自带的JavaScriptCore。
给你个简单例子,执行一段JS函数:
import execjs
# 创建一个JS运行时上下文
ctx = execjs.compile("""
function add(a, b) {
return a + b;
}
""")
# 调用JS函数
result = ctx.call("add", 10, 5)
print(result) # 输出 15
如果你有现成的JS文件,也可以直接读取执行:
import execjs
with open('your_script.js', 'r') as f:
js_code = f.read()
ctx = execjs.compile(js_code)
result = ctx.call('your_function', arg1, arg2)
注意点:execjs 对ES6+的新语法支持可能有限,复杂点的现代JS代码建议先用Babel之类的工具转成ES5。另外,如果涉及DOM操作或者浏览器特定API,这个库就不行了,得考虑用 selenium 或者 pyppeteer 这种无头浏览器方案。
总结:简单JS用execjs,复杂或浏览器环境用无头浏览器。
用 splash
解析 DOM,然后 xpath 直接取页面的数据不行吗。我记得 python 不是提供的吗?又不是 JS 渲染的页面,不需要 selenium。
import execjs
execjs.eval()
python 可以解析 DOM 吗,通过 bs4?
读一下 JS 逻辑,用 Python 实现一下就好了,不必非要执行 JS
就是要在 dom 中取值,python 能做到?
#7 我不了解 python 最近想试试爬虫玩玩,看了下 bs4 的介绍应该没什么问题,主要你搞错了问题。
你运行 JS 只是为了获取 html 的值的话没什么意义的。本身 JS 有意义的在于需要根据各种事件和功能去执行业务流程,去修改 DOM 只是一个必要的流程,不管哪个语言都有库解析 XML 和 HTML。不需要执行 JS 都可以
是这个意思,但我只能想到用 js 去取啊,还有其他 方法 吗
为什么是艾特我?
#11 抱歉 AT 错了,
#10 你刚刚说的 BS4 的库应该没问题,你可以看看各种教程。
如果这个值写在了 HTML 里,比如 <input name=“token” type=“hidden” value=“blablabla”> 这样的,可以用 bs4,甚至你直接用 XPath,正则什么的都行的
<input type=“hidden” name="_token" value=“UlORUHsXUBI7YKg2h73u8pEaWyqDhYioSa1ZYwUK”>
取这个 value 的值
现在的问题是,我 requests.get(“http://szjw.changsha.gov.cn/ywcx/”),返回的 dom 中,找不到这个 input
好尴尬
遇到过相同的问题,最后我选择了写 nodejs 脚本
因为你想要的这个 token 是 iframe 里的
<iframe id=“Frame_Content” src=“http://www.cszjw.net/preselllicence” frameborder=“0” scrolling=“auto” style=“width: 100%; height:100%; min-height:600px;”></iframe>
你打开 http://www.cszjw.net/preselllicence 就有了
在 iframe 也没关系吧,requests.get()不是返回所有的 html 吗?
我也是最后选择了 node js 写了个 web 服务调用
在脚本上模拟一些环境,如
var navigator = {};
navigator.userAgent = “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36”
navigator.vendor = “Google Inc.”;
// 电池状态相关
navigator.getBattery = function () {
var battery = {
charging: true,
chargingTime: 0,
dischargingTime: Infinity,
level: 1,
onchargingchange: null,
onchargingtimechange: null,
ondischargingtimechange: null,
onlevelchange: null
};
return new Promise(function (resolve, reject) {
resolve(battery)
});
};
然后在脚本后面开个服务器
// 导入 koa,和 koa 1.x 不同,在 koa2 中,我们导入的是一个 class,因此用大写的 Koa 表示:
const Koa = require(‘koa’);
// const koaBody = require(‘koa-body’);
// 创建一个 Koa 对象表示 web app 本身:
const app = new Koa();
// app.use(koaBody());
// 对于任何请求,app 将调用该异步函数处理请求:
app.use(async (ctx, next) => {
await next();
console.log(ctx.request.body)
// const body = ctx.request.body;
// if(!body.href){
// body.href = ‘’
// }
ctx.response.type = ‘text/html’;
ctx.response.body = get_isg(’’);
});
// 在端口 3000 监听:
app.listen(3000);
console.log(‘app started at port 3000…’);
如果你是这么认为的,我觉得你需要看更多的东西了。。。
<br>from requests_html import HTMLSession<br>def getToken():<br> session = HTMLSession()<br> url = '<a target="_blank" href="http://www.cszjw.net/preselllicence'" rel="nofollow noopener">http://www.cszjw.net/preselllicence'</a><br> token = session.get(url).html.find('input[name="_token"]')[0].attrs['value']<br> return token<br>
为什么这个页面用这个方法 不行? http://szjw.changsha.gov.cn/ywcx/
+1
pyv8
nodejs 你写个脚本调用不好吗
phatomjs 就可以解决问题
PyV8 老了,用 py_mini_racer
headless chrome 了解一下
iframe 中的代码,无法在网页源代码中得到
phantomJS 就可以了啊
我有个类似的项目,一样的 js 算出一个 token 和一个 t,然后放到 cookie 里。
在拿到 js 后,写一个接收函数,然后 phantom 执行,输出 js 里的 token 和 t,然后请求
不知道算的,从前端拿到 token,没有 cookie 的话,也是请求不成功的


