0

以下函数接收表示 url 的字符串参数,然后将 url 加载到 simple_html_dom 对象中。如果加载失败,它会尝试再次加载 url。

  public function getSimpleHtmlDomLoaded($url)
  {
    $ret = false;
    $count = 1;
    $max_attemps = 10;
    while ($ret === false) {
      $html = new simple_html_dom();
      $ret = $html->load_file($url);
      if ($ret === false) {
        echo "Error loading url: $url\n";
        sleep(5);
        $count++;
        $html->clear();
        unset($html);
        if ($count > $max_attemps) 
          return false;
      }
    }
    return $html;
  }

但是,如果一次 url 加载失败,它会一直为当前 url 失败,并且在max attemps结束后,它还会在下一次调用该函数时继续失败,并且它必须处理其余的 url。

如果 url 暂时处于脱机状态,则继续失败是有意义的,但它们不是(我在脚本运行时检查过)。

任何想法为什么这不能正常工作?

我还想指出,当开始无法加载 url 时,它只会发出警告(而不是多个警告),并带有以下消息:

PHP 警告:file_get_contents(http://www.foo.com/resource):打开流失败:HTTP 请求失败!在第 1081 行的 simple_html_dom.php 中

这行代码提示:

$ret = $html->load_file($url);
4

2 回答 2

1

我已经测试了您的代码,它对我来说非常有效,每次我调用该函数时,它都会从第一次返回有效结果。

因此,即使您从同一个域加载页面,页面或服务器上也可能会受到一些保护。例如,页面可以查找一些 cookie,或者服务器可以查找您的用户代理,如果它将您视为机器人,它将无法提供正确的内容。

我在解析一些网站时遇到了类似的问题。对我来说,答案是查看某些页面/服务器期望什么,并让我的代码模拟它。一切,从伪造用户代理到生成 cookie 等等。

顺便说一句,您是否尝试过创建一个简单的 php 脚本来测试“简单的 html dom”解析器可以在您的服务器上运行而没有错误?这是我要检查的第一件事。

最后我必须补充一点,在一个案例中,虽然我多次尝试解析一页都失败了,但我无法赢得伪装游戏。最后,我制作了一个脚本,在 linux 命令行文本浏览器 lynx 中加载该页面并将整个页面保存在本地,然后我解析了该本地文件,该文件运行良好。

于 2012-09-27T08:13:49.270 回答
0

可能是load_file()函数本身的问题。

问题是,函数 error_get_last() 也返回所有 privious 错误,不知道,可能取决于 PHP 版本?

I solved the problem by changing it to (check if error changed, not if it is null) (or use the non object function: file_get_html()):

function load_file()
{
    $preerror=error_get_last();
    $args = func_get_args();
    $this->load(call_user_func_array('file_get_contents', $args), true);
    // Throw an error if we can't properly load the dom.
    if (($error=error_get_last())!==$preerror) {
        $this->clear();
        return false;
    }
}
于 2013-10-12T08:28:10.103 回答