如何在php中创建有效的Web爬虫

时间:2016-03-30 17:51:31

标签: php web-crawler

我正在尝试创建一个网络抓取工具。我找到了一个非常有用的网站,但是有一个问题。 它只能在一个页面中找到链接,而我想在整个网站中找到所有链接,子链接,而不仅仅是一个页面。经过一段时间的研究,我在一些建议创建循环函数的网站上阅读,调用程序里面的程序。

在我这样做之后,又出现了另一个问题,重复链接太多而且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中的某个链接有同样的问题。有人建议不要使用递归模型,而是使用队列模型。所以我修改了我的代码到队列模型,它工作。现在,当我写这篇文章时,我的网络抓取工具运行良好。

2 个答案:

答案 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"));
}

希望有帮助。