vdb / php-spider
一个可配置和可扩展的PHP网络爬虫
Requires
- php: >=8.0
- ext-dom: *
- ext-pcntl: *
- guzzlehttp/guzzle: ^6.0.0||^7.0.0
- pdepend/pdepend: ^2.16.1
- phan/phan: ^4.0||^5.0
- spatie/robots-txt: ^2.0
- symfony/css-selector: ^3.0.0||^4.0.0||^5.0.0||^6.0||^7.0
- symfony/dom-crawler: ^3.0.0||^4.0.0||^5.0.0||^6.0||^7.0
- symfony/event-dispatcher: ^4.0.0||^5.0.0||^6.0||^7.0
- symfony/finder: ^3.0.0||^4.0.0||^5.0.0||^6.0||^7.0
- vdb/uri: ^0.3.2
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.16.0
- phpmd/phpmd: ^2.0.0
- phpunit/phpunit: ^9.0.0
- sebastian/phpcpd: ^6.0.0
- squizlabs/php_codesniffer: ^3.0.0
README
PHP-Spider特性
- 支持两种遍历算法:广度优先和深度优先
- 支持限制爬取深度、队列大小和最大下载次数
- 支持基于XPath、CSS选择器或纯PHP添加自定义URI发现逻辑
- 提供一组有用的URI过滤器,如robots.txt和域名限制
- 支持自定义URI过滤器,包括预取(URI)和后取(资源内容)
- 支持自定义请求处理逻辑
- 支持Basic、Digest和NTLM HTTP身份验证。请参见示例。
- 提供一组有用的持久性处理器(内存、文件)
- 支持自定义持久性处理器
- 收集爬取统计信息以供报告
- 分发有用的事件,允许开发人员添加更多自定义行为
- 支持礼貌策略
此爬虫不支持JavaScript。
安装
安装PHP-Spider最简单的方法是使用composer。在Packagist上找到它。
$ composer require vdb/php-spider
用法
这是一个非常简单的示例。此代码可以在example/example_simple.php中找到。有关带有一些日志记录、缓存和过滤器的更完整示例,请参阅example/example_complex.php。该文件包含一个更真实世界的示例。
请注意,默认情况下,当爬虫遇到4XX或5XX错误响应时,会停止处理。要设置爬虫继续处理,请参阅链接检查示例。它使用自定义请求处理器,配置默认的Guzzle请求处理器,以便在4XX和5XX响应上不失败。
首先创建爬虫
$spider = new Spider('http://www.dmoz.org');
添加URI发现器。没有它,爬虫将不会执行任何操作。在这种情况下,我们希望从某个
$spider->getDiscovererSet()->set(new XPathExpressionDiscoverer("//div[@id='catalogs']//a"));
为此示例设置一些合理的选项。在这种情况下,我们只从起始页面获取前10个条目。
$spider->getDiscovererSet()->maxDepth = 1; $spider->getQueueManager()->maxQueueSize = 10;
添加一个监听器以收集爬虫和队列管理器的统计信息。还有更多可以用于派发事件的组件。
$statsHandler = new StatsHandler(); $spider->getQueueManager()->getDispatcher()->addSubscriber($statsHandler); $spider->getDispatcher()->addSubscriber($statsHandler);
执行爬取
$spider->crawl();
爬取完成后,我们可以获得一些关于爬取的信息
echo "\n ENQUEUED: " . count($statsHandler->getQueued()); echo "\n SKIPPED: " . count($statsHandler->getFiltered()); echo "\n FAILED: " . count($statsHandler->getFailed()); echo "\n PERSISTED: " . count($statsHandler->getPersisted());
最后,我们可以对下载的资源进行一些处理。在这个例子中,我们将输出所有资源的标题
echo "\n\nDOWNLOADED RESOURCES: "; foreach ($spider->getDownloader()->getPersistenceHandler() as $resource) { echo "\n - " . $resource->getCrawler()->filterXpath('//title')->text(); }
贡献
贡献PHP-Spider就像在Github上Fork存储库并提交一个Pull Request一样简单。Symfony文档包含一个优秀的指南,说明如何正确地这样做:[提交补丁](https://symfony.ac.cn/doc/current/contributing/code/patches.html#step-1-setup-your-environment)。
有一些要求必须满足才能接受Pull Request。
- 遵循编码标准:PHP-Spider 遵循以下编码标准指南:PSR-0(《PSR-0》)、PSR-1(《PSR-1》)和 PSR-2(《PSR-2》);
- 通过单元测试证明代码能够正常工作,并保持代码覆盖率100%;
注意:检查您的代码是否符合 PHP-Spider 的标准,可以通过运行本仓库中的脚本
bin/static-analysis
来实现。这将运行以下工具,并针对 PHP-Spider 进行配置:PHP CodeSniffer、PHP Mess Detector 和 PHP Copy/Paste Detector。
注意:为了使用 PHPUnit 并实现覆盖率检查,确保覆盖率等于100%,可以运行
bin/coverage-enforce
。
支持
对于报告错误和请求新功能等问题,最佳做法是在 GitHub 上创建一个 问题,并最好附上一个 Pull Request。:-)
许可证
PHP-Spider 使用 MIT 许可证。