如何让Python与JavaScript协同工作

2 投票
5 回答
10416 浏览
提问于 2025-04-16 22:16

我正在做一个用 scrapy 的应用程序,目的是从网页上抓取一些数据。

但是,有些数据是通过 ajax 加载的,所以 Python 无法执行这些操作来获取数据。

有没有什么库可以模拟浏览器的行为呢?

5 个回答

2

AJAX请求是一种普通的网页请求,它是异步执行的。你只需要一个网址,这个网址是JavaScript代码发送给服务器的。你可以用这个网址配合urllib来获取相同的数据。

3

问题在于,你不仅需要能够执行一些Javascript(这很简单),还需要模拟浏览器的DOM,这可就需要花费很多精力了。

如果你想运行Javascript,可以使用PyV8。用 easy_install PyV8 来安装它,这样你就可以执行任何独立的Javascript代码:

>>> import PyV8
>>> ctxt = PyV8.JSContext()
>>> ctxt.enter()
>>> ctxt.eval("(function(a,b) { return [a+b, a*b, a/b, a-b] })(13,29)")
<_PyV8.JSArray object at 0x01F26A30>
>>> list(_)
[42, 377, 0.4482758620689655, -16]

你还可以传入在Python中定义的类,所以原则上来说,你可能能够模拟出足够的DOM来满足你的需求。

6

要实现这个功能,你需要使用一个完整的JavaScript引擎,比如Chrome里的Google V8,这样才能真正体验到浏览器的功能以及它是如何工作的。不过,你也可以尝试查看源代码中的所有网址,然后对每个网址发送请求,希望能得到一些有效的数据。但总的来说,没有完整的JavaScript引擎,你会遇到很多限制。

你可以考虑使用类似于python-spidermonkey的东西。这是一个Mozilla的JavaScript引擎的封装。不过,使用起来可能会比较复杂,这取决于你具体的应用需求。

基本上,你需要自己构建一个浏览器,但看起来Python的开发者们已经让这个过程变得简单了。通过PyWebkitGtk,你可以获取到DOM(文档对象模型),然后结合之前提到的python-spidermonkey或者Duncan提到的PyV8,理论上你就能获得一个浏览器或网页抓取工具所需的全部功能。

撰写回答