在Laravel项目的哪里放置Crawler脚本?

时间:2018-11-20 18:50:21

标签: php laravel web-crawler

我创建了一个非常简单的PHP搜寻器,希望在Laravel项目中实现。我不知道在哪里放置它。我想启动脚本并仅在应用程序启动时运行它。

我知道它不应该出现在Controllers或Cron计划中,因此有何建议在哪里进行设置?

$homepage = 'https://example.com';
$already_crawled = [];
$crawling = [];


function follow_links($url){
  global $already_crawled;
  global $crawling;

  $doc = new DOMDocument();
  $doc->loadHTML(file_get_contents($url));

  $linklist = $doc->getElementsByTagName('a');

  foreach ($linklist as $link) {
    $l = $link->getAttribute("href");
    $full_link = 'https://example.com'.$l;

    if (!in_array($full_link, $already_crawled)) {
      $already_crawled[] = $full_link;
      $crawling[] = $full_link;
      echo $full_link.PHP_EOL;
      // Insert data in the DB
    }
  }

  array_shift($crawling);
  foreach ($crawling as $link) {
    follow_links($link);
  }
}

follow_links($homepage);

1 个答案:

答案 0 :(得分:3)

我建议结合使用Service类,Command和可能的Jobs,然后从worker processes运行它们。

您的服务将是一个类,其中包含用于爬网页面的所有逻辑。然后,抓取程序服务将由工匠命令,排队的作业或两者的结合使用。

您是对的,您不想直接从内置的Laravel调度程序中运行爬虫 (因为它可能运行很长时间,并且会阻止其他调度的任务运行)。但是,一种选择是使用Laravel时间表来运行一项任务,该任务检查需要重新爬网的url,并将排队的 jobs 分配给您的 worker进程,在Laravel中非常容易实现。

每个新发现的url都可以看作是一个单独的任务,可以单独排队以进行爬网,而不是在应用程序处于联机状态时“连续”运行该进程。