Heim  >  Artikel  >  Backend-Entwicklung  >  So crawlen und analysieren Sie Webseiten mit PHP

So crawlen und analysieren Sie Webseiten mit PHP

不言
不言Original
2018-06-07 15:45:522455Durchsuche

Dieser Artikel stellt hauptsächlich die Methode des PHP-Crawlings und der Analyse von Webseiten vor. Er analysiert die Prinzipien und Analysetechniken des PHP-Webseiten-Crawlings im Detail in Form von Beispielen.

Die In diesem Artikel werden Beispiele erläutert. Erfahren Sie, wie Sie Webseiten mit PHP crawlen und analysieren. Die Details sind wie folgt:

Das Crawlen und Analysieren einer Datei ist sehr einfach. Dieses Tutorial führt Sie Schritt für Schritt durch ein Beispiel zur Implementierung. Fangen wir an!

Zunächst müssen wir entscheiden, welche URL-Adressen wir crawlen. Dies kann in einem Skript festgelegt oder über $QUERY_STRING übergeben werden. Der Einfachheit halber setzen wir die Variable direkt im Skript.

<?php
$url = &#39;http://www.php.net&#39;;
?>

Im zweiten Schritt greifen wir auf die angegebene Datei und speichern sie über die Funktion file() in einem Array.

<?php
$url = &#39;http://www.php.net&#39;;
$lines_array = file($url);
?>

Okay, jetzt haben wir die Datei im Array. Der Text, den wir analysieren möchten, befindet sich jedoch möglicherweise nicht vollständig in einer Zeile. Um diese Datei aufzulösen, können wir einfach das Array $lines_array in einen String konvertieren. Um dies zu erreichen, können wir die Funktion implode(x,y) verwenden. Wenn Sie „explodieren“ später verwenden möchten (Array von Zeichenfolgenvariablen), ist es möglicherweise besser, x auf „|“ oder „!“ oder ein anderes ähnliches Trennzeichen zu setzen. Für unsere Zwecke ist es jedoch am besten, x auf ein Leerzeichen zu setzen. y ist ein weiterer notwendiger Parameter, da es sich um das Array handelt, das Sie mit implode() verarbeiten möchten.

