2016-05-18 2 views
0

Ich versuche ein Skript zu erstellen, das alle Links auf einer Website crawl Es gibt nur ein kleines Problem: Ich habe es auf verschiedenen Seiten getestet, aber das Ergebnis ist nicht das Gleiche und einige Links wurden nicht gekrochen ich weiß nicht, warum und so frage ich diese FrageZu viele foreach oder Verbindungszeitüberschreitung? T

hier ist der Code:

$list = array(); 
$count = 0; 
function crawl_page($url) { 
    global $list, $count; 
    if(isset($list[$url])) { 
     if($list[$url] == true) { 
      return; 
     } 
    } 
    $list[$url] = true; 
    $dom = new DOMDocument('1.0'); 
    @$dom->loadHTMLFile($url); 
    // I wrote this for not following other websites, it's so rude but it works 
    if(!strpos($url, "example.com")) { 
     return; 
    } 
    $anchors = $dom->getElementsByTagName('a'); 

    foreach($anchors as $element) { 
     $href = $element->getAttribute('href'); 
     if(0 !== strpos($href, 'http')) { 
      $path = '/' . ltrim($href, '/'); 
      if(extension_loaded('http')) { 
       $href = http_build_url($url, array('path' => $path)); 
      } else { 
       $parts = parse_url($url); 
       $href = $parts['scheme'] . '://'; 

       if (isset($parts['user']) && isset($parts['pass'])) { 
        $href .= $parts['user'] . ':' . $parts['pass'] . '@'; 
       } 
       $href .= $parts['host']; 
       if (isset($parts['port'])) { 
        $href .= ':' . $parts['port']; 
       } 
       $href .= $path; 
      } 
     } 
     if(!array_key_exists($href, $list)) { 
      $list[$href] = false; 
     } 
    } 
    $count++; 
    echo "$count $url<br>"; 

    foreach($list as $asd => $seen) { 
     crawl_page($asd); 
    } 
} 
crawl_page('http://www.example.com'); 

Antwort

0

Dieser Code wahrscheinlich gibt Ihnen eine Connection Timeout, weil es nie endet. Für jeden Link führen Sie die gleiche Funktion immer wieder aus.

Sie eine Bibliothek wie diese verwenden: http://phpcrawl.cuab.de/

Oder wenn Sie wirklich das Rad neu erfinden wollen, müssen Sie einen Job haben, die einige Link holen werden, die nicht bereits analysiert werden, alle Links von refered sparen diese Seite und speichern Sie Daten in der Datenbank. Ein anderer Job holt den nächsten Link und macht weiter.

Es ist bereits hier beantwortet: How does a web crawler work?

+0

Es ist nicht wahr, dass die Funktion nie endet, die Links, die bereits analysiert werden in der Array $ Liste –

+0

Abbildung Sprache gespeichert werden. Es hängt schließlich davon ab, wie viele Links die Seite hat. Wie auch immer, du hast Probleme damit, also sieh dir die Links an, die ich gepostet habe. –