8

file_get_contents在 PHP 中使用。在下面的第一个 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

4 回答 4

14

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);

谢谢大家的指导。

于 2013-06-29T05:18:07.713 回答
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 以查看它是否失败,它实际上看起来好像它已经工作了。

如果您需要欺骗用户代理(可能还有其他东西)以尝试获取 url 以接受您的请求,您需要尝试使用 curl 库并尝试不同的组合以尝试使其正常工作。首先尝试查看 curl 命令行的工作原理也是减少调查开发时间的好方法。

这是以前经历过的人:

php curl:我怎样才能像 Web 浏览器一样模拟 get 请求?

于 2013-06-28T12:21:43.013 回答
1

看起来第二个 url 有时回答太慢了,可能有重定向。尝试使用 curl 并设置更大的超时。另外,打开错误

error_reporting(-1);
ini_set('display_errors','On');
于 2013-06-28T11:58:39.070 回答
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);
?>
于 2019-07-22T05:48:19.713 回答