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

问题描述 投票:8回答:3

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

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

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

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

php javascript curl dynamic-data
3个回答
5
投票

cURL不执行任何JavaScript或下载文档中引用的任何文件。因此,cURL并非解决您问题的方法。

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

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


2
投票

对所要检索的页面或要包括的计算不了解很多,但是可以直接将cURL定位为服务那些ajax请求的URL。使用Firebug之类的工具检查在目标页面上进行的Ajax调用,您可以找出URL和传递的任何参数。如果您确实需要完整的网页,则也许可以同时对网页和Ajax URL进行URL编码,然后在PHP代码中将二者结合在一起,但随后开始变得混乱。


0
投票

有一种使用php来实现的技巧非常棘手。如果您真的希望它可以在php中使用,则可以与Selenium结合使用Codeception设置,并以无头模式使用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运行在上一步测试中编写的运行

© www.soinside.com 2019 - 2024. All rights reserved.