限制SimpleHtmlDOM

时间:2016-02-01 09:04:42

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

我想抓取新闻网站的链接,但我想限制我实际抓取的链接数量(例如前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 />";
}

?>

2 个答案:

答案 0 :(得分: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 />";
}

答案 1 :(得分:1)

我发现 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();
}

这个包中有更多的东西。