nadar / crawler
高度可扩展、无依赖的 HTML、PDF 或其他类型文档的爬虫。
1.7.1
2022-04-05 09:52 UTC
Requires
- ext-curl: *
Requires (Dev)
- phpunit/phpunit: ^8.0
- smalot/pdfparser: ^2.1
Suggests
- smalot/pdfparser: In order to use the PdfParser the smalot/pdfparser library is required.
README
高度可扩展、无依赖的 HTML、PDF 或其他类型文档的爬虫。
为什么还需要另一个网页爬虫? 的确,已经有非常好的爬虫存在,因此我的目标是...
- 无依赖 - 我们不希望使用任何 HTTP 客户端,尽可能多地使用“原生”PHP 代码以保持开销小。只需要 CURL 扩展。
- 内存高效 - 尽可能内存高效,更少的开销,全代码控制。
- 可扩展 - 附加您自己的解析器以确定如何解析 html 或任何其他格式。HTML 和 PDF 有开箱即用的解析器。构建您自己的数据类型解析器非常简单。
- 运行时存储 - 当爬虫运行时,必须存储某些信息。这可以扩展以满足您的用例。您可以使用数据库或内置的数组或文件存储系统。
- 异步 - 可以将爬虫作为异步进程启动,例如使用 PHP 队列系统,如 Yii2 Queue。
安装
需要Composer来安装此库
composer require nadar/crawler
为了使用 PDF 解析器,必须安装可选库 smalot/pdfparser
smalot/pdfparser
使用
- 首先,我们需要为爬虫提供有关从爬虫运行的结果中应该做什么的信息
创建您的处理程序,这些是交互式与爬虫存储您的内容/结果的类。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. } }
- 然后附加处理程序并设置爬虫所需的所有信息
$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 -> 存储) -> 请求/响应 -> 解析器 -> 解析器结果 -> 结果