2017-08-13 75 views
1

我想解析一個網站的robots.txt文件(其中Facebook是一個隨機的網址)。如何使用PHP解析robots.txt文件?

我想擺脫任何不適合用戶代理的行(如本例中的前兩個)。所以也許擺脫任何不以A,D或U開頭的行?

我也想讓每個用戶代理自己的關聯數組的標題是用戶代理即得到所有的谷歌機器人允許和不允許的網址我將print_r $ arr [googleBot]。

這是我的代碼到目前爲止!

<?php 

//URl to start crawling 
$start = "https://www.facebook.com"; 

//Url to crawl, crawled or not crawl 
$crawling = array(); 
$crawled = array(); 
$disallow = array(); 

function getRobots($url) 
{ 
    $robotsUrl = $url . "/robots.txt"; 
    ini_set("user_agent","Agent (https://www.useragent.com)"); 
    $robots = @file_get_contents($robotsUrl); 
    $robots = explode("\n", $robots); 

    $robots = preg_grep('/[^\s]/', $robots); 

    print_r($robots); 

} 

$result = getRobots($start); 
+0

那你被卡在了什麼地方? – sal

回答

1

嘗試用你的代碼包含這樣的:

<?php 
function getRobots($url) 
    { 
     $robotsUrl = $url . "/robots.txt"; 
      $robot = null; 
      //create an object 
      $allRobots = []; 
      $fh = fopen($robotsUrl,'r'); 
      while (($line = fgets($fh)) != false) { 
      echo $line . "<br>"; 
      if (preg_match("/user-agent.*/i", $line)){ 
       if($robot != null){ 
        array_push($allRobots, $robot); 
       } 

       $robot = new stdClass(); 
       $robot->userAgent = []; 
       $robot->userAgent = explode(':', $line, 2)[1]; 
       $robot->disAllow = []; 
       $robot->allow = []; 


       } 
      if (preg_match("/disallow.*/i", $line)){ 
       array_push($robot->disAllow, explode(':', $line, 2)[1]); 
      } 
      else if (preg_match("/^allow.*/i", $line)){ 
       array_push($robot->allow, explode(':', $line, 2)[1]); 
      } 


      } 

      var_dump($line); 

      if($robot != null){ 
      array_push($allRobots, $robot); 
      } 


      //Lazy way of outputting. Loop through for prettier output. 
      var_dump($allRobots); 
    } 

getRobots("https://www.google.com"); 

?> 

從本質上講,您可以通過線通過線需要循環。

  • 如果找到User-Agent,則創建一個新的機器人實例。
  • 如果disallow發現添加不允許串機器人實例
  • 如果allow發現添加允許串機器人實例
  • 如果發現User-Agent。將機器人添加到所有機器人。用空白機器人重新開始
+0

您是否自己運行該代碼?當我嘗試時,我得到了很多我無法修復的錯誤。 –

+0

@JamesMessingham對不起,我複製了錯誤的版本。更新我的答案,至少應該編譯。 – shockawave123

+0

@JamesMessingham啊,我發現你可能遇到的問題。我使用''split'已被棄用一段時間。更改爲'爆炸'再試一次,這應該工作完美。 – shockawave123