【问题标题】:PHP Cannot get the text from an URL (file_get_content, CURL did not work)PHP 无法从 URL 获取文本(file_get_content,CURL 不起作用)
【发布时间】:2016-12-17 22:00:27
【问题描述】:

我正在尝试从以下网址获取文本。 http://stp.stheadline.com/data/indexNewsMarquee.json

我尝试了几种方法,但都没有奏效。我现在真的很绝望,请帮助我并提前感谢。

附:我已经在我的 ini.php 中启用了 allow_url_fopen。 附言我正在使用 XAMPP v3.3.2 和 PHP v5.6.23

以下是我尝试过(但失败)的代码

卷曲

$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
curl_close($ch);
echo $result;

结果:空字符串

file_get_contents

echo file_get_contents($url, true);

结果:打开流失败:HTTP 请求失败!

读取文件

echo readfile($url)

结果:输出地址本身

【问题讨论】:

标签: php http url curl file-get-contents


【解决方案1】:

试试这个。

$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'http://stp.stheadline.com/data/indexNewsMarquee.json');
$result = curl_exec($ch);
curl_close($ch);

echo($result); // Json data

/*$obj = json_decode($result); // To get result in array
print_r($obj);*/

或者

$url = 'http://stp.stheadline.com/data/indexNewsMarquee.json';
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
curl_close($ch);

echo($result); // Json data

它对我有用:)

【讨论】:

    【解决方案2】:

    凯文,

    请尝试以下代码。

    header('Content-Type: text/html; charset=utf-8');
    
    $url='http://stp.stheadline.com/data/indexNewsMarquee.json';
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('text/html; charset=utf-8'));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_ENCODING, "");
    curl_setopt($ch, CURLOPT_URL, $url);
    $result = curl_exec($ch);
    curl_close($ch);
    $final_result = json_decode($result);
    
    echo "<pre>";
    print_r($final_result);
    

    我在您的代码中添加了header('Content-Type: text/html; charset=utf-8');curl_setopt($ch, CURLOPT_ENCODING, "");,它可以正常工作,也可以显示正确的字符。

    【讨论】:

      【解决方案3】:

      您好,您必须在 curl 请求中传递标头,以便服务器可以将其视为浏览器请求。

       $url="http://stp.stheadline.com/data/indexNewsMarquee.json";
      
       $requestHeaders = array(
          "Accept:application/json, text/javascript, */*; q=0.01",
          "Accept-Language:en-US,en;q=0.8",
          "Connection:keep-alive",
          "Host:stp.stheadline.com",
          "Origin:http://stp.stheadline.com",
          "Referer:http://stp.stheadline.com/data/indexNewsMarquee.json",
          "User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36"
       );
      
       $ch = curl_init();
       curl_setopt($ch, CURLOPT_URL, $url);
       curl_setopt($ch, CURLOPT_HTTPHEADER, $requestHeaders);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
       $output = curl_exec($ch);
       curl_close($ch);
       echo $output;
      

      【讨论】:

      • 谢谢它的工作。你能解释一下我做错了什么吗(传递标题是什么意思)我对此很陌生,所以如果你能详细说明一下,我将非常感激。提前谢谢
      • 是的@Kevin,看来stp.stheadline.com 已经实施了安全措施,以防止访问服务器上的未知请求。通过在 curl 请求中包含标头,例如 origin、referer、urger 代理 .. 以便服务器确保请求来自浏览器...这就像使用 CURL 请求作为浏览器请求的一些技巧 :).. 我希望你喜欢我的回答并给予投票并标记为正确...在此先感谢
      • 感谢您的解释。如何确定网站是否有安全实施。只是好奇。谢谢。
      【解决方案4】:

      像这样使用:

       $curl_handle=curl_init();
       curl_setopt($curl_handle,CURLOPT_URL,'Your URL');
       curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
       curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
       curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Your application name');
      $query = curl_exec($curl_handle);
      curl_close($curl_handle);
      print_r($query);
      

      我从您的 URL 中检查了此代码。

      【讨论】:

      • 并离开“您的应用程序名称”部分并试用
      • 谢谢它的工作。在您的代码中,有 (CURLOPT_USERAGENT 和 **CONNECTION_TIMEOUT**(我没有)。您能告诉我代码做了什么吗?提前致谢。
      • @Kevin 1. CONNECTTIMEOUT :尝试连接时等待的秒数。 (0 表示无限)。 2. USERAGENT : HTTP 请求中使用的“User-Agent:”标头的内容。
      【解决方案5】:

      他们要求用户代理出现在请求中,所以请尝试:

      $url='http://stp.stheadline.com/data/indexNewsMarquee.json';
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_USERAGENT, 'banana');
      curl_setopt($ch, CURLOPT_URL, $url);
      $result = curl_exec($ch);
      curl_close($ch);
      echo $result;
      

      【讨论】:

      • 我真的很好奇,您是如何确定请求中需要用户代理的...?
      • 尝试 curl 请求的经验表明,在许多情况下,当请求静默失败时,添加用户代理使其工作(就像在此请求中所做的那样)〜大概是因为某些机器人没有用户代理因此不会显示为有效的浏览器流量。
      • 嗯,好吧。很高兴知道。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      相关资源
      最近更新 更多