mkocztorz/data-scraper

处理base64编码的图像数据

1.0.0-alpha1 2015-02-23 13:00 UTC

This package is not auto-updated.

Last update: 2024-09-27 00:03:39 UTC


README

SensioLabsInsight Build Status

安装

使用composer安装

composer require mkocztorz/data-scraper

当前最低稳定性为alpha。

这是什么?

数据抓取器基于优秀的Symfony DomCrawler组件。Symfony\Component\DomCrawler\Crawler是数据抓取器的输入。

数据抓取器专注于从加载到Crawler对象的HTML中提取数据。通过选择DOM元素(s)和对其应用适当的提取方法来完成提取。CSS选择器和提取方法是可扩展的 - 如果需要,您可以添加自己的扩展。

数据抓取器允许提取单个值或值数组。它允许在一扫中抓取一组复杂的数据。结果可以是值、数组(项目列表)甚至是嵌套的数据结构。

它不是什么。

它不是一个网络爬虫 - 它不执行任何网络请求 - 这取决于您。它不关心HTML的来源。

通过示例学习

对于那些想立即开始的人,请访问这个教程或查看底部的示例。

使用数据抓取器

数据抓取器的主要入口点是\Mkocztorz\DataScraper\Extractor\ExtractorBase。这是一个服务类,其中注册并使用了提取方法。但您更有可能使用\Mkocztorz\DataScraper\Std\Extractor,它默认注册了所有标准提取方法。

还有一个\Mkocztorz\DataScraper\Html\SelectorProviderBase,它有助于注册和使用选择器。还有一个可用的版本\Mkocztorz\DataScraper\Std\SelectorProvider,它注册了默认的CSS选择器。在大多数情况下,当与数据抓取器一起工作时,选择器提供者和选择器对象将透明地呈现给您。Std Extractor默认使用Std SelectorProvider。

您可以认为使用数据抓取器是两步工作

  1. 创建一个公式,描述HTML中数据的来源以及应使用的方法(例如,它是元素的文本还是属性)。

  2. 将第1步中创建的公式应用于HTML。

您不需要为每个想要抓取的HTML创建公式。例如,如果您想抓取分页的项目列表或用户资料,那么您只需要创建一次公式,然后将其应用于每个结果的页面或用户资料。

内置方法

提取方法

默认提取方法位于\Mkocztorz\DataScraper\Extractor\Method命名空间中。以下示例假设首先创建Extractor服务

use Mkocztorz\DataScraper\Std\Extractor;
$extractor = new Extractor();

以下示例显示过程的第1步:创建公式。当您想要提取数据时,您需要具有加载了HTML的Crawler并调用

$data = $extractor->extract($crawler); //step 2 - the actual scraping

元素的文本

类:ExtractElementText

注册为:text

提取器方法:getText

参数:无

用法

$extractor->getText('#title');

将获取id为"title"的元素的文本。

注意:它将使用css选择器找到的第一个元素。

如果元素未找到:返回空字符串。

元素的文本与模式

类:ExtractElementTextPattern

注册为:textPattern

提取器方法:getTextPattern

参数:['pattern'=>包含?P命名子模式的模式]

用法

$extractor->getTextPattern('#title', ['pattern'=>'/UID-(?P<value>\d+)/']);

将获取与模式匹配的id为"title"的元素的值。

注意:它将使用css选择器找到的第一个元素。

注意:模式必须具有命名子模式 ?P。

如果找不到元素或模式匹配无内容:则返回空字符串。

元素的属性值

类:ExtractAttribute

注册为:attribute

提取方法:getAttribute

参数:['attr'=>属性名]

用法

$extractor->getAttribute('#title', ['attr'=>'age']);

将:从具有标题 ID 的元素中获取 age 属性值。

注意:它将使用css选择器找到的第一个元素。

如果找不到元素或属性:则返回空字符串。

带模式的元素的属性值

