file_get_contents不适用于某些网址

时间:2013-06-28 11:21:34

标签: php curl file-get-contents

我在PHP中使用file_get_contents。在下面的代码中,第一个URL工作正常,但第二个不起作用。


$URL = "http://test6473.blogspot.com";
$domain = file_get_contents($URL);
print_r($domain);


$add_url= "http://adfoc.us/1575051";
$add_domain = file_get_contents($add_url);
echo $add_domain;

关于为什么第二个不起作用的任何建议?

4 个答案:

答案 0 :(得分:11)

file_get_contents未检索到的URL,因为它们的服务器会检查请求是来自浏览器还是来自任何脚本。如果他们从脚本中找到了请求,他们只会禁用页面内容。

因此我必须提出类似浏览器请求的请求。所以我使用以下代码来获取第二个url内容。对于不同的Web服务器可能会有所不同。因为他们可能会进行不同的检查。

即使你为什么不尝试使用以下代码!如果你很幸运,这对你有用!!

function getUrlContent($url) {
    fopen("cookies.txt", "w");
    $parts = parse_url($url);
    $host = $parts['host'];
    $ch = curl_init();
    $header = array('GET /1575051 HTTP/1.1',
        "Host: {$host}",
        'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language:en-US,en;q=0.8',
        'Cache-Control:max-age=0',
        'Connection:keep-alive',
        'Host:adfoc.us',
        'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36',
    );

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
    curl_setopt($ch, CURLOPT_COOKIESESSION, true);

    curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
    curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

$url = "http://adfoc.us/1575051";
$html = getUrlContent($url);

感谢大家的指导。

答案 1 :(得分:2)

不幸的是,看起来第二个站点阻止了无法识别的浏览器的访问。即使使用命令行中的curl也不起作用:

curl -I http://adfoc.us/1575051

给出:

HTTP/1.1 200 OK
Server: cloudflare-nginx
Date: Fri, 28 Jun 2013 12:15:40 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.5.0
Set-Cookie: __cfduid=d7cd1bf18c136a288cc2b36065a3b31f01372421740; expires=Mon, 23-Dec-2019 23:50:00 GMT; path=/; domain=.adfoc.us
CF-RAY: 85a4dc6829e06d0

但没有内容。请注意它返回状态200,因此如果您检查返回的字符串是否为boolean === false以查看它是否失败,它实际上看起来好像它已经有效。

如果您需要欺骗使用者(以及可能的其他内容)尝试让网址接受您的请求,您需要尝试使用curl库并尝试不同的组合以尝试使其工作。首先尝试使用curl命令行进行试验也是减少调查开发时间的好方法。

以前有人经历过此事:

php curl: how can i emulate a get request exactly like a web browser?

答案 2 :(得分:1)

看起来有时第二个网址答案太慢,可能有重定向。 尝试使用curl并设置更大的超时。 另外,转错

error_reporting(-1);
ini_set('display_errors','On');

答案 3 :(得分:0)

您也可以尝试此代码

<?php

function getUrlContent($url) {
    $parts = parse_url($url);
    $host = $parts['host'];
    $ch = curl_init();
    $header = array('GET /1575051 HTTP/1.1',
        "Host: {$host}",
        'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language:en-US,en;q=0.8',
        'Cache-Control:max-age=0',
        'Connection:keep-alive',
        'Host:adfoc.us',
        'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36',
    );

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

$url = "https://news.google.com/rss/search?q=apple&hl=en-IN&gl=IN&ceid=IN:en";
$html = getUrlContent($url);

$xml = simplexml_load_string($html);
$json = json_encode($xml);
$array = json_decode($json,TRUE);


print_r($array);
?>