我正在尝试创建一个小型URL抓取工具,供我工作的公司内部使用。
目前,我有一个辅助类,其中发生了所有魔法,还有一个显示结果的index.php。
我想要发生的是提供一个URL以及要离开的代码并获取该网站包含的所有页面URL以便在屏幕上显示。
然而,等到这个foreach循环结束需要一个年龄,因此,我想在循环的每次迭代之后回显链接。
我无法让它发挥作用。我不知道它是链接获取代码,还是我尝试刷新输出缓冲区。我在这里按照这个问题的例子:Echo 'string' while every long loop iteration (flush() not working)
我的代码如下(没有刷新尝试)
// INDEX.PHP
require_once('helper.php');
$helper = new Helper();
flush();
ob_flush();
$found = $helper->crawlSite('http://www.bbc.co.uk', 'http://www.bbc.uk');
echo count($found);
// HELPER.PHP
class Helper
{
private $checked = [];
private $foundUrls = [];
public function __construct()
{
}
public function getHTML($url)
{
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
$html = curl_exec($curl);
curl_close($curl);
return $html;
}
public function getTagFromHTML($html, $tag)
{
$dom = new DOMDocument();
$dom->loadHTML($html);
return $dom->getElementsByTagName($tag);
}
function crawlSite($url, $initialUrl)
{
$html = $this->getHTML($url);
$links = $this->getTagFromHTML($html, 'a');
foreach ($links as $link) {
echo $link->getAttribute('href') . '<br>';
flush();
ob_flush();
if (!in_array($link->getAttribute('href'), $this->checked)) {
if (strpos($link->getAttribute('href'), $initialUrl) !== FALSE) {
$this->foundUrls[] = $link->getAttribute('href');
$this->crawlSite($link->getAttribute('href'), $initialUrl);
} else {
$this->foundUrls[] = $initialUrl . $link->getAttribute('href');
$this->crawlSite($initialUrl . $link->getAttribute('href'), $initialUrl);
}
$this->checked[] = $link->getAttribute('href');
}else{
echo "Already Checked <br>";
flush();
ob_flush();
}
}
return $this->foundUrls;
}
}
将代码更新到更大的网站以演示此问题。还包括我尝试刷新输出缓冲区之一,我还实现了@Dev Jyoti Behera关于移动回声的建议。
感谢这个建议(如上所述),我现在可以看到屏幕上正在打印实时文字。我现在有第二个问题,其中爬虫似乎忽略已检查 if语句,它将检查并反复列出相同的URL。 /叹气 - 说实话,我喜欢编程。