防止被脚本抓取

时间:2011-12-20 09:35:19

标签: php apache curl

我试图使用PHP从同一站点读取页面。我遇到了这个good discussion并决定使用建议的 cURL 方法:

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);

我无法理解的是它在我的所有测试服务器上工作但只有一个。我已经验证了 cURL 在相关服务器上可用。另外,设置`$ target_url =“http://www.google.com”工作正常。所以,我非常肯定罪魁祸首与 cURL 库无关。

是否可以因为某些服务器阻止自己被这种类型的脚本“抓取”?或者,也许我只是错过了一些东西?

事先谢谢。

类似的问题:

3 个答案:

答案 0 :(得分:2)

  

$ target_url =“http://”。 $ _SERVER ['SERVER_NAME']。 “/press-release/index.html”;

我不确定上面的表达式实际上是否为您返回了正确的网址,
这可能是所有问题的原因。

  

是否可以因为某些服务器阻止自己被这种类型的脚本“抓取”?

是的,可能是。
但是我没有答案,因为你没有提供实施细节 这是您的网站,您应该可以查看。

在一般情况下,我会说这是一个坏主意,
如果您尝试访问同一域中的其他页面,请执行 你可以简单地做file_get_contents(PATH_TO_FILE.'/press-release/index.html');
(通过扩展HTML判断,我认为是静态页面)

如果该页面需要一些PHP处理,
好吧,你只需要准备所有必要的变量......然后需要文件。

答案 1 :(得分:0)

尝试使用HTTP_HOST而不是SERVER_NAME。它们并不完全相同。

答案 2 :(得分:0)

事实证明,上述脚本没有任何问题。是的,$target_url = "http://" . $_SERVER['SERVER_NAME'] . "/press-release/index.html";返回了预期值(由@ajreal在他的回答中提出质疑)。

问题实际上是由于IP(目标页面)的解析方式,这使得这个问题的答案与PHP和Apache无关:当我在被测服务器上运行脚本时,返回的IP地址无法访问。请参阅此more detailed explanation /讨论。

一个消息:请先从命令行尝试curl -v,这可能会为您提供有用的线索。