限制 SimpleHtmlDOM 抓取的链接数量
Limit number of links scraped by SimpleHtmlDOM
我想从新闻网站抓取链接,但我想限制我实际抓取的链接数量(例如前 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 />";
}
?>
首先。你有语法错误
替换
$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 />";
}
我发现 simple_html_dom 非常好而且很有用。
您实际上可以使用 jQuery 类型选择器获取元素。
如果你能找到一个 class 到所有新的 post 你可以 运行 这样的东西
$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();
}
这个包裹里还有很多东西。
我想从新闻网站抓取链接,但我想限制我实际抓取的链接数量(例如前 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 />";
}
?>
首先。你有语法错误
替换
$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 />";
}
我发现 simple_html_dom 非常好而且很有用。 您实际上可以使用 jQuery 类型选择器获取元素。
如果你能找到一个 class 到所有新的 post 你可以 运行 这样的东西
$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();
}
这个包裹里还有很多东西。