mkocztorz / data-scraper
处理base64编码的图像数据
Requires
- php: >=5.3.3
- symfony/css-selector: ~2
- symfony/dom-crawler: ~2.1
Requires (Dev)
- phpunit/phpunit: ~4
This package is not auto-updated.
Last update: 2024-09-27 00:03:39 UTC
README
安装
使用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。
您可以认为使用数据抓取器是两步工作
-
创建一个公式,描述HTML中数据的来源以及应使用的方法(例如,它是元素的文本还是属性)。
-
将第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
)
)
)
)