类:ExtractAttributePattern

注册为:attributePattern

提取方法:getAttributePattern

参数:['attr'=>属性名, 'pattern'=>包含 ?P 命名子模式的模式]

用法

$extractor->getAttributePattern('#title', ['attr'=>'id', 'pattern'=>'/user-(?P<value>\d+)/']);

将:从具有标题 ID 的元素中获取匹配模式的值。

注意:它将使用css选择器找到的第一个元素。

如果找不到元素或属性或模式匹配无内容:则返回空字符串。

元素列表

注意:此提取方法与之前的不同

类:ExtractList

注册为:list

提取方法:getList

参数:键值对数组。每个值必须是另一个提取方法。键将用作结果项中的键。

此提取方法与之前的不同。它旨在从列表中抓取数据。ExtractList 本身并不实际抓取任何数据,但它使用每个通过选择器找到的元素的提取方法来抓取数据。把它想作是一种 foreach 控制结构。重要 ExtractList 使用的每个提取方法都会获得一个包含由 ExtractorList 选择器找到的唯一元素的爬虫(可以将其视为一种命名空间)。结果是,子 ExtractMethod 选择器只会应用于该元素。

用法

$extractor->getList('ul li', [
    'name' => $extractor->getText('h1'),    // actually selecting: "ul li h1"
    'age'  => $extractor->getText('p'),     // actually selecting: "ul li p"
    'id'   => $extractor->getAttribute('', ['attr'=>'id']), // actually selecting "ul li", assuming that each li will have id attribute
]);

将:通过 "ul li" 选择器找到的每个列表项传递给每个提取方法,然后提取方法将执行其工作。示例结果可能如下所示

[
    [
        'name'  => 'John',
        'age'   => '15',
        'id'    => 'user-345',
    ],
    [
        'name'  => 'Alice',
        'age'   => '37',
        'id'    => 'user-33',
    ]
]

注意:在参数中,您可以使用 再次 $extract->getList(..)!

如果列表为空:则不执行任何子提取方法,结果为空数组。

内部结构

它是如何工作的以及如何扩展以满足您的需求。

更多文档即将推出。

示例

use Mkocztorz\DataScraper\Std\Extractor;
use Symfony\Component\DomCrawler\Crawler;

$crawler = new Crawler();
$crawler->addHtmlContent(file_get_contents('Tests/Resources/PlainHtml/test1.html'));

$extractor = new Extractor(); //a service

// creating the scraping pattern - what and how you want to scrape
$res = $extractor->getList('ul li', [       // select all li elements and in each of them:
    'name' => $extractor->getText('h1'),    // find first h1 and take its content
    'position' => $extractor->getText('p'), // find first p and take its content
                                    // find first h1 and take its age attribute
    'age' => $extractor->getAttribute('h1', ['attr'=>'age']),
                                    // find a list of elements that have .exp class and in each of them
    'experience' => $extractor->getList('.experience .exp', [
        'exp' => $extractor->getText()      // get the contents of top level element (.exp)
    ]),
])->extract($crawler); // extract the actual data by applying the pattern to html
// you may extract data from multiple Crawlers with one pattern (e.g. paginated resource)

结果

Array
(
    [0] => Array
        (
            [name] => John Doe
            [position] => expert
            [age] => 23
            [experience] => Array
                (
                    [0] => Array
                        (
                            [exp] => exp 1
                        )

                    [1] => Array
                        (
                            [exp] => exp 2
                        )

                    [2] => Array
                        (
                            [exp] => exp 3
                        )

                    [3] => Array
                        (
                            [exp] => exp 4
                        )

                )

        )

    [1] => Array
        (
            [name] => Jane Doe
            [position] => client
            [age] =>
            [experience] => Array
                (
                    [0] => Array
                        (
                            [exp] => AAA
                        )

                    [1] => Array
                        (
                            [exp] => BBB
                        )

                )

        )

)

许可证 MIT