我正在从网站挖掘数据,但它有分页器,但我需要获取所有页面。 链接到下一页的是链接标记,其中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中会显示“未收到数据”消息。我对错误或其他什么都不了解。该函数应该有效,因为当我不再使用它时,它会自动返回一个链接 - 到第二页。
我认为问题在于语法错误或指针使用错误。
你能帮我吗?
答案 0 :(得分:1)
我不知道file_get_html
或find
应该做什么,但这应该有效:
<?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_contents
和curl
请求。您的脚本有可能每次执行一次外部请求。
除此之外,我无法想到你的脚本真的会出错。您可以删除递归并在while循环中运行该函数。但除非你期望很多页面,否则不需要进行这样的修改。
最后,您用于DOM解析的库将返回DOM元素对象或null
。因此,您可以将if(is_object($tmp)){
更改为if($tmp){
。因为您通过引用传递结果,所以返回值是没有意义的。您可以安全地删除else语句。
祝你好运。