PHP指针 - 没有收到数据

时间:2013-12-02 18:42:44

标签: php pointers

我正在从网站挖掘数据,但它有分页器,但我需要获取所有页面。 链接到下一页的是链接标记,其中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中会显示“未收到数据”消息。我对错误或其他什么都不了解。该函数应该有效,因为当我不再使用它时,它会自动返回一个链接 - 到第二页。

我认为问题在于语法错误或指针使用错误。

你能帮我吗?

2 个答案:

答案 0 :(得分:1)

我不知道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);

答案 1 :(得分:0)

首先,这可能会更容易。没有错误消息,这可能是从DNS错误到文件中损坏的空格字符的任何内容。因此,如果还没有,请尝试将其添加到脚本的顶部:

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

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

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

一种可能性是超时。这取决于服务器配置。尝试添加

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

getAll的顶部。如果您收到任何链接,这是您的问题。 可以通过调用set_time_limit(0)等函数来修复

另一种可能性是连接错误。这可能是由巧合或服务器配置限制引起的。我无法确定,但我知道某些托管服务提供商限制file_get_contentscurl请求。您的脚本有可能每次执行一次外部请求。

除此之外,我无法想到你的脚本真的会出错。您可以删除递归并在while循环中运行该函数。但除非你期望很多页面,否则不需要进行这样的修改。

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

祝你好运。