<?php
$url = &#39;http://www.php.net&#39;;
$lines_array = file($url);
$lines_string = implode(&#39;&#39;, $lines_array);
?>

Nachdem die Crawling-Arbeit abgeschlossen ist, ist es Zeit für die Analyse. Für dieses Beispiel möchten wir alles zwischen 93f0f5c25f18dab9d176bd4f6de5d30e und 9c3bca370b5104690d9ef395f2c5f8d1 abrufen. Um die Zeichenfolge zu analysieren, benötigen wir außerdem einen sogenannten regulären Ausdruck.

<?php
$url = &#39;http://www.php.net&#39;;
$lines_array = file($url);
$lines_string = implode(&#39;&#39;, $lines_array);
eregi("<head>(.*)</head>", $lines_string, $head);
?>

Werfen wir einen Blick auf den Code. Wie Sie sehen können, wird die Funktion eregi() im folgenden Format ausgeführt:

eregi("<head>(.*)</head>", $lines_string, $head);

„(.*)“ bedeutet alles und kann wie folgt interpretiert werden: „Analyse Alles zwischen 93f0f5c25f18dab9d176bd4f6de5d30e und 9c3bca370b5104690d9ef395f2c5f8d1“. $lines_string ist die Zeichenfolge, die wir analysieren, und $head ist das Array, in dem die analysierten Ergebnisse gespeichert werden.

Endlich können wir die Daten eingeben. Da zwischen 93f0f5c25f18dab9d176bd4f6de5d30e und 9c3bca370b5104690d9ef395f2c5f8d1 nur eine Instanz vorhanden ist, können wir mit Sicherheit davon ausgehen, dass es nur ein Element im Array gibt, und zwar das gewünschte. Lass es uns ausdrucken.

Das ist der ganze Code.

<?php
//获取所有内容url保存到文件
function get_index ( $save_file , $prefix = "index_" ){
   $count = 68 ;
   $i = 1 ;
  if ( file_exists ( $save_file )) @ unlink ( $save_file );
   $fp = fopen ( $save_file , "a+" ) or die( "Open " . $save_file . " failed" );
  while( $i < $count ){
     $url = $prefix . $i . ".htm" ;
    echo "Get " . $url . "..." ;
     $url_str = get_content_url ( get_url ( $url ));
    echo " OK/n" ;
     fwrite ( $fp , $url_str );
    ++ $i ;
  }
   fclose ( $fp );
}
//获取目标多媒体对象
function get_object ( $url_file , $save_file , $split = "|--:**:--|" ){
  if (! file_exists ( $url_file )) die( $url_file . " not exist" );
   $file_arr = file ( $url_file );
  if (! is_array ( $file_arr ) || empty( $file_arr )) die( $url_file . " not content" );
   $url_arr = array_unique ( $file_arr );
  if ( file_exists ( $save_file )) @ unlink ( $save_file );
   $fp = fopen ( $save_file , "a+" ) or die( "Open save file " . $save_file . " failed" );
  foreach( $url_arr as $url ){
    if (empty( $url )) continue;
    echo "Get " . $url . "..." ;
     $html_str = get_url ( $url );
    echo $html_str ;
    echo $url ;
    exit;
     $obj_str = get_content_object ( $html_str );
    echo " OK/n" ;
     fwrite ( $fp , $obj_str );
  }
   fclose ( $fp );
}
//遍历目录获取文件内容
function get_dir ( $save_file , $dir ){
   $dp = opendir ( $dir );
  if ( file_exists ( $save_file )) @ unlink ( $save_file );
   $fp = fopen ( $save_file , "a+" ) or die( "Open save file " . $save_file . " failed" );
  while(( $file = readdir ( $dp )) != false ){
    if ( $file != "." && $file != ".." ){
      echo "Read file " . $file . "..." ;
       $file_content = file_get_contents ( $dir . $file );
       $obj_str = get_content_object ( $file_content );
      echo " OK/n" ;
       fwrite ( $fp , $obj_str );
    }
  }
   fclose ( $fp );
}
//获取指定url内容
function get_url ( $url ){
   $reg = &#39;/^http:////[^//].+$/&#39; ;
  if (! preg_match ( $reg , $url )) die( $url . " invalid" );
   $fp = fopen ( $url , "r" ) or die( "Open url: " . $url . " failed." );
  while( $fc = fread ( $fp , 8192 )){
     $content .= $fc ;
  }
   fclose ( $fp );
  if (empty( $content )){
    die( "Get url: " . $url . " content failed." );
  }
  return $content ;
}
//使用socket获取指定网页
function get_content_by_socket ( $url , $host ){
   $fp = fsockopen ( $host , 80 ) or die( "Open " . $url . " failed" );
   $header = "GET /" . $url . " HTTP/1.1/r/n" ;
   $header .= "Accept: */*/r/n" ;
   $header .= "Accept-Language: zh-cn/r/n" ;
   $header .= "Accept-Encoding: gzip, deflate/r/n" ;
   $header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; InfoPath.1; .NET CLR 2.0.50727)/r/n" ;
   $header .= "Host: " . $host . "/r/n" ;
   $header .= "Connection: Keep-Alive/r/n" ;
   //$header .= "Cookie: cnzz02=2; rtime=1; ltime=1148456424859; cnzz_eid=56601755-/r/n/r/n";
   $header .= "Connection: Close/r/n/r/n" ;
   fwrite ( $fp , $header );
   while (! feof ( $fp )) {
     $contents .= fgets ( $fp , 8192 );
   }
   fclose ( $fp );
   return $contents ;
}
//获取指定内容里的url
function get_content_url ( $host_url , $file_contents ){
   //$reg = &#39;/^(#|<a href="http://lib.csdn.net/base/18" class=&#39;replace_word&#39; title="JavaScript知识库" target=&#39;_blank&#39; style=&#39;color:#df3434; font-weight:bold;&#39;>JavaScript</a>.*?|ftp:////.+|http:////.+|.*?href.*?|play.*?|index.*?|.*?asp)+$/i&#39;;
   //$reg = &#39;/^(down.*?/.html|/d+_/d+/.htm.*?)$/i&#39;;
   $rex = "/([hH][rR][eE][Ff])/s*=/s*[&#39;/"]*([^>&#39;/"/s]+)[/"&#39;>]*/s*/i" ;
   $reg = &#39;/^(down.*?/.html)$/i&#39; ;
   preg_match_all ( $rex , $file_contents , $r );
   $result = "" ; //array();
   foreach( $r as $c ){
    if ( is_array ( $c )){
      foreach( $c as $d ){
        if ( preg_match ( $reg , $d )){ $result .= $host_url . $d . "/n" ; }
      }
    }
  }
  return $result ;
}
//获取指定内容中的多媒体文件
function get_content_object ( $str , $split = "|--:**:--|" ){
   $regx = "/href/s*=/s*[&#39;/"]*([^>&#39;/"/s]+)[/"&#39;>]*/s*(.*?<//b>)/i" ;
   preg_match_all ( $regx , $str , $result );
  if ( count ( $result ) == 3 ){
     $result [ 2 ] = str_replace ( "多媒体: " , "" , $result [ 2 ]);
     $result [ 2 ] = str_replace ( " " , "" , $result [ 2 ]);
     $result = $result [ 1 ][ 0 ] . $split . $result [ 2 ][ 0 ] . "/n" ;
  }
  return $result ;
}
?>

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Bitte achten Sie auf die chinesische PHP-Website!

Verwandte Empfehlungen:

thinkphp implementiert die Paging-Anzeigefunktion

Das obige ist der detaillierte Inhalt vonSo crawlen und analysieren Sie Webseiten mit PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn