Как использовать функцию file get contents() с неанглийскими символами в URL?


Я получаю эту ошибку, когда пытаюсь получить доступ к неанглийским (Unicode) URL-адресам с помощью функции PHP file_get_contents(). 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) [функция.file-get-contents]: не удалось открыть поток: HTTP-запрос не удался! HTTP / 1.0 403 запрещено..

Фатальная ошибка: вызов функции-члена find() на не-объекте в G:xampphtdocscodeshtmlParse1.php в строке 8

Существует ли какое-либо ограничение для функции file_get_contents()? Принимает ли он только английские URL-адреса?

2 4

2 ответа:

Вы пропускаете информацию заголовка, как агент пользователя. Я бы посоветовал вам просто использовать просто использовать curl

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

Live CURL Demo

Если вы должны использовать 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 ;

Live file_get_content Demo

Если есть 403 Forbidden, соединение должно работать. Это просто предупреждение, что веб-сервер ответил кодом состояния 403. Википедия запрещает загрузку без действительного агента пользователя:

Скрипты должны использовать информативную строку User-Agent с контактной информацией, иначе они могут быть заблокированы IP-адресом без предварительного уведомления.

Вторая ошибка должна быть из следующих строк, которые обрабатывают результат (строковый объект) вашего вызова file_get_contents(...).

Edit: Вы должны попробуйте настроить агент пользователя, например, с помощью ini_set('user_agent', 'wikiPHP'); Перед выполнением запроса. Это должно сработать нормально.