12

我在 PHP 中使用 cURL 获取页面。一切正常,但我正在获取页面的某些部分,这些部分是在页面加载后用 JavaScript 计算的。在 JavaScript 计算完成之前,cURL 已经将页面的源代码发送回我的 PHP 脚本,从而导致错误的最终结果。网站上的计算是由 AJAX 获取的,所以我无法以简单的方式重现该计算。此外,我无法访问目标页面的代码,因此我无法调整该目标页面以适应我的(cURL)获取需求。

有什么办法可以告诉 cURL 等到所有动态流量完成?这可能会很棘手,因为某些 JavaScript 会不断将数据发送回另一个域,这可能会导致长时间挂起。但至少我可以测试,如果我至少得到正确的结果。

Safari 中的“我的开发人员”工具栏表明该页面在大约 1.57 秒内完成。也许我也可以静态地告诉 cURL 等待 2 秒?

我想知道有什么可能性:)

4

4 回答 4

6

cURL 不执行任何 JavaScript 或下载文档中引用的任何文件。所以 cURL 不能解决你的问题。

您必须在服务器端使用浏览器,告诉它加载页面,等待 X 秒,然后要求它为您提供 HTML。

看:http://phantomjs.org/(你需要使用 node.js,我不知道任何 PHP 解决方案)。

于 2013-01-31T12:36:45.957 回答
3

不太了解您正在检索的页面或您想要包含的计算,但它可能是一个选项,可以直接卷曲到为这些 ajax 请求提供服务的 URL。使用 Firebug 之类的东西来检查在目标页面上进行的 Ajax 调用,您可以找出 URL 和传递的任何参数。如果您确实需要完整的网页,也许您可​​以同时卷曲网页和 Ajax URL 并将两者结合到您的 PHP 代码中,但随后它开始变得混乱。

于 2013-01-31T12:42:25.993 回答
2

使用 php 实现它有一种非常棘手的方法。如果你真的喜欢它为 php 工作,你可以将 Codeception 设置与 Selenium 结合使用,并在无头模式下使用 Chrome 浏览器 webdriver。

以下是使其正常工作的一些一般步骤。

  1. 你确保你的 PHP 项目中有代码接收 https://codeception.com

  2. 下载chrome webdriver: https ://chromedriver.chromium.org/downloads

  3. 下载硒: https ://www.seleniumhq.org/download/

  4. 相应地配置它,查看代码接收框架的文档。

  5. 编写代码接收测试,您可以在其中使用表达式,例如$I->wait(5)等待 5 秒或$I->waitForJs('js expression here')等待 js 脚本在页面上完成。

  6. 使用命令运行在上一步测试中编写的php vendor/bin/codecept path/to/test

于 2019-09-18T08:56:10.743 回答
2

在彼得的建议和一些研究下。很晚了,但我找到了解决方案。希望有人觉得它有帮助。

您需要做的就是直接请求 ajax 调用。首先,在 chrome 中加载您想要获取的页面,转到 Network 选项卡,过滤 XHR。

现在你必须找到你想要的 ajax 调用。检查响应以验证它。

右键单击ajax调用的名称,选择复制->“复制为Curl(bash)”

网络选项卡

转到https://reqbin.com/curl,粘贴 Curl 并单击运行。检查响应内容。

雷克宾

如果这是您想要的,请转到下一步。

仍然在 reqbin 窗口中,单击 Generate code 并选择要翻译的语言,您将获得所需的代码。现在可以根据需要集成到您的代码中。

一些提示:如果在您自己的服务器上运行测试返回 400 错误或根本没有:将 POSTFIELDS 设置为空。如果它返回 301 永久移动,请检查您的网址是否为 https。

于 2021-09-09T05:37:09.090 回答