解析

2012-05-13 84 views
2

當頁面返回不同的內容我要解析此頁:解析

http://muoversiaroma.it/paline/percorso/52732?nav=3

如果通常通過瀏覽器訪問,它返回正確的內容,但如果我嘗試分析它: @ file_get_html($ url)或file_get_html 它返回一個完全不同的內容,看起來像一個默認頁面。他們可能會在頁面中插入什麼來保護它,如果是這種情況,我該如何克服它?

謝謝,Fabrizio

回答

0

你的問題幾乎肯定與標題。這裏是你可以做什麼來測試(注:我用file_get_contents()代替file_get_html(),因爲我沒有simple HTML DOM parser庫,但結果應該是相當的):

1)創建一個名爲您的PHP服務器上的文件「測試.PHP」與這些內容(可以使用另一端口而不是9002,如果你喜歡):

<?=file_get_html('http://localhost:9002/');?> 

2)從終端,在運行的netcat聽您在上方使用的任何端口模式:

nc -lp9002 

3)在您的瀏覽器中,點擊測試頁面:http://YOUR_SITE.com/PATH/test.php。 Netcat的會告訴你什麼頭中的HTML解析器發送:再次

GET/HTTP/1.0 
Host: 192.168.1.127:9002 

4)現在關閉的netcat(CTRL+C),然後啓動它就像在步驟2中

5)這一次打的直接端口從瀏覽器:http://YOUR_SITE.com:9002/。現在,Netcat的會告訴你什麼是郵件頭。您的瀏覽器發送:

GET/HTTP/1.1 
Host: harveyserv.ath.cx:9002 
User-Agent: Mozilla/5.0 (Windows NT 6.0; rv:12.0) Gecko/20100101 Firefox/12.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 

所以,你有可能是這些差異中的任何東西,但對於初學者來說,你可以看看那個file_get_contents()發送一個HTTP的事實問題1.0當今大多數瀏覽器使用HTTP 1.1(這也對應於「Connection:keep-alive」標頭)。還有很多網站基於「用戶代理」和「接受」標題發送不同的內容。

希望有所幫助。

0

謝謝。幸運的是,Atac擁有一個測試網站http://beta.muovi.roma.it,它提供了更好的錯誤消息,並根據我的要求澄清了新版本也期望代理。一旦我提供了一個測試版和主版本都得到了正確的解析。 這是相關的一段代碼:

$someUA = array (
"Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9.1b1) Gecko/20081007 Firefox/3.1b1", 
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.0", 
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.4.154.18 Safari/525.19", 
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13", 
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)", 
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.40607)", 
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322)", 
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.0.3705; Media Center PC 3.1; Alexa Toolbar; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", 
"Mozilla/45.0 (compatible; MSIE 6.0; Windows NT 5.1)", 
"Mozilla/4.08 (compatible; MSIE 6.0; Windows NT 5.1)", 
"Mozilla/4.01 (compatible; MSIE 6.0; Windows NT 5.1)" 
); 

function getRandomUserAgent() { 
    srand((double)microtime()*1000000); 
    global $someUA; 
    return $someUA[rand(0,count($someUA)-1)]; 
} 


function atac_get_html($url, $language){ 
//$url='http://muovi.roma.it/paline/palina/77113?nav=4'; //manual forcing 
set_include_path("/iPhone/simplehtmldom_1_5"); 
require_once('simple_html_dom.php'); 
require_once('atacurl.php'); 
// Create DOM from URL or file 
//$atacurl=atacurl(); 
//$languageUrl=$atacurl."/lingua/set/".$language; 

$languageUrl="http://muovi.roma.it/lingua/set/en"; 
if (!isset($_SESSION['ckfile'])) { 
    $ckfile = tempnam ("/tmp", "CURLCOOKIE"); 
    $_SESSION['ckfile']=$ckfile; 
/* STEP 2. visit the homepage to set the cookie properly */ 
    $ch = curl_init ($languageUrl); 
    curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); 
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($ch, CURLOPT_USERAGENT, getRandomUserAgent()); 
    $output = curl_exec ($ch); 
} 
} 
$ckfile=$_SESSION['ckfile']; 
/* STEP 3. visit cookiepage.php */ 
$ch = curl_init ($url); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_USERAGENT, getRandomUserAgent()); 
$output = curl_exec ($ch); 
curl_close($ch); 
return str_get_html($output); 
}