ddliu / spider
轻量级网页爬虫。
v0.2.9
2014-12-30 14:59 UTC
Requires
- ddliu/filecache: ~0.1
- ddliu/normurl: ~0.1.1
- ddliu/requery: ~0.1
- ddliu/wildcards: 0.1.*
- monolog/monolog: ~1.11
- symfony/css-selector: ~2.5
- symfony/dom-crawler: ~2.5
README
PHP的灵活爬虫。
概念
爬虫包含许多称为 pipes
的处理器,你可以向爬虫传递尽可能多的任务,每个任务都会通过这些 pipes
进行处理。
安装
composer require ddliu/spider
需求
- PHP5.3+
- curl(RequestPipe)
依赖
见 composer.json
。
用法
use ddliu\spider\Spider; use ddliu\spider\Pipe\NormalizeUrlPipe; use ddliu\spider\Pipe\RequestPipe; use ddliu\spider\Pipe\DomCrawlerPipe; (new Spider()) ->pipe(new NormalizeUrlPipe()) ->pipe(new RequestPipe()) ->pipe(new DomCrawlerPipe()) ->pipe(function($spider, $task) { $task['$dom']->filter('a')->each(function($a) use ($task) { $href = $a->attr('href'); $task->fork($href); }) }) // the entry task ->addTask('http://example.com') ->run() ->report();
在 examples
文件夹中查找更多示例。
Spider
Spider
类。
选项
- limit: 最大运行任务数
方法
pipe($pipe)
: 添加一个管道addTask($task)
: 添加一个任务run()
: 运行爬虫report()
: 将报告写入日志
任务
任务包含数据数组和一些辅助函数。
Task
类实现了 ArrayAccess
接口,因此你可以像数组一样访问数据。
方法
fork($task)
: 向爬虫添加子任务ignore()
: 忽略任务
管道
管道定义了每个任务如何被处理。
管道可以是一个函数
function($spider, $task) {}
或扩展 BasePipe
use ddliu\spider\Pipe\BasePipe; class MyPipe extends BasePipe { public function run($spider, $task) { // process the task... } }
有用的管道
NormalizeUrlPipe
标准化 $task['url']
。
new NormalizeUrlPipe()
RequestPipe
使用 $task['url']
启动一个 HTTP 请求,并将结果保存到 $task['content']
。
new RequestPipe(array( 'useragent' => 'myspider', 'timeout' => 10 ));
FileCachePipe
缓存一个管道(例如 RequestPipe
)。
$requestPipe = new RequestPipe(); $cacheForReqPipe = new FileCachePipe($requestPipe, [ 'input' => 'url', 'output' => 'content', 'root' => '/path/to/cache/root', ]);
RetryPipe
失败时重试。
$requestPipe = new RequestPipe(); $retryForReqPipe = new RetryPipe($requestPipe, [ 'count' => 10, ]);
DomCrawlerPipe
从 $task['content']
创建一个 DomCrawler。在后续管道中使用 $task['$dom']
访问。
ReportPipe
每10分钟报告一次。
new ReportPipe(array( 'seconds' => 600 ))
日志记录
$spider->logger
是 Monolog\Logger
的一个实例。在开始之前可以向其中添加日志处理器。
use Monolog\Handler\StreamHandler;
$spider->logger->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
待办事项/想法
- 现实世界的示例。
- 并发运行任务。(使用 pthread?)
替代
使用 golang 版本 以获得更好的性能!