使 file_get_contents() 等待网站完全加载

Make file_get_contents() wait for website to load completely

我正在尝试将此网站添加到我的 php 变量中:

https://www.warcraftlogs.com/rankings/server/393/latest/#class=Druid&spec=Feral

您可以看到网站仅在页面首次完成加载后才开始加载网站的真实内容。

file_get_contents("https://www.warcraftlogs.com/rankings/server/393/latest/#class=Druid&spec=Feral");

returns 只有库存空网站,没有第二步加载的表格中的实际内容。

有没有办法让 file_get_contents 等待网站加载?

你想看的数据在不同的url:

https://www.warcraftlogs.com/rankings/table/dps/6/0/5/20/1/Druid/Feral/0/393/?search=&page=1

该站点使用ajax,您可以找到ajax加载并获取它。 实际库存url是:

file_get_contents("https://www.warcraftlogs.com/rankings/table/dps/6/0/5/20/1/Druid/Feral/0/393/?search=&page=1");

为了了解站点上发生的情况,请尝试打开浏览器的网络检查器。您会看到页面本身加载,然后您会看到各种其他资源加载,例如 CSS 文件、JS 文件、图像和更多页面。

其他页面之一是:https://www.warcraftlogs.com/rankings/table/dps/6/0/5/20/1/Druid/Feral/0/393/?search=&page=1

看起来主站点发出了一个 AJAX 请求以从 URL 获取额外的数据。请注意,file_get_contents() 无法一次获取所有内容,因为 file_get_contents() 不会解析网站或评估任何 JS(而 JS 是触发 AJAX 请求的原因).解决方案很简单 - 不要使用 file_get_contents() 来获取主站点,而是使用它来获取包含数据的辅助页面。

如果你想抓住这个 URL,你必须更深入地挖掘。如果你打开主页面,你会发现页面上嵌入了一段 JS,如下所示:

function loadTable()
{
    var loadString = '/rankings/table/' + filterMetric + '/' + zoneID + '/' + filterBoss + '/' + filterDifficulty + '/' + filterSize + '/' + filterRegion + '/' + filterClass + '/' + filterSpec + '/' + filterBracket + '/' + filterServer + '/' + '?' + "search=" + filterSearch + "&page=" + filterPage
    $("#table-container").load(loadString, tableLoaded)
}

注意它是如何动态创建具有所需参数的字符串的。然后它调用 $.fn.load(),这会触发对 URL.

的 AJAX 请求

您可以从此 url:

加载数据

https://www.warcraftlogs.com/rankings/table/dps/6/0/5/20/1/Druid/Feral/0/393/?search=&page=1