【问题标题】:Prevent to Be Crawled by a Script防止被脚本爬取
【发布时间】:2011-12-20 09:35:18
【问题描述】:

我试图使用 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 库无关。

可能是因为某些服务器阻止自己被这种类型的脚本“抓取”?或者,也许我只是在这里遗漏了什么?

先谢谢了。

类似问题:

【问题讨论】:

  • 您是否收到任何错误消息或意外输出?
  • @Jack Maney:不,我的脚本/页面一直在“尝试”(浏览器看起来正忙于加载某些内容)直到超时。

标签: php apache curl


【解决方案1】:

$target_url = "http://" 。 $_SERVER['SERVER_NAME'] 。 “/新闻稿/index.html”;

我不确定上面的表达式是否真的为你返回了正确的 URL,
这可能是所有问题的原因。

可能是因为某些服务器阻止自己被这种类型的脚本“爬网”吗?

是的,它可能是。
但是我没有答案,因为你没有输入实现细节。
这是您的网站,您应该可以查看。

总的来说,我会说这是一个坏主意,
如果您尝试从同一域访问另一个页面,
你可以简单地做file_get_contents(PATH_TO_FILE.'/press-release/index.html');
(通过扩展 HTML 判断,我假设是静态页面)

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

【讨论】:

  • 感谢您的意见 (+1)!我试图包含的页面可以是静态的和动态的。后者实际上是一个“托管”在 WordPress 博客上的页面(虽然是同一台服务器),例如http://&lt;my-domain&gt;/blog/category/。所以,我需要一种方法来触发该页面,就好像它是由浏览器查看的一样;因此,cURL 库。
  • 我们有哪些选项可以检查网站是否真的“可抓取”?
  • 在您真正卷曲页面之前,您无法进行检查。但是,您可以设置超时php.net/manual/en/function.curl-setopt.php
  • 从命令行运行 curl http://&lt;my-domain&gt;/press-release/index.html 有效。因此,确认页面确实可以卷曲。
  • 是的,除非有一些奇怪的配置
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    一个要点:请先从命令行尝试curl -v,这可能会给你有用的线索。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      相关资源
      最近更新 更多