【问题标题】:How do I parse a robots.txt file with PHP?如何使用 PHP 解析 robots.txt 文件?
【发布时间】:2017-08-13 22:28:04
【问题描述】:

我正在尝试解析网站 robots.txt 文件(其中 facebook 将是一个随机 url)。

我想删除任何不用于用户代理的行(例如本例中的前两行)。所以也许摆脱任何不以 A、D 或 U 开头的行?

我还想让每个用户代理都有自己的关联数组,标题是用户代理,即允许所有谷歌机器人允许和禁止 url 我将在 $arr[googleBot] 上打印_r。

这是我目前的代码!

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

【问题讨论】:

  • 那你被什么困住了?

标签: php regex web-scraping web-crawler robots.txt


【解决方案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。将机器人添加到所有机器人。从空白机器人重新开始

【讨论】:

  • 您自己运行了该代码吗?当我尝试时,我遇到了很多我无法修复的错误。
  • @JamesMessingham 对不起,我复制了错误的版本。更新了我的答案,至少应该编译。
  • @JamesMessingham 啊,我发现了您可能遇到的问题。我使用的是"split,它已经被弃用了一段时间。改成explode再试一次。这应该完美无缺。
  • @JamesMessingham 注意我使用“Google”而不是“Facebook”,因为当我使用 MAMP 在本地主机上运行它时,facebook 告诉我需要更新浏览器或其他东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 2010-12-17
  • 2015-10-13
  • 2019-10-02
  • 2012-02-26
相关资源
最近更新 更多