ddliu/spider

轻量级网页爬虫。

v0.2.9 2014-12-30 14:59 UTC

This package is auto-updated.

Last update: 2024-09-13 22:50:59 UTC


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->loggerMonolog\Logger 的一个实例。在开始之前可以向其中添加日志处理器。

use Monolog\Handler\StreamHandler;

$spider->logger->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));

待办事项/想法

  • 现实世界的示例。
  • 并发运行任务。(使用 pthread?)

替代

使用 golang 版本 以获得更好的性能!