php - 失败时尝试再次加载URL

标签 php url error-handling simple-html-dom

以下函数接收表示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暂时处于脱机状态,则保持失败是有道理的,但是它们不是(我在运行脚本时检查过)。

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

我还要指出的是,当开始加载网址失败时,它仅给出警告(而不是多个),并显示以下消息:

PHP Warning: file_get_contents(http://www.foo.com/resource): failed to open stream: HTTP request failed! in simple_html_dom.php on line 1081



这行代码提示:
$ret = $html->load_file($url);

最佳答案

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

因此,即使您从同一域加载页面,页面或服务器上也可能会有一些保护。
例如,page可以查找一些cookie,或者服务器可以查找您的用户代理,并且如果它将您视为漫游器,则它不会提供正确的内容。

解析某些网站时,我遇到了类似的问题。
对我来说,答案是查看某些页面/服务器期望什么,并使我的代码进行模拟。从伪造用户代理到生成Cookie等各种内容。

顺便说一句,您是否尝试过创建一个简单的php脚本,只是为了测试“简单的html dom”解析器是否可以在您的服务器上正常运行?那是我要检查的第一件事。

最后,我必须在一种情况下添加该代码,尽管我多次尝试解析一页都失败了,但我无法赢得蒙版游戏。最后,我制作了一个脚本,该脚本在linux命令行文本浏览器lynx中加载该页面,并将整个页面保存在本地,然后我解析了运行良好的本地文件。

关于php - 失败时尝试再次加载URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12616334/

相关文章:

php - laravel belongstomany 有条件

php - 在 PHP 站点上实现权限数据库结构以限制多个级别的访问

php - Magento 前端直到最后才呈现

javascript - 如果 URL 中的日期晚于当月则重定向

javascript - 模式: How to access object.properties (correctly) from result returned by async function

php - 如何在类调用者级别提供错误报告的同时正确调用类

php - 如何在保持服务层抽象的同时使用 Yii 组件?

url - 我如何使用这个 github 网址?

查询字符串参数的 Java URL 编码

c - 如何检查 C 源文件是否缺少返回错误检查?