我必须解析这个页面:
http://muoversiaroma.it/paline/percorso/52732?nav=3
如果通常由浏览器访问,它会返回正确的内容,但如果我尝试用以下方法解析它: @file_get_html($ url)或file_get_html 它返回一个完全不同的内容,看起来像一个默认页面。如果是这种情况,它们可能会在页面中插入什么来保护它,我该如何克服它?
谢谢,Fabrizio
答案 0 :(得分:0)
您的问题几乎可以肯定是标题。以下是您可以测试的内容(注意:我使用file_get_contents()
代替file_get_html()
,因为我没有simple HTML DOM parser库,但结果应具有可比性):
1)在PHP服务器上创建一个名为“test.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(这也对应于“连接:保持活着”标题)。此外,许多网站根据“用户代理”和“接受”标题发送不同的内容。
希望有所帮助。
答案 1 :(得分: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);
}