有没有办法让 cURL 等到页面的动态更新完成?
Posted
技术标签:
【中文标题】有没有办法让 cURL 等到页面的动态更新完成?【英文标题】:Is there a way to let cURL wait until the page's dynamic updates are done? 【发布时间】:2013-01-15 13:29:34 【问题描述】:我在 php 中使用 cURL 获取页面。一切正常,但我正在获取页面的某些部分,这些部分是在页面加载后用 javascript 计算的。在 JavaScript 计算完成之前,cURL 已经将页面的源代码发送回我的 PHP 脚本,从而导致错误的最终结果。网站上的计算是由 AJAX 获取的,所以我无法以简单的方式重现该计算。此外,我无法访问目标页面的代码,因此我无法调整目标页面以满足我的 (cURL) 获取需求。
有什么方法可以告诉 cURL 等到所有动态流量完成?这可能会很棘手,因为某些 JavaScript 会不断将数据发送回另一个域,这可能会导致长时间挂起。但至少我可以测试,如果我至少得到正确的结果。
Safari 中的“我的开发人员”工具栏显示该页面在大约 1.57 秒内完成。也许我也可以静态告诉 cURL 等待 2 秒?
我想知道有什么可能性:)
【问题讨论】:
【参考方案1】:cURL 不执行任何 JavaScript 或下载文档中引用的任何文件。所以 cURL 不能解决你的问题。
您必须在服务器端使用浏览器,告诉它加载页面,等待 X 秒,然后要求它为您提供 html。
看:http://phantomjs.org/(你需要使用 node.js,我不知道任何 PHP 解决方案)。
【讨论】:
幸运的是,这只是一小段代码。我将用 JavaScript 重写代码,然后使用 jQuery 和 PhantomJS 获取数据。谢谢你:) 有什么方法可以将 PhantomJS 简单地包含在我执行 jQuery 的本地 HTML 页面中? 没有。 phantom.js 内部使用的是真正的 webkit 浏览器,这在客户端是做不到的。【参考方案2】:不太了解您正在检索的页面或您想要包含的计算,但它可能是一个选项,可以直接 cURL 到为这些 ajax 请求提供服务的 URL。使用 Firebug 之类的东西来检查在目标页面上进行的 Ajax 调用,您可以找出 URL 和传递的任何参数。如果您确实需要完整的网页,也许您可以同时卷曲网页和 Ajax URL 并将两者结合到您的 PHP 代码中,但是它开始变得混乱。
【讨论】:
这是要走的路,而不是使用其他程序。【参考方案3】:使用 php 实现它有一种非常棘手的方法。如果你真的喜欢它为 php 工作,你可能会使用 Codeception 设置与 Selenium 结合,并在无头模式下使用 Chrome 浏览器 webdriver。
以下是一些使其正常工作的一般步骤。
确保您的 PHP 项目中有代码接收 https://codeception.com
下载 chrome webdriver: https://chromedriver.chromium.org/downloads
下载硒: https://www.seleniumhq.org/download/
相应地配置它,查看代码接收框架的文档。
编写代码接收测试,您可以使用 $I->wait(5)
等表达式等待 5 秒或 $I->waitForJs('js expression here')
等待页面上的 js 脚本完成。
使用命令php vendor/bin/codecept path/to/test
运行上一步测试中编写的
【讨论】:
【参考方案4】:在彼得的建议和一些研究下。很晚了,但我找到了解决方案。希望有人觉得它有帮助。
您需要做的就是直接请求 ajax 调用。首先,在 chrome 中加载您想要获取的页面,转到 Network 选项卡,过滤 XHR。
现在你必须找到你想要的 ajax 调用。检查响应以验证它。
在ajax调用的名字上右击,选择copy -> “copy as Curl (bash)”
转到https://reqbin.com/curl,粘贴卷曲并单击运行。检查响应内容。
如果这是您想要的,请继续下一步。
仍然在 reqbin 窗口中,单击生成代码并选择您想要翻译的语言,您将获得所需的代码。现在可以随心所欲地集成到您的代码中。
一些提示:如果在您自己的服务器上运行测试返回 400 错误或什么都不返回:将 POSTFIELDS 设置为空。如果它返回 301 永久移动,请检查您的 url 是否为 https。
【讨论】:
以上是关于有没有办法让 cURL 等到页面的动态更新完成?的主要内容,如果未能解决你的问题,请参考以下文章