PHP未收到任何数据


PHP no data received

我正在从站点挖掘数据,但它是分页器,但我需要获取所有页面。到下一页的链接写在链接标签中,rel=next。如果没有更多页面,则表示缺少链接标记。我创建了一个名为getAll的函数,它应该一次又一次地调用self,直到有了链接标记。

function getAll($url, &$links) {
    $dom = file_get_html ($url); // create dom object from $url
    $tmp = $dom->find('link[rel=next]', 0); // find link rel=next
    if(is_object($tmp)){ // is there the link tag?
        $link = $tmp->getAttribute('href'); // get url of next page - href attribute
        $links[] = $link; // insert url into array
        getAll($link, $links); // call self
    }else{
        return $links; // there are no more urls, return the array
    }
}
// usage
$links = array();
getAll('http://www.zbozi.cz/vyrobek/apple-iphone-5/', $links);
print_r($links); // dump the links

但我遇到了一个问题,当我运行脚本时,Chrome中会出现"No data received"的消息。我对错误或其他什么一无所知。这个函数应该可以工作,因为当我不再使用它时,它会返回一个链接——指向第二个页面。

我认为问题出在不正确的语法或不正确的指针使用上。

你能帮帮我吗?

我不知道file_get_htmlfind应该做什么,但这应该有效:

<?php
function getAll($url, &$links) {
    $dom = new DOMDocument();
    $dom->loadHTML(file_get_contents($url));
    $linkElements = $dom->getElementsByTagName('link');
    foreach ($linkElements as $link => $content) {
        if ($content->hasAttribute('rel') && $content->getAttribute('rel') === 'next') {
            $nextURL = $content->getAttribute('href');
            $links[] = $nextURL;
            getAll($nextURL, $links);
        }
    }
}
$links = array();
getAll('http://www.zbozi.cz/vyrobek/apple-iphone-5/', $links);
print_r($links);

首先,这可能更容易。如果没有错误消息,这可能是从DNS错误到文件中损坏的空格字符。所以,如果你还没有,试着把这个添加到你的脚本顶部:

error_reporting(E_ALL);
ini_set("display_errors", "1");

它应该揭示可能发生的任何错误。但如果这不起作用,我有两个想法:

你不可能出现语法错误,因为那样脚本甚至无法运行。您说过删除递归会产生一个结果,因此脚本必须工作。

一种可能是时间不合适。这取决于服务器配置。尝试添加

echo $url, "<br>";
flush();

到CCD_ 3的顶部。如果你收到任何链接,这就是你的问题。这个可以通过调用类似set_time_limit(0)的函数来修复。

另一种可能是连接错误。这可能是由于巧合或服务器配置限制造成的。我不能确定,但我知道一些主机提供商限制file_get_contentscurl请求。您的脚本可能每次执行仅限于一个外部请求。

除此之外,我想不出你的剧本会出什么问题。您可以删除递归并在while循环中运行函数。但是,除非你期望有很多页面,否则没有必要进行这样的修改。

最后,用于DOM解析的库将返回DOM元素对象或null。因此,您可以将if(is_object($tmp)){更改为if($tmp){。由于您是通过引用传递结果,因此返回值是毫无意义的。您可以安全地删除else语句。

祝你好运。