【问题标题】:Where to put a Crawler script in Laravel project?在 Laravel 项目中将 Crawler 脚本放在哪里?
【发布时间】:2018-11-20 18:50:20
【问题描述】:

我创建了一个非常简单的 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);

【问题讨论】:

  • 其实这不是个好主意。 Bcoz laravel 专为构建出色的 MVC 应用程序而设计。如果你想注入/连接一些PHP Scripts,比如crawler或spider或bulk mailerEtc...,请分开这些文件并调用另一个thread或CRON JOB。不要将这些作业与 App 合并。
  • 所以它不应该是 Laravel 应用程序的一部分,而是运行在服务器上的一个单独的应用程序?如果是这样,我怎样才能“让它飞”而不取消它?在我从终端启动脚本的那一刻,一切都很好,直到我决定发出另一个命令..
  • 您可以将命令 nohup 与 & "nohup php path_to_script.php &" 一起使用。 & - 使其成为后台,nohup - 防止脚本执行在您关闭终端连接后停止。
  • 如果出于某种原因我想停止脚本,我该怎么做?
  • @BanujanBalendrakumar 这真是个糟糕的建议。 Laravel 完全有能力完成这类事情,并且在 Laravel 中完成这一切有主要的好处 - 你可以通过这样做获得它的缓存、数据库、队列、日志记录等所有内置功能。

标签: php laravel web-crawler


【解决方案1】:

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

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

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

每个新发现的 url 都可以被视为一个单独的任务并单独排队等待抓取,而不是在应用程序在线时“连续”运行该进程。

【讨论】:

  • 这是一个很棒的建议,但我对这里抛出的所有“术语”感到非常迷茫。 :D 你能给我指一个教程或类似于你刚才告诉我的东西吗?如果有任何帮助,我可以添加我在问题中创建的脚本,提前谢谢!!!
  • 我在 Laravel 的网站上包含了许多文档页面的链接,所以我建议从这些页面开始,并根据需要搜索不熟悉的术语。 Laracasts 也是很多与 Laravel 和一般编程相关的东西的好资源。我可以在 Stackoverflow 帖子中回答的范围显然是有限的,但本系列也包括其中一些概念:laracasts.com/series/laravel-from-scratch-2018
  • @Emmanuel-Ab 快速谷歌搜索还显示,甚至有许多可用于 Laravel 的爬虫包,以及涵盖为 Laravel 实现爬虫的博客文章。
  • 我看到了大部分的包裹,但我很迷茫。我能够在 PHP 中实现上述功能,这对我有用,但正如我之前所说,我需要使用 Laravel 项目来实现它。感谢您的链接,我会检查它们! :)
猜你喜欢
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 2014-11-08
  • 2018-07-14
  • 2020-09-02
  • 1970-01-01
相关资源
最近更新 更多