4

当我尝试使用 PHP 的file_get_contents()函数访问非英语 (Unicode) URL 时出现此错误。网址是: http: //ml.wikipedia.org/wiki/%E0%B4%B2%E0%B4%AF%E0%B4%A3%E0%B5%BD_%E0%B4%AE%E0%B5 %86%E0%B4%B8%E0%B5%8D%E0%B4%B8%E0%B4%BF

我有这个错误:

警告:file_get_contents(http://ml.wikipedia.org/wiki/%E0%B4%B2%E0%B4%AF%E0%B4%A3%E0%B5%BD_%E0%B4%AE%E0%B5 %86%E0%B4%B8%E0%B5%8D%E0%B4%B8%E0%B4%BF) [function.file-get-contents]:打开流失败:HTTP 请求失败!HTTP/1.0 403 禁止..

致命错误:在第 8 行的 G:\xampp\htdocs\codes\htmlParse1.php 中的非对象上调用成员函数 find()

功能有什么限制file_get_contents()吗?它只接受英文网址吗?

4

2 回答 2

3

您缺少诸如用户代理之类的标头信息。我建议你只使用 Just usecurl

$url = 'http://ml.wikipedia.org/wiki/%E0%B4%B2%E0%B4%AF%E0%B4%A3%E0%B5%BD_%E0%B4%AE%E0%B5%86%E0%B4%B8%E0%B5%8D%E0%B4%B8%E0%B4%BF';
$ch = curl_init($url); // initialize curl handle
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17");
curl_setopt($ch, CURLOPT_REFERER, "http://ml.wikipedia.org");
curl_setopt($ch, CURLOPT_ENCODING, "UTF-8");
$data = curl_exec($ch);
print($data);

现场卷曲演示

如果你必须使用file_get_content

$options = array(
        'http'=>array(
                'method'=>"GET",
                'header'=>"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" .
                "Cookie: centralnotice_bucket=0-4.2; clicktracking-session=M7EcNiC2Zcuko7exVGUvLfdwxzSK3Boap; narayam-scheme=ml\r\n" . 
                "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17"
        )
);


$url = 'http://ml.wikipedia.org/wiki/%E0%B4%B2%E0%B4%AF%E0%B4%A3%E0%B5%BD_%E0%B4%AE%E0%B5%86%E0%B4%B8%E0%B5%8D%E0%B4%B8%E0%B4%BF';
$context = stream_context_create($options);
$file = file_get_contents($url, false, $context);
echo $file ;

直播 file_get_content 演示

于 2013-01-20T20:09:27.450 回答
1

如果有403 Forbidden,则连接应该有效。这只是一个警告,网络服务器以状态码 403 响应。维基百科拒绝在没有有效用户代理的情况下进行下载:

脚本应使用包含联系信息的用户代理字符串,否则它们可能会被 IP 阻止,恕不另行通知。

第二个错误应该来自处理file_get_contents(...)调用结果(字符串对象)的下一行。

编辑:您应该ini_set('user_agent', 'wikiPHP');在发出请求之前尝试使用例如设置您的用户代理。那应该可以正常工作。

于 2013-01-20T19:25:11.183 回答