如何使用PHP解析robots.txt文件?

问题描述:

我想解析一个网站的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

尝试用你的代码包含这样的:

<?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