我正在尝试使用 PHP 创建一个简单的网络爬虫,它能够爬行 .edu 域,并提供父级的种子 url。
我使用了简单的html dom来实现爬虫,而一些核心逻辑是我自己实现的。
我将发布下面的代码并尝试解释这些问题。
private function initiateChildCrawler($parent_Url_Html) {
global $CFG;
static $foundLink;
static $parentID;
static $urlToCrawl_InstanceOfChildren;
$forEachCount = 0;
foreach($parent_Url_Html->getHTML()->find('a') as $foundLink)
{
$forEachCount++;
if($forEachCount<500) {
$foundLink->href = url_to_absolute($parent_Url_Html->getURL(), $foundLink->href);
if($this->validateEduDomain($foundLink->href))
{
//Implement else condition later on
$parentID = $this->loadSaveInstance->parentExists_In_URL_DB_CRAWL($this->returnParentDomain($foundLink->href));
if($parentID != FALSE)
{
if($this->loadSaveInstance->checkUrlDuplication_In_URL_DB_CRAWL($foundLink->href) == FALSE)
{
$urlToCrawl_InstanceOfChildren = new urlToCrawl($foundLink->href);
if($urlToCrawl_InstanceOfChildren->getSimpleDomSource($CFG->finalContext)!= FALSE)
{
$this->loadSaveInstance->url_db_html($urlToCrawl_InstanceOfChildren->getURL(), $urlToCrawl_InstanceOfChildren->getHTML());
$this->loadSaveInstance->saveCrawled_To_URL_DB_CRAWL(NULL, $foundLink->href, "crawled", $parentID);
/*if($recursiveCount<1)
{
$this->initiateChildCrawler($urlToCrawl_InstanceOfChildren);
}*/
}
}
}
}
}
}
}
现在您可以看到,initiateChildCrawler 正在被initiateParentCrawler 函数调用,该函数将父链接传递给子爬虫。父链接示例:www.berkeley.edu,爬虫将找到其主页上的所有链接并返回其所有 html 内容。这种情况会一直发生,直到种子网址耗尽为止。
例如:
1-harvard.edu ->>>>> 将找到所有链接并返回其 html 内容(通过调用 childCrawler)。
移动到parentCrawler 中的下一个父级。
2-berkeley.edu ->>>>> 将找到所有链接并返回其 html 内容(通过调用 childCrawler)。
其他功能是不言自明的。
现在问题是:
childCrawler完成每个链接的foreach循环后,函数无法正常退出。如果我从 CLI 运行脚本,CLI 就会崩溃。在浏览器中运行脚本时会导致脚本终止。
但是,如果我将爬行子链接的限制设置为 10 或更少(通过更改 $forEachCount 变量),爬行器就会开始正常工作。
请在这方面帮助我。
来自 CLI 的消息:
问题签名:
问题事件名称:APPPCRASH
应用程序名称: php-cgi.exe
应用程序版本:5.3.8.0
应用程序时间戳:4e537939
故障模块名称:php5ts.dll
故障模块版本:5.3.8.0
故障模块时间戳:4e537a04
异常代码:c0000005
异常偏移:0000c793
操作系统版本:6.1.7601.2.1.0.256.48
区域设置 ID:1033
附加信息 1:0a9e
附加信息 2:0a9e372d3b4ad19135b953a78882e789
附加信息 3:0a9e
附加信息 4:0a9e372d3b4ad19135b953a78882e789