nadar/crawler

高度可扩展、无依赖的 HTML、PDF 或其他类型文档的爬虫。

维护者

详细信息

github.com/nadar/crawler

源代码

问题

资助包维护!
nadar

1.7.1 2022-04-05 09:52 UTC

This package is auto-updated.

Last update: 2024-08-29 11:07:43 UTC


README

Tests Test Coverage Maintainability Packagist Downloads

高度可扩展、无依赖的 HTML、PDF 或其他类型文档的爬虫。

为什么还需要另一个网页爬虫? 的确,已经有非常好的爬虫存在,因此我的目标是...

  • 无依赖 - 我们不希望使用任何 HTTP 客户端,尽可能多地使用“原生”PHP 代码以保持开销小。只需要 CURL 扩展。
  • 内存高效 - 尽可能内存高效,更少的开销,全代码控制。
  • 可扩展 - 附加您自己的解析器以确定如何解析 html 或任何其他格式。HTML 和 PDF 有开箱即用的解析器。构建您自己的数据类型解析器非常简单。
  • 运行时存储 - 当爬虫运行时,必须存储某些信息。这可以扩展以满足您的用例。您可以使用数据库或内置的数组或文件存储系统。
  • 异步 - 可以将爬虫作为异步进程启动,例如使用 PHP 队列系统,如 Yii2 Queue

安装

需要Composer来安装此库

composer require nadar/crawler

为了使用 PDF 解析器,必须安装可选库 smalot/pdfparser

smalot/pdfparser

使用

  1. 首先,我们需要为爬虫提供有关从爬虫运行的结果中应该做什么的信息

创建您的处理程序,这些是交互式与爬虫存储您的内容/结果的类。afterRun() 方法将在爬取任何 URL 并包含结果时运行

class MyCrawlHandler implements \Nadar\Crawler\Interfaces\HandlerInterface
{
    public function afterRun(\Nadar\Crawler\Result $result)
    {
        echo $result->title . " with content " . $result->content . " for url " . $result->url->getNormalized();
    }
    
    public function onSetup(Crawler $crawler)
    {
        // do some stuff before the crawler runs, maybe truncate your temporary table where the results should be stored.
    }
    
    public function onEnd(Crawler $crawler)
    {
        // runs when the crawler is finished, maybe synchronize your temporary index table with the "real" site index.
    }

}
  1. 然后附加处理程序并设置爬虫所需的所有信息
$crawler = new Crawler('https://luya.io', new ArrayStorage, new LoopRunner);

// what kind of document types would you like to parse?
$crawler->addParser(new Nadar\Crawler\Parsers\Html);

// adding will increases memory consumption
// $crawler->addParser(new Nadar\Crawler\Parsers\Pdf);

// register your handler in order to interact with the results, maybe store them in a database?
$crawler->addHandler(new MyCrawlHandler);

// setup and start the crawl process
$crawler->setup();
$crawler->run();

注意:启用 PDF 解析器并具有多个并发请求时,这可能会显着增加内存使用量(特别是如果有大型的 PDF 文件!)。因此,建议在启用 PDF 解析器时降低并发值!

基准测试

当然,这些基准测试可能因网络连接、带宽、服务器而异,但我们是在相同的环境下进行的所有测试。当使用 PDF 解析器时,内存峰值变化很大,因此我们只使用 HTML 解析器进行测试

仍在寻找一个好的网站用于基准测试。有关测试设置的详细信息,请参阅 benchmark.php 文件。

开发者信息

为了更好地理解,以下是关于类如何封装及其用途的说明。

  • 爬虫:爬虫是主要程序,它启动、运行和结束。
  • 任务:任务包含下一个“CURL)/下载任务的 URL 逻辑
  • 解析器:解析器将结合任务信息和请求/响应以生成解析器结果
  • 解析器结果:任务结果表示解析器的结果
  • 队列项:队列项是从任务中提取的,仅用于使用 StorageInterface 存储这些信息

生命周期

爬虫 -> 任务 -> (ItemQueue -> 存储) -> 请求/响应 -> 解析器 -> 解析器结果 -> 结果