PHP - file_get_contents没有获取所有内容(尝试使用curl,结果相同)

时间:2017-05-03 08:26:08

标签: javascript php curl

我尝试获取网页的源代码。

$urlArena = 'http://arenavision.in/';
$suffixeSchedule = 'schedule';
$url = $urlArena.$suffixeSchedule;
//url = http://arenavision.in/schedule
$text = file_get_contents($url);
$fp = fopen('data.txt', 'w');
$text .= date('d-m-Y h:m:s'); 
fwrite($fp, $text);
fclose($fp);

我将它写在一个文件上,以确保包含var $ text:

<html>
   <head>
        <script type="text/javascript">
            <pre>
              //<![CDATA[
              try{if (!window.CloudFlare) {var CloudFlare=         
           [{verbose:0,p:0,byc:0,owlid:"cf",bag2:1,mirage2:0,oracle:0,paths:{cloudflare:"/cdn-cgi/nexp/dok3v=1613a3a185/"},atok:"aea30972f99dcd729c29d94acbb3cc58",petok:"87f9b51be2424b953e36dd5ec0f8ce1b0f74a3b5-1493799639-1800",zone:"arenavision.in",rocket:"a",apps:{}}];document.write('<script type="text/javascript" src="//ajax.cloudflare.com/cdn-cgi/nexp/dok3v=85b614c0f6/cloudflare.min.js"><'+'\/script>');}}catch(e){};
//]]>
        </script>
        <script type="text/rocketscript">function set_cookie(){var now = new 
            Date();var time = now.getTime();time += 19360000 * 
            1000;now.setTime(time);document.cookie='beget=begetok'+'; 
            expires='+now.toGMTString()+'; path=/';}set_cookie();location.reload();;
        </script>
    </head>
    <body></body>
</html>
03-05-2017 08:05:46
</pre>

网页上是否有取消函数file_get_contents的脚本? 我可以避免吗?

我尝试卷曲,但我得到相同的结果。 我尝试使用其他网站(google.com),我能够获得所有源代码。

提前感谢您的帮助,

-G。

3 个答案:

答案 0 :(得分:1)

此网站上的内容动态生成。因此,您无法下载可在浏览器中看到的完整页面。

enter image description here

无论如何,网站受到某些云系统的保护。但您可以在请求中提供Cookie以获取整页:enter image description here

enter image description here

您必须模拟真实用户 - 在请求中添加cookie,在第一次响应之前接受它们。使用CURL来实现它

答案 1 :(得分:1)

网站需要一些cookie来获取您想要的页面。

这是场景:

1)卷曲第一页http://arenavision.in

2)使用正则表达式获取此值

document.cookie='beget=begetok'
//               ^^^^^^^^^^^^^

3)将cookie值发送到下一个请求。

以下是使用cURL终端命令的快速示例: -

curl 'http://arenavision.in/'

输出:

<html><head><script>function set_cookie(){var now = new Date();var time = now.getTime();time += 19360000 * 1000;now.setTime(time);document.cookie='beget=begetok'+'; expires='+now.toGMTString()+'; path=/';}set_cookie();location.reload();;</script></head><body></body></html>

在下一个请求中使用document.cookie的值可以解决问题:

curl 'http://arenavision.in/' -H 'Cookie: beget=begetok'

答案 2 :(得分:0)

感谢Alex Slipknot和hassan。

你的两个解释帮助我理解很多。 所以它有效:) 这是我的最终代码:

$url = $urlArena.$suffixeSchedule;
$text = get_data($url);
$fp = fopen('data.txt', 'w');
$text .= date('d-m-Y h:m:s'); 
fwrite($fp, $text);
fclose($fp);

function get_data($url) {
$cookie = get_cookie($url);
if(!isset($cookie) || strlen($cookie) == 0)
{
    debug('error : '.$cookie.' strlen : '.strlen($cookie));
    return false;
}
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}

function get_cookie($url)
{
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$data = curl_exec($ch);
curl_close($ch);
preg_match('/document.cookie=\'([^\']+)\'/',$data,$m);
print_r($m);
return $m[1];
}