rodrigoaramburu / scraphp
Web数据抓取库
Requires
- guzzlehttp/guzzle: ^7.8
- monolog/monolog: ^3.5
- php-webdriver/webdriver: ^1.15
- symfony/css-selector: ^6.3
- symfony/dom-crawler: ^6.3
Requires (Dev)
- mockery/mockery: ^1.6
- pestphp/pest: ^2.24
This package is auto-updated.
Last update: 2024-09-24 02:27:29 UTC
README
ScraPHP
ScraPHP 是一个用 PHP 开发的工具,旨在简化从网页上抓取数据(web scraping)的过程。通过使用 CSS 选择器,ScraPHP 简化了抓取过程,并允许将数据保存为 JSON、CSV 或直接保存到数据库等格式。
默认情况下,ScraPHP 使用组件 Guzzle 来执行对网页的请求。然而,它也支持使用初始阶段的 WebDriver Selenium(chrome),允许访问通过 JavaScript 加载内容的页面。
安装
composer require rodrigoaramburu/scraphp
快速说明
为了简化使用,我们使用 go
方法来访问一个网页地址,提供 URL 和一个用于处理页面返回值的闭包函数。在闭包内,我们有权访问 Page
对象,该对象提供 filterCSS
和 filterCSSEach
等方法,使用 CSS 选择器从页面中提取信息。一旦获取到所需的信息,我们可以使用 Writer
对象来存储这些信息。
我们可以在创建 ScraPHP
对象时配置 Writer
,通过 withJsonWriter
方法以 JSON 格式保存,withCSVWriter
方法以 CSV 格式保存,以及 withDatabaseWriter
方法将数据写入数据库(需要提供一个包含连接和表名的 PDO
对象)。
$scraphp = ScraPHP::build()
->withJsonWriter('posts-botecodigital.json')
->create();
$scraphp->go('https://www.botecodigital.dev.br/', function(Page $page){
$page->filterCSSEach('.post-chamada', function(FilteredElement $element){
$link = $element->filterCSS('h1 a')->link()->uri();
if( !$this->writer()->exists(['link' => $link]) )
{
$this->logger()->info('Writing: ' . $link);
$chamada = $element->filterCSS('h1 a')->text();
$link = $element->filterCSS('h1 a')->link()->uri();
$autor = $element->filterCSS('.author')->text();
$imageSource = $element->filterCSS('img')->image()->source();
$imagemPath = $this->saveAsset($imageSource, 'imgs/');
$this->writer()->write( compact('chamada','link','autor','imageSource','imagemPath'));
}
});
});
filterCSS
方法接受一个 CSS 选择器并返回一个 FilteredElement
对象。该对象具有各种方法,可以用来获取元素的具体信息。例如,使用 text()
可以获取元素的文本,而 attr('nome-atributo')
可以返回一个属性的值。如果元素是一个 link,可以使用 link()->uri()
方法获取其 URL,或者在元素是图片的情况下,使用 image()->source()
获取图片的地址。
filterCSSEach
方法与 filterCSS
类似,不同之处在于它会对所有匹配提供的 CSS 选择器的元素进行迭代。每个元素随后作为 FilteredElement
对象传递给作为参数传递的函数,以便可以逐个处理。该方法返回一个包含所有由函数返回值的数组。
下载文件/图片同样简单,Page
对象有一个 saveAsset()
方法,它接受要下载的地址和文件的目标目录。
在 ScraPHP 中执行下载文件或图片同样简单。对象 Page
提供了一个名为 saveAsset()
的方法,该方法接收所需文件的地址和存储文件的目录。
执行 Selenium
要使用 WebDriver Selenium Chrome 进行请求,首先需要启动 web driver,在这种情况下,我们可以像使用 docker 一样轻松地做到这一点。
docker run --rm --net=host --shm-size="2g" selenium/standalone-chrome:latest
然后,当创建 ScraPHP 时,我们使用 withWebDriver()
方法来让它使用 Client Web Driver 而不是默认的 Guzzle。
$scrap = ScraPHP::build()
->withWebDriver()
->create();