【问题标题】:file_get_contents() returns the wrong pagefile_get_contents() 返回错误的页面
【发布时间】:2019-03-24 19:53:43
【问题描述】:

我正在尝试使用函数 file_get_contents($url) 来抓取一些内容。但它不会返回正确的内容。它只是返回一些脚本,我认为它们负责位置和语言检查,然后它失败并且不会继续抓取整个页面

    $url = 'https://shop.bitmain.com/';
    $exists;
    $url_headers = get_headers($url);
    if(!$url_headers || $url_headers[0] == 'HTTP/1.1 404 Not Found') {
        $exists = false;
    }
    else {
        $exists = true;
    }

    if(filter_var($url, FILTER_VALIDATE_URL) == FALSE || $exists == false) {

        $error .= '<div class="alert alert-danger" role="alert">That city could not be found.</div>';

    } else if (filter_var($url, FILTER_VALIDATE_URL) == TRUE && $exists == true){

        $html = file_get_contents($url);
        if ($html != FALSE && $html != NULL) 
            echo $html

        }

【问题讨论】:

  • 我认为它得到了 正确的 内容。该页面显然是一个 js 网络应用程序,当您使用浏览器“查看源”目标页面时,脚本几乎就是您所获得的所有内容......
  • 对不起,我已经编辑过了。是的
  • 在浏览器中打开网址...查看源代码...这就是您的 PHP 将获得的内容
  • 我看到了,但原始页面包含一些数据,即产品及其价格。我需要这些数据而不是脚本
  • “需要”是一个强词。我了解您想要该信息,但它比简单的 file_get_contents() 更难获得 - 您必须运行脚本,它是一个完整的 应用程序,以便让它以与您在浏览器中看到的相同的方式提升。

标签: javascript php


【解决方案1】:

当涉及到加载 URL 内容时,我们将 file_get_contents() 称为“哑”函数。它将返回第一次加载 DOM 时呈现的内容。

要获得许多网站的实际内容,您还需要遵循重定向,您可以使用curl 来实现(参考:How to get the real URL after file_get_contents if redirection happens?

如果最终页面使用大量 AJAX 来加载数据,即使 curl 也不会提供所需的内容,而是一些没有实际内容的“裸”HTML 页面。


所以,现在,您需要手动处理加载异步内容,通过解析初始 url 的内容、解析 JS 文件、获取 ajax-url 并在传递目标页面可能生成的 cookie 时再次调用它们为您的要求...

或者使用“本地客户端”,它将像浏览器一样执行页面并能够返回最终数据。

只需调用 file_get_contents("url"); 并期待相同的源代码,就好像您在浏览器中调用该 url 对大多数网站都不起作用一样。

【讨论】:

  • 哪个,顺便说一句 - 如果您链接到另一个 SO 答案,建议您应该投票关闭作为重复,而不是回答... :)
  • @cale_b 这不是重复的问题之类的。该链接应该“添加一些想法”,为什么尝试的方法在许多情况下都不起作用。
  • @dognose 感谢您抽出宝贵时间。你认为我应该如何解决这个问题?我试过 curl 很遗憾它没有用
  • @ibrahim.fathy 查看我的更新。 shop.bitmain.com 高度基于 ajax - 使用plain-php 没有简单的解决方案。
猜你喜欢
  • 2016-05-03
  • 2017-09-30
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多