file_get_contents возвращает 403 запрещенных

Я пытаюсь создать сайт. Я сделал это на своей локальной машине, и там работает очень хорошо. Когда я выполняю то же самое на своем сервере, он показывает 403 запрещенную ошибку. Я использую PHP Simple HTML DOM Parser . Ошибка, которую я получаю на сервере, такова:

Предупреждение: file_get_contents (http://example.com/viewProperty.html?id=7715888) [function.file-get-contents]: не удалось открыть поток: HTTP-запрос не удался! HTTP / 1.1 403 Запрещено в /home/scraping/simple_html_dom.php в строке 40

Строка запуска кода:

$url="http://www.example.com/viewProperty.html?id=".$id; $html=file_get_html($url); 

Я проверил php.ini на сервере, и allow_url_fopen включен. Возможное решение может быть связано с завихрением, но мне нужно знать, где я ошибаюсь.

Это не проблема с вашим скриптом, а с ресурсом, который вы запрашиваете. Веб-сервер возвращает «запрещенный» код состояния.

Может быть, он блокирует PHP-скрипты, чтобы предотвратить очистку, или ваш IP-адрес, если вы сделали слишком много запросов.

Вероятно, вам следует поговорить с администратором удаленного сервера.

Вы можете изменить его таким образом в классе парсеров из строки 35 и далее.

 function curl_get_contents($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); $data = curl_exec($ch); curl_close($ch); return $data; } function file_get_html() { $dom = new simple_html_dom; $args = func_get_args(); $dom->load(call_user_func_array('curl_get_contents', $args), true); return $dom; } 

Вы пробовали другой сайт?

Я знаю, что это довольно старая нить, но подумал о том, чтобы поделиться некоторыми идеями.

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

Поэтому, чтобы веб-сайт подумал, что скрипт, обращающийся к веб-странице, также является человеком, вы должны изменить заголовок User-Agent во время запроса. Большинство веб-серверов, скорее всего, разрешат ваш запрос, если вы установите заголовок User-Agent на значение, которое используется некоторым обычным веб-браузером.

Список общих пользовательских агентов, используемых браузерами, приведен ниже:

  • Chrome: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'

  • Firefox: 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0'

  • и т.д…


 $context = stream_context_create( array( "http" => array( "header" => "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36" ) ) ); echo file_get_contents("www.google.com", false, $context); 

Этот фрагмент кода подделывает пользовательский агент и отправляет запрос на https://google.com .

Рекомендации:

  • stream_context_create

Ура!

Кажется, что на удаленном сервере есть какой-то тип блокировки. Это может быть пользовательский агент , если это так, вы можете попробовать использовать завиток, чтобы имитировать пользовательский агент веб-браузера следующим образом:

 $url="http://www.example.com/viewProperty.html?id=".$id; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); $html = curl_exec($ch); curl_close($ch); 

Напишите это в simple_html_dom.php для меня, это сработало

 function curl_get_contents($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); $html = curl_exec($ch); $data = curl_exec($ch); curl_close($ch); return $data; } function file_get_html($url, $use_include_path = false, $context=null, $offset = -1, $maxLen=-1, $lowercase = true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) { $dom = new simple_html_dom; $args = func_get_args(); $dom->load(call_user_func_array('curl_get_contents', $args), true); return $dom; //$dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText); } 

Я понимаю, что это старый вопрос, но …

Просто настроив мою локальную песочницу на linux с php7 и пробежав по ней. Используя сценарии запуска терминала, php вызывает php.ini для CLI. Я обнаружил, что опция user_agent была закомментирована. Я раскоментировал его и добавил пользовательский агент Mozilla, теперь он работает.

Проверяли ли вы свои права на файл? Я установил 777 в свой файл (в localhost, очевидно), и я исправил проблему.

Я получил тот же pb. Я только что активировал Youtube API от разработчиков консоли Google … и он работал (не более запрещен 🙂

Я не знаю, обесценен ли предмет, я думал просто поделиться идеей С наилучшими пожеланиями