2011-12-20 80 views
1

我試圖從使用PHP的同一站點讀取頁面。我碰到這個good discussion並決定使用捲曲方法建議:防止被腳本抓取

function get_web_page($url) 
{ 
    $options = array(
     CURLOPT_RETURNTRANSFER => true,  // return web page 
     CURLOPT_HEADER   => false, // don't return headers 
     CURLOPT_FOLLOWLOCATION => true,  // follow redirects 
     CURLOPT_ENCODING  => "",  // handle all encodings 
     CURLOPT_AUTOREFERER => true,  // set referer on redirect 
     CURLOPT_CONNECTTIMEOUT => 120,  // timeout on connect 
     CURLOPT_TIMEOUT  => 120,  // timeout on response 
     CURLOPT_MAXREDIRS  => 10,  // stop after 10 redirects 
    ); 

    $ch  = curl_init($url); 
    curl_setopt_array($ch, $options); 
    $content = curl_exec($ch); 
    $err  = curl_errno($ch); 
    $errmsg = curl_error($ch); 
    $header = curl_getinfo($ch); 
    curl_close($ch); 

    $header['errno'] = $err; 
    $header['errmsg'] = $errmsg; 
    $header['content'] = $content; 
    return $header; 
} 

//Now get the webpage 
$data = get_web_page("https://www.google.com/"); 

//Display the data (optional) 
echo "<pre>" . $data['content'] . "</pre>"; 

所以,對於我來說,我叫get_web_page這樣的:

$target_url = "http://" . $_SERVER['SERVER_NAME'] . "/press-release/index.html";   
$page = get_web_page($target_url); 

的事情,我不能fathom在我所有的測試服務器上都能正常工作,只有一個。我已驗證相關服務器上可以使用cURL。此外,設置`$ target_url =「http://www.google.com」工作正常。所以,我相當肯定,罪魁禍首與圖書館沒有任何關係。

難道是因爲某些服務器阻止他們被這種類型的腳本「抓取」?或者,也許我在這裏錯過了一些東西?

預先感謝。

類似的問題:

+0

您是否收到任何錯誤消息或意外輸出? – 2011-12-20 09:38:54

+0

@Jack Maney:不,我的腳本/頁面只是保持「嘗試」(瀏覽器看起來正在忙着加載內容),直到超時。 – moey 2011-12-20 09:44:58

回答

0

原來上面的腳本沒有錯。是的,$target_url = "http://" . $_SERVER['SERVER_NAME'] . "/press-release/index.html";返回了預期的價值(如答案中的@ajreal所質疑)。

這個問題實際上是由於如何解析IP(目標頁面的),這使得這個問題的答案與PHP或Apache無關:當我在被測服務器上運行腳本時,返回的IP地址不可訪問。請參閱此more detailed explanation /討論。

一拿走:請先從命令行嘗試curl -v,這可能會給你有用的線索。

2

$ target_url = 「HTTP://」。 $ _SERVER ['SERVER_NAME']。 「/press-release/index.html」;

我不知道上面的表達實際上是返回正確的網址給你,
這可能所有問題的原因。

難道是因爲有些服務器阻止自己被這種類型的腳本「抓取」嗎?

是的,它可能是。
但我沒有答案,因爲你沒有提供實施細節。
這是你的網站,你應該能夠檢查。

在一般情況下,我會說這是一個壞主意,
如果你正試圖從同一個域訪問另一個頁面,
你可以簡單地做file_get_contents(PATH_TO_FILE.'/press-release/index.html');
(通過擴展HTML法官,我假設是靜態頁面)

如果該頁面需要一些PHP處理,
那麼,您只需要準備好所有必要的變量......然後需要該文件。

+0

感謝您輸入(+1)!我試圖包含的頁面可以是靜態的和動態的。後者實際上是在WordPress博客(同一服務器上)上「託管」的頁面,例如'http:// /blog/category /'。所以,我需要一種觸發該頁面的方式,就好像它被瀏覽器查看一樣;因此,'cURL'庫。 – moey 2011-12-20 10:21:46

+0

我們必須檢查網站是否實際上是「可抓取」的? – moey 2011-12-20 10:34:40

+0

除非您確實捲曲頁面,否則無法選中。但是,您可以設置超時http://www.php.net/manual/en/function.curl-setopt.php – ajreal 2011-12-20 10:45:52

0

嘗試使用HTTP_HOST而不是SERVER_NAME。他們不完全一樣。