0

我试图从我的博客中抓取 43 篇博客文章并将它们存储在数组中,但是当我 print_r 数组时它只返回前 5 个 [其余为空] 而不是全部 43 个。为什么?我怎样才能得到所有 43 个?我从 WAMP 上的 cmd.exe [命令行] 运行此脚本。

    <?php

require 'src/QueryPath/QueryPath.php';


$qp1 = htmlqp('http://myblog.com/blog');
$qp2 = htmlqp('http://myblog.com/blog/Page-2.html');
$qp3 = htmlqp('http://myblog.com/blog/Page-3.html');
$qp4 = htmlqp('http://myblog.com/blog/Page-4.html');

foreach ($qp1->find('ol>li a[href],.jbReadon') as $item) {
    $links[] = $item->attr('href');
}

foreach ($qp2->find('ol>li a[href],.jbReadon') as $item) {
    $links[] = $item->attr('href');
}

foreach ($qp3->find('ol>li a[href],.jbReadon') as $item) {
    $links[] = $item->attr('href');
}

foreach ($qp4->find('ol>li a[href],.jbReadon') as $item) {
    $links[] = $item->attr('href');
}


print_r($links);



foreach ($links as $link) {
    $url = "http://myblog.com".$link;

    $content[] = htmlqp($url)->find('.jbIntroText p')->text();
}
print_r($content);




?>

在数组的第 5 个键之后,所有值都是空的。[我无法从笔记本电脑或网络上传图像,因此这里是 cmd.exe 屏幕截图的链接] http://img546.imageshack.us/img546/6092/cmdafter5arrayisempty.jpg

我显然是一个初学者,所以任何建议如何使这段代码更简洁或如何更好地完成我的抓取原型将不胜感激。也欢迎所有建设性的批评:-P

4

2 回答 2

0

您可能希望将一些打印语句添加到这些 FOR 循环中的至少一个。这里可能会发生几件事。最有可能的两个是:

  • 过滤器可能只匹配五个项目。
  • HTML 解析器可能会因某些标记而窒息。在这种情况下,它将尝试加载尽可能多的 HTML DOM。

通过添加一些打印语句,您可能能够看到它迭代了多少次。

顺便说一句,如果您想获取博客上的文章列表,阅读 RSS 或 Atom 提要可能会更容易(尽管我想它可能没有您需要的所有信息)。

于 2013-02-25T17:05:16.513 回答
0

我已经解决了我的问题!!显然,我需要的只是每次查询/抓取之间的时间延迟,因为我的博客正在保护自己免受大量抓取或其他任何事情。我所要做的就是像这样重写代码的第二部分:

foreach ($links as $link) {
    $url = "http://myblog.com".$link;
    $count = count($links);
    $interval = 2; // Every three times...
    $wait = 2; // Wait two seconds.
        for ($i = 0; $i < $count; ++$i) {
        $content[] = htmlqp($url)->find('.jbIntroText p')->text();
        print_r($content);
            if ($i > 0 && $i % $interval == 0) {
            sleep($wait);
            }

        }
}

感谢 Technosophos 提供的想法 在目标 Web 服务器上使用 Php/Querypath 爬虫的已知或预期影响是什么,如何将其保持在最低限度?

还要感谢我应该将博客即时消息转换为 RSS/Atom 提要的想法,因为很多时候博客没有生成自己的 RSS 提要

于 2013-02-26T16:07:46.507 回答