我正在尝试创建一个网络抓取工具。我找到了一个非常有用的网站,但是有一个问题。 它只能在一个页面中找到链接,而我想在整个网站中找到所有链接,子链接,而不仅仅是一个页面。经过一段时间的研究,我在一些建议创建循环函数的网站上阅读,调用程序里面的程序。
在我这样做之后,又出现了另一个问题,重复链接太多而且php代码因为没有足够的内存分配而成为错误。我尝试了几种方法来摆脱重复的链接,但没有一个工作。我最好的镜头是使用这个数组,不保留数组中的链接,而数组中已经存在的链接将被忽略。但到目前为止,它仍然没有用。
任何人都可以帮助我吗?这是我的代码。
ini_set('memory_limit','1024M');
include_once('simple_html_dom.php');
$urlarray = array();
$a=0;
function crawl_page($target_url, $urlarray){
$html = new simple_html_dom();
$html->load_file($target_url);
foreach($html->find('a') as $link)
{
if (!in_array($link->href, $urlarray)) {
$arraysize = sizeof($urlarray);
echo $link->href."<br />";
$urlarray[$arraysize] = $link->href;
crawl_page($link->href, $urlarray);
}
}
}
$url[0]= "http://www.lazada.co.id";
crawl_page("http://www.lazada.co.id", $url);
结果如下:
(!)致命错误:第555行的C:\ wamp \ www \ testcrawler \ simple_html_dom.php超过120秒的最长执行时间
更新:
我已经解决了。我发现stackoverflow中的某个链接有同样的问题。有人建议不要使用递归模型,而是使用队列模型。所以我修改了我的代码到队列模型,它工作。现在,当我写这篇文章时,我的网络抓取工具运行良好。
答案 0 :(得分:0)
网络爬网不仅是从网页中提取数据。 但是正如您在问题中提到的,我想您只是想从网页中提取一些元素
因此,PHP具有phpQuery库来交互网页提取..它不是php中唯一的库,但它是最受欢迎的库
我希望能对您有所帮助
答案 1 :(得分:-1)
这是PHP Web Crawler的完整代码,并附有说明,让我们开始:
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
telemetryClient.TrackEvent(new Exception("Function started"));
}
希望有帮助。