php数组中的函数

php数组中的函数,php,web-crawler,Php,Web Crawler,所以我有一个网络爬虫,我正在工作。我有一个CSV文件,其中有大约一百万个网站,我想通过它进行爬网。我的问题是,我能够将CSV文件保存在数组中,但当我将其传递给爬网它的方法时;它似乎获取了第一个元素并对其进行爬网,而不是对整个数组进行爬网。有人能帮我吗 <?php include("classes/DomDocumentParser.php"); include("config.php"); $alreadyCrawled = array(); $

所以我有一个网络爬虫,我正在工作。我有一个CSV文件,其中有大约一百万个网站,我想通过它进行爬网。我的问题是,我能够将CSV文件保存在数组中,但当我将其传递给爬网它的方法时;它似乎获取了第一个元素并对其进行爬网,而不是对整个数组进行爬网。有人能帮我吗

<?php


    include("classes/DomDocumentParser.php");
    include("config.php");



    $alreadyCrawled =  array();
    $crawling =  array();
    $alreadyFoundImages = array();
    $my_list = array();



    function linkExists($url){
            global $con;

            $query = $con->prepare("SELECT * FROM sites WHERE url = :url");

            $query ->bindParam(":url",$url);
            $query->execute();

            return $query->rowCount() != 0;
    }

    function insertImage($url,$src,$title,$alt){
            global $con;

            $query = $con->prepare("INSERT INTO images(siteUrl, imageUrl, alt, title)
                                            VALUES(:siteUrl,:imageUrl,:alt,:title)");

            $query ->bindParam(":siteUrl",$url);
            $query ->bindParam(":imageUrl",$src);
            $query ->bindParam(":alt",$alt);
            $query ->bindParam(":title",$title);

            return $query->execute();
    }

    function insertLink($url,$title,$description,$keywords){
            global $con;

            $query = $con->prepare("INSERT INTO sites(Url, title, description, keywords)
                                            VALUES(:url,:title,:description,:keywords)");

            $query ->bindParam(":url",$url);
            $query ->bindParam(":title",$title);
            $query ->bindParam(":description",$description);
            $query ->bindParam(":keywords",$keywords);

            return $query->execute();
    }

    function createLink($src,$url){

            $scheme = parse_url($url)["scheme"]; // http or https
            $host = parse_url($url)["host"]; // www.mohamad-ahmad.com

            if(substr($src,0,2) =="//"){
                    //  //www.mohanadahmad.com
                    $src  = $scheme . ":" . $src;
            }
            else  if(substr($src,0,1) =="/"){
                    //  /aboutus/about.php
                    $src  = $scheme . "://" . $host . $src;
            }
            else if(substr($src,0,2) =="./"){
                    //  ./aboutus/about.php
                    $src  = $scheme . "://" . $host . dirname(parse_url($url)["path"]) . substr($src ,1);
            }
            else if(substr($src,0,3) =="../"){
                    //  ../aboutus/about.php
                    $src  = $scheme . "://" . $host . "/" . $src;
            }
            else if(substr($src,0,5) !="https" && substr($src,0,4) !="http" ){
                    //  aboutus/about.php
                    $src  = $scheme . "://" . $host ."/" .$src;
            }
            return $src;
    }

    function getDetails($url){

            global $alreadyFoundImages;

            $parser = new DomDocumentParser($url);

            $titleArray = $parser->getTitletags();

            if(sizeof($titleArray) == 0 || $titleArray->item(0) == NULL){
                    return;
            }

            $title = $titleArray -> item(0) -> nodeValue;
            $title = str_replace("\n","",$title);

            if($title == ""){
                    return;
            }


            $description="";
            $keywords="";

            $metasArray = $parser -> getMetatags();

            foreach($metasArray as $meta){

                    if($meta->getAttribute("name") == "description"){
                            $description = $meta -> getAttribute("content");
                    }
                    if($meta->getAttribute("name") == "keywords"){
                            $keywords = $meta -> getAttribute("content");
                    }

            }

            $description = str_replace("\n","",$description);
            $keywords = str_replace("\n","",$keywords);    

            if(linkExists($url)){
                    echo "$url already exists <br>";
            }
            else if(insertLink($url,$title,$description,$keywords)){
                    echo "SUCCESS: $url <br>";
            }
            else{
                    echo "ERROR: Failed to insert $url <br>";
            }

            $imageArray = $parser ->getImages();
            foreach($imageArray as $image){

                    $src = $image->getAttribute("src");
                    $alt = $image->getAttribute("alt");
                    $title = $image->getAttribute("title");

                    if(!$title && !$alt){
                            continue;
                    }

                    $src = createLink($src,$url);

                    if(!in_array($src,$alreadyFoundImages)){
                            $alreadyFoundImages[] = $src;

                            insertImage($url,$src,$alt,$title);
                    }
            }
    }

    function followLinks($url) {

        global $crawling;
        global $alreadyCrawled;

        $parser = new DomDocumentParser($url);

        $linkList = $parser->getLinks();
        foreach($linkList as $link){

                $href = $link->getAttribute("href");

                if(strpos($href,"#") !==false){
                        // Ignore anchor url
                        continue;
                }
                else if(substr($href,0,11)== "javascript:"){
                        // Ignore javascript url 
                        continue;
                }

                $href = createLink($href,$url);

                if(!in_array($href,$alreadyCrawled)){
                        $alreadyCrawled[] = $href;
                        $crawling[] = $href;

                        //getDetails contain the insert into db
                        getDetails($href);
                }         
        }
        array_shift($crawling);

        foreach($crawling as $site){
                followLinks($site);
        }
}

        function fill_my_list(){

            global $my_list;    

            $file = fopen('top-1m.csv', 'r');
            while( ($data = fgetcsv($file)) !== false ) {
            $startUrl = "https://www.".$data[1];
            $my_list[] = $startUrl;
             }
             foreach($my_list as $key => $u){
             followLinks($u);
             }
        }
        fill_my_list();    
?>

您可以通过php.net执行类似的操作

$row = 1;
if (($File = fopen("test.csv", "r")) !== FALSE) {
  while (($data = fgetcsv($File, 1000, ",")) !== FALSE) {
    $num = count($data);
    echo "<p> $num fields in line $row: <br /></p>\n";
    $row++;
    for ($c=0; $c < $num; $c++) {
        echo $data[$c] . "<br />\n";
    }
//Use $data[$c];
  }
  fclose($File);
}
$row=1;
if($File=fopen(“test.csv”,“r”)!==FALSE){
while(($data=fgetcsv($File,1000,“,”)!==FALSE){
$num=计数($data);
echo“$num字段位于第$row行:

\n”; $row++; 对于($c=0;$c<$num;$c++){ echo$data[$c]。“
\n”; } //使用$data[$c]; } fclose($文件); }

这里有更多的例子:

这里并不清楚您需要什么帮助。你能试着让你的问题更明确一些吗?首先:如果你有一个CSV文件,那么将整个列表加载到内存中的目的是什么?另外,我强烈建议不要递归调用followLinks。根据页面的不同,这将产生一个非常大的调用堆栈-很可能,您的初始循环永远不会到达
$my_list
中的第二个条目。您好,Damocles,我承认在数组中保存没有任何意义,但我有点困惑它为什么不起作用,所以我尝试了所有方法。但我可以问一下,为什么它永远不会进入第二个条目,因为这就是问题所在。如何解决呢?谢谢你,你是如何推断这个样板样本可能被证明是一个问题的解决方案,而这个问题到目前为止还没有被确定…(或者它可能是递归问题的重点)?这充其量只是一个评论,IMHO。我看得很清楚,OP不要求递归,我可以看出OP不是一个新的程序员,如果需要递归,他会问。无论如何,如果也递归地请求,OP只需要
打印($data)
在给定的示例中,他可能需要更少的递归:-)