Web数据抓取库

0.2.2 2024-01-24 00:08 UTC

This package is auto-updated.

Last update: 2024-09-24 02:27:29 UTC


README

example workflow

ScraPHP

ScraPHP 是一个用 PHP 开发的工具,旨在简化从网页上抓取数据(web scraping)的过程。通过使用 CSS 选择器,ScraPHP 简化了抓取过程,并允许将数据保存为 JSONCSV 或直接保存到数据库等格式。

默认情况下,ScraPHP 使用组件 Guzzle 来执行对网页的请求。然而,它也支持使用初始阶段的 WebDriver Seleniumchrome),允许访问通过 JavaScript 加载内容的页面。

安装

composer require rodrigoaramburu/scraphp

快速说明

为了简化使用,我们使用 go 方法来访问一个网页地址,提供 URL 和一个用于处理页面返回值的闭包函数。在闭包内,我们有权访问 Page 对象,该对象提供 filterCSSfilterCSSEach 等方法,使用 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();