2016-07-15 77 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

相關問題