以下函数接收表示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它必须处理。
如果网址暂时脱机,那么保持失败是有意义的,但它们不是(我在脚本运行时已经检查过)。
为什么这不能正常工作?
我还想指出,当开始无法加载网址时,它只会发出警告(而不是多个),并显示以下消息:
PHP警告:file_get_contents(http://www.foo.com/resource):失败 打开流:HTTP请求失败!在simple_html_dom.php上 1081
这行代码提示:
$ret = $html->load_file($url);
答案 0 :(得分:1)
我已经测试了你的代码,它对我来说非常有效,每次调用该函数时它都会从第一次返回有效结果。
因此,即使您从同一个域加载页面,也可以对页面或服务器进行一些保护。 例如,页面可以查找某些cookie,或者服务器可以查找您的用户代理,如果它将您视为机器人,则无法提供正确的内容。
在解析某些网站时遇到了类似的问题。 对我来说,答案是看看页面/服务器的期望是什么,并让我的代码模拟它。一切,从伪造用户代理到生成cookie等。
顺便说一句,您是否尝试创建一个简单的PHP脚本来测试“简单的html dom”解析器可以在您的服务器上运行而没有错误?这是我要检查的第一件事。
最后,我必须在一个案例中添加,虽然我在多次尝试解析一个页面时失败了,但我无法赢得掩蔽游戏。最后,我创建了一个脚本,在linux命令行文本浏览器lynx中加载该页面并在本地保存整个页面,然后我解析了完美的本地文件。
答案 1 :(得分:0)
可能是 load_file()函数本身的问题。
问题是,函数error_get_last()也返回所有私有的错误,不知道,可能依赖于PHP版本?
我通过将其更改为(解决是否更改错误,而不是错误)来解决问题 (或使用非对象函数: 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;
}
}