有没有办法让cURL等到页面的动态更新完成?

时间:2013-01-31 12:33:44

标签: php javascript curl dynamic-data

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

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

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

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

3 个答案:

答案 0 :(得分:5)

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

你必须在服务器端使用浏览器,告诉它加载页面,等待X秒然后让它给你HTML。

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

答案 1 :(得分:2)

您不太了解要检索的页面或要包含的计算,但可以选择直接cURL到为这些ajax请求提供服务的URL。使用像Firebug这样的东西来检查在目标页面上进行的Ajax调用,你可以找出URL和传递的任何参数。如果你确实需要完整的网页,也许你可以搜索网页和Ajax URL,并将这两个结合在你的PHP代码中,但它开始变得混乱。

答案 2 :(得分:1)

有一种使用php实现它的技巧非常棘手。如果您真的希望它可以在php上运行,则可以将Codeception设置与Selenium结合使用,并在无头模式下使用Chrome浏览器网络驱动程序。

要使它正常工作,这里有一些常规步骤。

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

  2. 下载Chrome网络驱动程序: 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

  7. 在上一步测试中编写的运行