2016-07-15 4 views
-3

Я пытаюсь создать базовый скребок. Он отлично работает практически для любого веб-сайта, однако некоторые сайты, которые я не могу удалить, почему это так? Вот мой код на сайте, который работает (этот сайт):PHP не позволяет мне выводить html определенных сайтов, почему?

<!doctype html> 
 
<html lang="en-US"> 
 
    <body> 
 
    <?php 
 
     $url ='http://stackoverflow.com/'; 
 
     $output = file_get_contents($url); 
 
     echo $output; 
 
    ?> 
 
    </body> 
 
</html>

При запуске на моем собственном локальном хосте это выводит содержание в stackoverflow.com мой сайт. Вот сайт, это не работает:

<!doctype html> 
 
<html lang="en-US"> 
 
    <body> 
 
    <?php 
 
     $url ='https://www.galottery.com/en-us/home.html'; 
 
     $output = file_get_contents($url); 
 
     echo $output; 
 
    ?> 
 
    </body> 
 
</html>

Вместо загрузки сайта я получаю эту ошибку:

Warning: file_get_contents(https://www.galottery.com/en-us/home.html): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in C:\xampp\htdocs\projects\QD\webScraping\index.php on line 6

Почему это работает для некоторых сайтов и не для других? Я думал, что это может быть потому, что один из сайтов HTTPS, но я пробовал этот код для других, таких как https://google.com, и он работает отлично.

Я использую XAMMP для запуска локального PHP.

+3

Они вполне возможно, что-то на своем сервере, чтобы остановить людей, очищая их сайты – andrewsi

+0

вы пытались получить доступ к веб-странице с Брауэр? Если вы не можете получить к нему доступ, то вы заблокированы с сайта –

+0

Удаленный сайт блокирует запросы на основе некоторой политики, которую мы не можем знать. Возможно, из-за отсутствия пользовательского агента или подобного. Кстати, если вы собираетесь использовать подобную тактику на общедоступном веб-сайте, обязательно получите соответствующие разрешения, иначе вы можете оказаться в юридической ситуации. – apokryfos

ответ

2

Это работа;

<?php 

$ops = array(
    'http' => array(
     'method' => "GET", 
     'header' => "Accept-language: en\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n" . 
        "Cookie: foo=bar\r\n" . 
        "User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n" 
    ) 
); 

$context = stream_context_create($ops); 

echo file_get_contents('https://www.galottery.com/en-us/home.html', false, $context); 
+0

Они требуют некоторых заголовков с ними. –

+0

Спасибо! Это прекрасно работает и не забывайте о закрытии '?>' –

+0

@solacyon, а как насчет моего ответа? Это было здесь намного раньше ... – spirit

2

Либо они проверяют UserAgent, либо они запрещают ваш IP-адрес.

Для имитации правильного UserAgent, вы должны использовать curl, например:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_HEADER, false); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_AUTOREFERER, true); 

curl_setopt($ch, CURLOPT_URL, "https://www.galottery.com/en-us/home.html"); 
$result = curl_exec($ch); 

echo $result; 

Хотя, они могут использовать некоторые JavaScript-перенаправление, как. сначала вы загружаете веб-страницу, устанавливаете файл cookie и выполняете перенаправление document.location.href. чем они проверяют этот файл cookie.

ОБНОВЛЕНИЕ: только что протестировано, мое решение работает просто отлично.

+0

Следует отметить, что многие считают это грубым движением. – ceejayoz

+0

@ceejayoz, правда? Зачем? Я имитирую работу своего собственного браузера, так что это грубо? – spirit

+0

Поскольку соскабливание сайта, как правило, является нарушением его условий обслуживания, и ограничения на скребковые знаки обычно существуют по уважительной причине. – ceejayoz

Смежные вопросы