在Laravel项目中放置Crawler脚本的位置?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Laravel项目中放置Crawler脚本的位置?相关的知识,希望对你有一定的参考价值。

我创建了一个非常简单的php爬虫,我想在Laravel项目中实现它。我不知道该把它放在哪里..我想启动脚本并在应用程序启动时运行它。

我知道它不应该在控制器或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);
答案

我会推荐一个Service类,Command和可能的Jobs的组合 - 然后从worker processes运行它们。

您的服务将是一个包含爬网页面所有逻辑的类。然后,爬虫服务由工匠命令,排队作业或两者的组合使用。

您是对的,您不希望直接从内置的Laravel调度程序运行爬网程序(因为它可能会运行很长时间并阻止其他计划任务运行)。但是,一种选择是使用Laravel计划运行任务,该任务检查需要重新爬网的URL并将排队的作业分派给您的工作进程,这在Laravel中非常容易实现。

每个新发现的URL都可以被视为一个单独的任务,并单独排队进行爬网,而不是在应用程序联机时“连续”运行该过程。

以上是关于在Laravel项目中放置Crawler脚本的位置?的主要内容,如果未能解决你的问题,请参考以下文章

在 IOS 项目中放置 .txt 文件并从中读取的位置

在 NodeJS 项目中放置 Google Maps API 密钥的位置

是否可以在 Form::submit(' ') 中放置一个引导字形图标 - Laravel

在 C# .cs 文件中放置 using 语句的位置[重复]

我如何在laravel中放置条件?

在 Laravel->Blade 中放置一些变量的最佳方法