sobak / scrawler
Scrawler 是一个可扩展的声明式网络爬虫和抓取器
Requires
- php: >=7.2.0
- ext-curl: *
- ext-json: *
- bopoda/robots-txt-parser: ^2.3
- guzzlehttp/guzzle: ^6.3
- psr/log: ^1.1
- symfony/console: ^4.2
- symfony/css-selector: ^4.2
- symfony/dom-crawler: ^4.2
Requires (Dev)
- doctrine/orm: ^2.6
- league/csv: ^9.2
- phpstan/phpstan: ^0.11.5
- phpunit/phpunit: ^8.0
- symfony/process: ^4.2
- symfony/var-dumper: ^4.2
Suggests
- doctrine/orm: Required to use DatabaseResultWriter
- league/csv: Required to use CsvFileResultWriter
This package is auto-updated.
Last update: 2024-09-09 14:50:24 UTC
README
Scrawler 是一个声明式、可脚本化的网络爬虫(爬虫)和抓取器,你可以轻松配置它来解析任何网站并将信息处理成所需的格式。
配置基于构建 块,你可以提供自己的实现,允许进一步自定义过程。
安装
像往常一样,首先使用 Composer 安装库
composer require sobak/scrawler
使用
<?php use App\PostEntity; use Sobak\Scrawler\Block\Matcher\CssSelectorHtmlMatcher; use Sobak\Scrawler\Block\Matcher\CssSelectorListMatcher; use Sobak\Scrawler\Block\ResultWriter\FilenameProvider\EntityPropertyFilenameProvider; use Sobak\Scrawler\Block\ResultWriter\JsonFileResultWriter; use Sobak\Scrawler\Block\UrlListProvider\ArgumentAdvancerUrlListProvider; use Sobak\Scrawler\Configuration\Configuration; use Sobak\Scrawler\Configuration\ObjectConfiguration; require 'vendor/autoload.php'; $scrawler = new Configuration(); $scrawler ->setOperationName('Sobakowy Blog') ->setBaseUrl('http://sobak.pl') ->addUrlListProvider(new ArgumentAdvancerUrlListProvider('/page/%u', 2)) ->addObjectDefinition('post', new CssSelectorListMatcher('article.hentry'), function (ObjectConfiguration $object) { $object ->addFieldDefinition('date', new CssSelectorHtmlMatcher('time.entry-date')) ->addFieldDefinition('content', new CssSelectorHtmlMatcher('div.entry-content')) ->addFieldDefinition('title', new CssSelectorHtmlMatcher('h1.entry-title a')) ->addEntityMapping(PostEntity::class) ->addResultWriter(PostEntity::class, new JsonFileResultWriter([ 'directory' => 'posts/', 'filename' => new EntityPropertyFilenameProvider([ 'property' => 'slug', ]), ])) ; }) ; return $scrawler;
保存配置文件(可能作为 config.php)后,你只需要执行此命令
php vendor/bin/scrawler crawl config.php
上面的示例将获取 http://sobak.pl 页面,然后它将迭代所有现有帖子页面(限制为第一个 404 发生),从第 2 页开始,获取每个页面上的所有帖子,将它们映射到 App\PostEntity 对象,并最终将结果写入以帖子短网址为文件名的单个 JSON 文件。
正如你所看到的,这段代码中有一半以上是导入,你可以轻松地完成一项繁琐的任务,否则你需要安装几个库,定义规则,提供正确的映射来写入文件... Scrawler 为你做了这一切!
注意:Scrawler 不旨在执行客户端代码,这是设计决定的。这完全可行(看看无头 Chrome 或甚至 phantom.js 如果你喜欢历史),但我认为它超出了这个项目的范围,并且我对开发它没有兴趣。感谢理解。
文档
有关详细文档,请参阅下面的目录。
如果你已经熟悉 Scrawler 的基本概念,你可能主要对 "块" 章节感兴趣。在 Scrawler 中,块 是一个抽象的、可替换的逻辑块,定义了爬取、抓取或结果处理操作,你可以使用许多内置类之一或你自己的定制实现来自定义它。查看上面的示例,你可以为 UrlListProvider 或 ResultWriter(仅作为许多可用的块类型的示例)提供自定义逻辑。
注意:我必须承认我不是 DocBlocks 过度使用的粉丝。这就是为什么代码中的文档很少,主要关注接口,特别是用于创建块自定义实现的接口。使用上述链接的文档,并显然阅读代码。
请保持礼貌
在你开始玩弄库之前,请记住:有些人不希望他们的网站被爬虫抓取。随着越来越多的带宽被爬虫造成,这可能会不仅从业务角度考虑是问题,而且处理所有这些流量可能也很昂贵。请尊重这一点。即使 Scrawler 提供了一些可能对模拟实际互联网用户有用的块实现,你不应该使用它们来绕过一些网站所有者采取的反抓取措施。
注意:为了测试目的,你可以自由地爬取 我的网站,不包括其子域名。只是请留下默认的用户代理。
许可
Scrawler 在 MIT 许可下分发。有关详细信息,请参阅专门的 LICENSE 文件。
贡献
有关如何贡献的详细信息,请查阅专门的贡献指南文件。