file_get_contents возвращает 403 запрещенных - PullRequest
26 голосов
/ 28 декабря 2010

Я пытаюсь сделать сайткрапером.Я сделал это на своей локальной машине, и там он работает очень хорошо.Когда я выполняю то же самое на моем сервере, это показывает 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 Forbiddenв /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Возможное решение может быть с помощью curl, но мне нужно знать, где я иду не так.

Ответы [ 11 ]

28 голосов
/ 13 ноября 2015

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

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

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

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

  • Хром: '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" => "User-Agent: 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.

Ссылки

Ура!

16 голосов
/ 28 декабря 2010

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

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

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

5 голосов
/ 28 декабря 2010

Вы можете изменить его следующим образом в классе анализатора со строки 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;
}

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

4 голосов
/ 05 октября 2015

Напишите это в 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);

}
4 голосов
/ 13 мая 2015

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

$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);
2 голосов
/ 29 августа 2018

При работе с вызовами с сервера на сервер это в основном вызов скрипта PHP.Из-за этого многие удаленные серверы блокируют вызовы с помощью php-скриптов, чтобы избежать копирования сайтов.Это можно легко преодолеть, сделав ваш скрипт таким, как будто он из основного.Вы можете использовать следующий код.

$context = stream_context_create(
    array(
        "http" => array(
            "header" => "User-Agent: 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("https://www.google.co.in", false, $context);
2 голосов
/ 15 ноября 2016

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

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

1 голос
/ 21 июля 2015

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

0 голосов
/ 24 мая 2019

Используйте приведенный ниже код: если вы используете -> file_get_contents

$context  = stream_context_create(
  array(
    "http" => array(
      "header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
    )
));

========= если вы используете curl,

curl_setopt($curl, CURLOPT_USERAGENT,'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36');
0 голосов
/ 22 июня 2018

В моем случае сервер отклонял протокол HTTP 1.0 через его конфигурацию .htaccess.Кажется, file_get_contents использует версию HTTP 1.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...