2011-12-20 133 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。他们不完全一样。