3

基本上,我正在尝试使用 php 抓取网页,但我想在页面上的初始 javascript 执行后这样做 - 我想在初始 ajax 请求后访问 DOM 等......有什么办法吗?

4

2 回答 2

2

简短的回答:没有。

抓取站点会为您提供服务器对您发出的 HTTP 请求的响应(如果该内容是 HTML,则从中派生出 DOM 树的“初始”状态)。它不能考虑 DOM 在被 Javascript 修改后的“当前”状态。

于 2012-06-26T18:56:57.147 回答
1

我正在修改这个答案,因为现在有几个项目在这方面做得非常好:

  • 2020 年更新Puppeteer是一个可以控制 Chromium 浏览器的 Node.js 库,还对 Firefox 提供实验性支持。

  • 2020 年更新Playwright是一个可以控制多个浏览器的 Node.js 库。

您需要安装 Node.js 并编写 JavaScript 代码来与这两个项目进行交互。特别是它们工作得很好,你可以在你的代码中使用任何 Node.js/npm 模块asyncawait

还有其他项目,如 Selenium,但我不推荐它们。

- PhantomJS是 WebKit 的无头版本,并且有一些有用的包装器,例如CasperJS

- Zombie.js,它是用 Javascript (Node.js) 编写的jsdom的包装器。

您需要编写 JavaScript 代码来与这两个项目进行交互。到目前为止,我更喜欢 Zombie.js,因为它更易于设置,并且您可以在代码中使用任何 Node.js/npm 模块。


老答案:

不,没有办法做到这一点。您必须在 PHP 中模拟完整的浏览器环境。除了谷歌,我不知道有谁在做这种抓取,而且还远远不够全面。

相反,您应该使用 Firebug 或其他 Web 调试工具来查找生成您真正感兴趣的数据的请求(或请求序列)。然后,使用 PHP 仅执行所需的请求。

于 2012-06-26T18:55:51.937 回答