【问题标题】:Limit number of links scraped by SimpleHtmlDOM限制 SimpleHtmlDOM 抓取的链接数
【发布时间】:2016-02-01 09:04:41
【问题描述】:

我想从新闻网站抓取链接,但我想限制我实际抓取的链接数量(例如前 10 篇最新文章,而不是首页上的所有链接)。

我看到你可以设置多少字节或爬虫处于活动状态的时间限制,而且还有一个“itemcount”可以在达到一定数量的项目时停止爬虫(found here) .然而,这适用于基于 Python 的 Scrapy。

我使用的是Simple HTML DOM,所以是 PHP。有人知道类似的吗?

或者,是否可以无限制地抓取链接并将其导入文件,然后从该文件中提取前 10 个链接?

如果有一个明显的答案,我很抱歉 - 我是一个绝对的业余爱好者,这是我的第一个小项目。

这是我正在使用的代码,不确定是否有帮助:

<?php
include_once('simple_html_dom.php');

$target_url = "https://www.example.com/";

$html = new simple_html_dom();

$html->load_file($target_url);
foreach($html->find('div[class=article]') as $post)
{
$post->find('div[class=title]',0)->outertext = ";
echo $post."<br />";
}

?>

【问题讨论】:

    标签: php web-crawler simple-html-dom


    【解决方案1】:

    首先。你有语法错误

    替换

    $post->find('div[class=title]',0)->outertext = ";
    

    $post->find('div[class=title]',0)->outertext = "";
    

    要限制它没有 n 项,如果满足限制,只需突破 foreach

    $limit = 10;
    foreach($html->find('div[class=article]') as $i => $post)
    {
      $post->find('div[class=title]',0)->outertext = "";
      echo $post."<br />";
      $i++;
    
      if($i++ >= $limit){
        break;
      }
    }
    

    就像@ElzoValugi 建议的那样,for 套房更好。

    $posts = $html->find('div[class=article]');
    $limit = 10;
    $limit = count($posts) < $limit ? count($posts) : $limit;
    for($i=0; $i < $limit; $i++){
      $post = $posts[$i];
      $post->find('div[class=title]',0)->outertext = "";
      echo $post."<br />";
    }
    

    【讨论】:

    • 在这种情况下,for 循环实际上比 foreach 更适合
    • 伙计们非常感谢你们。我真的(!)感谢您的帮助。
    • 其实foreach更好,但是break有点笨拙。 if($i++ &gt;= $limit) break; 怎么样
    • 同样不用初始化$i,只需使用键:foreach($elements as $i =&gt; $element)
    • @pguardiario 谢谢。
    【解决方案2】:

    我发现 simple_html_dom 非常好用。 您实际上可以使用 jQuery 类型选择器获取元素。

    如果你能找到所有新帖子的类,你可以运行这样的东西

    $links = $html->find('a.<class name>').
    

    或者您只想要前 10 个项目的 10 个。

    $links = $html->find('a:lt(10)'); // I have not tested it.
    // Or 
    $links = $html->find('a');
    $count = count($links);
    for($i = 10; $i < $count ; $i++){
        $links[$i]->remove();
    }
    

    这个包里还有很多东西。

    【讨论】:

    • 非常感谢您的帮助!我会尽快试试这个!
    • 虽然你可以在这个库中使用大多数 CSS 选择器,但我认为 lt() 类型选择器不会起作用,因为这是一个非标准的 jQuery 选择器跨度>
    猜你喜欢
    • 2011-06-25
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多