sobak/scrawler

Scrawler 是一个可扩展的声明式网络爬虫和抓取器

v0.3.0 2019-05-19 07:17 UTC

This package is auto-updated.

Last update: 2024-09-09 14:50:24 UTC


README

Packagist Travis build Test Coverage

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 中, 是一个抽象的、可替换的逻辑块,定义了爬取、抓取或结果处理操作,你可以使用许多内置类之一或你自己的定制实现来自定义它。查看上面的示例,你可以为 UrlListProviderResultWriter(仅作为许多可用的块类型的示例)提供自定义逻辑。

注意:我必须承认我不是 DocBlocks 过度使用的粉丝。这就是为什么代码中的文档很少,主要关注接口,特别是用于创建块自定义实现的接口。使用上述链接的文档,并显然阅读代码。

请保持礼貌

在你开始玩弄库之前,请记住:有些人不希望他们的网站被爬虫抓取。随着越来越多的带宽被爬虫造成,这可能会不仅从业务角度考虑是问题,而且处理所有这些流量可能也很昂贵。请尊重这一点。即使 Scrawler 提供了一些可能对模拟实际互联网用户有用的块实现,你不应该使用它们来绕过一些网站所有者采取的反抓取措施。

注意:为了测试目的,你可以自由地爬取 我的网站不包括其子域名。只是请留下默认的用户代理。

许可

Scrawler 在 MIT 许可下分发。有关详细信息,请参阅专门的 LICENSE 文件。

贡献

有关如何贡献的详细信息,请查阅专门的贡献指南文件。